iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
AI & Data

用Python程式進行股票技術分析系列 第 23

Day23 其他的技術指標(2)

  • 分享至 

  • xImage
  •  

OBV能量潮指標

On Balance Volume指標簡稱為OBV指標,其理論基礎為量是價的先行指標;因此也有稱之為OBV人氣指標,是一種依據行情的漲跌,來累計或刪去市場的成交量值,而以此累算值作為市場行情動能變化趨勢的指標。
另外,OBV指標也有背離現象:

  • 高檔背離為股價創新高,但OBV指標沒有創新高
  • OBV指標只有多頭的背離,沒有空頭的背離
  • OBV指標的背離現象在高檔爆量時候會有一些誤判的情形發生

程式實作:繪製與計算能量潮指標

在看盤軟體新增OBV指標於副圖後將該頁面匯出成Excel檔案,然後透過pandas套件讀取Excel檔後存進DataFrame資料結構。程式碼如下所示:

##### 使用2013年11月20日到2014年2月17日之日線圖資料 #####

# 載入從「好神通PLUS」輸出的Excel檔
df = pd.read_excel('Day23(1).xlsx')

# 保存K線的基本資訊(開、高、低、收、量)
df_k_line = df.drop(columns=['SMA5','SMA10','SMA20','SMA60','SMA120','SMA240','MA5','MA10','OBV'])

# 保存價的移動平均線
df_sma = df.drop(columns=['開盤價','最高價','最低價','收盤價','成交量','MA5','MA10','OBV'])

# 保存OBV指標
df_obv = df.drop(columns=['開盤價','最高價','最低價','收盤價','SMA5','SMA10','SMA20','SMA60','SMA120','SMA240','成交量','MA5','MA10'])

# 將K線的Columns的名稱由中文改為英文
df_k_line = df_k_line.rename(columns={'時間':'Date','開盤價':'Open','最高價':'High','最低價':'Low','收盤價':'Close','成交量':'Volume'})

# 將價的移動平均線的Columns的名稱由中文改為英文
df_sma = df_sma.rename(columns={'時間':'Date'})

# 將OBV指標的Columns的名稱由中文改為英文
df_obv = df_obv.rename(columns={'時間':'Date'})

# 將K線的Date設為Index
df_k_line.set_index(df_k_line['Date'],inplace=True)
df_k_line = df_k_line.drop(columns=['Date'])

# 將價的移動平均線的Date設為Index
df_sma.set_index(df_sma['Date'],inplace=True)
df_sma = df_sma.drop(columns=['Date'])

# 將OBV指標的Date設為Index
df_obv.set_index(df_obv['Date'],inplace=True)
df_obv = df_obv.drop(columns=['Date'])

再將OBV指標繪製於副圖上,程式碼如下所示:

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定移動平均線與OBV指標
added_plots={
    "SMA5": mpf.make_addplot(df_sma['SMA5'],width=0.4,color='xkcd:maroon'),
    "SMA10": mpf.make_addplot(df_sma['SMA10'],width=0.4,color='xkcd:cyan'),
    "SMA20": mpf.make_addplot(df_sma['SMA20'],width=0.4,color='xkcd:violet'),
    "SMA60": mpf.make_addplot(df_sma['SMA60'],width=0.4,color='xkcd:salmon'),
    "SMA120": mpf.make_addplot(df_sma['SMA120'],width=0.4,color='xkcd:blue grey'),
    "SMA240": mpf.make_addplot(df_sma['SMA240'],width=0.4,color='xkcd:sky blue'),
    'OBV': mpf.make_addplot(df_obv['OBV'],width=0.8,panel=1,color='xkcd:red')
            }

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()), datetime_format='%Y-%m-%d')
mpf.plot(df_k_line,**kwargs)

程式執行結果如下所示:
Imgur
當然也可以用talib套件來計算OBV指標,程式碼如下所示:

from talib.abstract import *

# 當使用talib Abstract API時,DataFrame欄位名稱需為小寫
# 請參考書籍:Python:量化交易 Ta-Lib 技術指標 139個活用技巧
df_k_line_talib = df_k_line.copy()
df_k_line_talib.columns=[ i.lower() for i in df_k_line_talib.columns]

talib_obv = OBV(df_k_line_talib)

之後將talib套件OBV函式計算結果繪製於副圖,如下圖所示:
Imgur
可以發現從看盤軟體中讀取OBV指標的數值與talib套件所算出來OBV指標的數值在趨勢上看起來相同但兩者在數值上則是完全相異,這是因為兩者的起始點不一樣所造成的(看盤軟體是從該檔股票上市∕上櫃時起算,而talib套件則是由價量資料區間的開頭起算);因此要著眼於趨勢,而不是數值。

乖離率指標

乖離率(英語:Bias Ratio, BIAS),代表當日股票收盤價和移動平均線的差距,以分析股價偏離的程度;當股價和移動平均線的差距愈遠時,乖離率愈大,代表股價即將有修正偏離的可能。當乖離率呈現過高或過低情況時,股價容易產生反轉的修正走勢;漲到正乖離時容易拉回、跌到負乖離時容易反彈;每一檔股票都不一樣且正負乖離不一定對稱。 乖離率沒有天天用,當緩漲、緩跌與盤整不用看;只有在急漲急跌的時候才需確認。乖離率適合做為賣的工具,而非買的工具;一般常用20日乖離。單獨使用乖離率會有買賣點不明確的缺點,僅能解釋成發生反轉的機會增加;尚需配合大量交易經驗和其他分析工具來作判斷。

程式實作:繪製與計算乖離率指標

在看盤軟體新增乖離率指標於副圖後將該頁面匯出成Excel檔案,然後透過pandas套件讀取Excel檔後存進DataFrame資料結構。程式碼如下所示:

##### 使用2014年8月26日到2018年9月14日之日線圖資料 #####

# 載入從「好神通PLUS」輸出的Excel檔
df = pd.read_excel('Day23(2).xlsx')

# 保存K線的基本資訊(開、高、低、收、量)
df_k_line = df.drop(columns=['SMA5','SMA10','SMA20','SMA60','SMA120','SMA240','MA5','MA10','乖離率20','乖離率20.1','乖離率20.2'])

# 保存價的移動平均線
df_sma = df.drop(columns=['開盤價','最高價','最低價','收盤價','成交量','MA5','MA10','乖離率20','乖離率20.1','乖離率20.2'])

# 保存乖離率指標
df_bias = df.drop(columns=['開盤價','最高價','最低價','收盤價','SMA5','SMA10','SMA20','SMA60','SMA120','SMA240','成交量','MA5','MA10','乖離率20.1','乖離率20.2'])
df_bias['乖離率20'] = df_bias['乖離率20'] * 100.0

# 將K線的Columns的名稱由中文改為英文
df_k_line = df_k_line.rename(columns={'時間':'Date','開盤價':'Open','最高價':'High','最低價':'Low','收盤價':'Close','成交量':'Volume'})

# 將價的移動平均線的Columns的名稱由中文改為英文
df_sma = df_sma.rename(columns={'時間':'Date'})

# 將乖離率指標的Columns的名稱由中文改為英文
df_bias = df_bias.rename(columns={'時間':'Date','乖離率20':'BIAS20'})

# 將K線的Date設為Index
df_k_line.set_index(df_k_line['Date'],inplace=True)
df_k_line = df_k_line.drop(columns=['Date'])

# 將價的移動平均線的Date設為Index
df_sma.set_index(df_sma['Date'],inplace=True)
df_sma = df_sma.drop(columns=['Date'])

# 將乖離率指標的Date設為Index
df_bias.set_index(df_bias['Date'],inplace=True)
df_bias = df_bias.drop(columns=['Date'])

再將乖離率指標繪製於副圖上,程式碼如下所示:

import warnings
warnings.filterwarnings( "ignore", module = "mplfinance\..*" )

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定移動平均線與乖離率指標
added_plots={
    "SMA5": mpf.make_addplot(df_sma['SMA5'],width=0.4,color='xkcd:maroon'),
    "SMA10": mpf.make_addplot(df_sma['SMA10'],width=0.4,color='xkcd:cyan'),
    "SMA20": mpf.make_addplot(df_sma['SMA20'],width=0.4,color='xkcd:violet'),
    "SMA60": mpf.make_addplot(df_sma['SMA60'],width=0.4,color='xkcd:salmon'),
    "SMA120": mpf.make_addplot(df_sma['SMA120'],width=0.4,color='xkcd:blue grey'),
    "SMA240": mpf.make_addplot(df_sma['SMA240'],width=0.4,color='xkcd:sky blue'),
    'BIAS': mpf.make_addplot(df_bias['BIAS20'],width=0.8,panel=1,secondary_y=False,color='xkcd:blue')
            }

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()), datetime_format='%Y-%m-%d')
mpf.plot(df_k_line,**kwargs)

程式執行結果如下所示:
Imgur
另外我不確定talib套件是否有支援乖離率計算的函式,但直接寫Python程式計算乖離率也不會很難。程式碼如下所示:

bias_20 = (df_k_line['Close'] - df_k_line['Close'].rolling(20, min_periods=1).mean())/ df_k_line['Close'].rolling(20, min_periods=1).mean()*100
bias_20 = round(bias_20,2)

之後將計算結果繪製於副圖,如下圖所示:
Imgur
如同使用DataFrame型態的rolling函式計算移動平均線(參考Day7內容)的情況,使用上述程式碼計算後的乖離率在前19天的數值也會與看盤軟體不同;兩者間數值比對之程式碼與執行結果請參考本日的完整程式碼。
完整的程式碼請參照「第二十三天:其他的技術指標(2).ipynb」。


上一篇
Day22 其他的技術指標(1)
下一篇
Day24 目標價估算
系列文
用Python程式進行股票技術分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言