量化投資常用技能 系列文章目錄
我們已經介紹了三篇關于量化投資方面繪圖的文章,大家有興趣可以了解一下
- 繪圖篇
- 量化投資常用技能——繪圖篇 1:繪制股票收盤價格曲線和ochl燭狀圖
- 量化投資常用技能——繪圖篇 2:繪制移動平均線
- 量化投資常用技能——繪圖篇3:繪制黃金分割線
量化投資常用技能——指標篇1
- 量化投資常用技能 系列文章目錄
- 前言
- 一、需要提前了解的知識點
- MA指標: Moving Average(移動平均線)
- EMA指標:Exponential Moving Average(指數移動平均值)
- 定義式
- 遞推式
- 雙指數(二重)EMA公式
- 二、MACD指標
- MACD指標的數學計算程序
- 代碼實作各數值的計算
- 繪制MACD指標:兩線一柱
- 完整的繪圖代碼
- 三、MACD指標的一般研判標準及代碼判斷
- 研判標準一:DIF和MACD的值及線的位置
- 研判標準二:DIF和MACD的交叉情況
- 研判標準三:MACD指標中的柱狀圖分析
- 歡迎大家關注我的GitHub
前言
由于這一部分主要是給大家介紹指標的數學公式和計算方法,更深入的了解它們,其中有眾多的數學公式和理論推導程序,我盡可能排版的工整,方便各位閱讀,如果只想看代碼實作可以跳到最后面“代碼實作”部分
之前的繪圖篇中,我們分三個篇章分別介紹如何繪制收盤價折線圖、燭狀圖、基于收盤價繪制移動平均線、黃金分割線,在接下來的指標篇中,我們將詳細介紹每個指標的計算方法以及演算法實作,并繪制出指標供各位投資者使用、參考,并提供該指標的一些研判標準,希望各位學有所成!
大家可以關注我的GitHub:ExileSaber
雖然現在還沒較高的水平,但是可以一起學習進步
一、需要提前了解的知識點
這一部分主要是為了讓初學者更容易了解MACD指標的構成原理,大家也可以先閱讀后面的MACD指標,如果發現有什么地方解釋的不清楚可以看一下這一塊有沒有說明,也可以在最后面的評論提問,博主看到了都會認真解答,
MA指標: Moving Average(移動平均線)
該指標的計算公式:
M A = ( C 1 + C 2 + . . . + C n ) / n MA = (C_1+C_2+...+C_n)/n MA=(C1?+C2?+...+Cn?)/n
其中C 為收盤價,n 為移動平均周期數,之前有介紹如何繪制移動平均線,可以查看我之前的文章:量化投資常用技能——繪圖篇 2:繪制移動平均線
補充一個概念:一般將3天、7天的平均線稱為短線,10天、30天的平均線稱為中線,150天、250天平均線稱為長線
EMA指標:Exponential Moving Average(指數移動平均值)
該指標的介紹來自于百度百科
定義式
這部分是講解EMA指標的推導程序,需要一定的數學功底,大家也可以跳過,直接看遞推式
- 對序列 { X n } \lbrace X_n \rbrace {Xn?} 定義其截至第 n 項的周期為N 的指數移動平均 E M A N ( x n ) EMA_N(x_n) EMAN?(xn?)為:
E M A N ( x n ) = 2 N + 1 ∑ k = 0 ∞ ( N ? 1 N + 1 ) k x n ? k EMA_N(x_n) = \frac{2}{N+1} \sum^\infty_{k=0}\bigg (\frac{N-1}{N+1}\bigg )^kx_{n-k} EMAN?(xn?)=N+12?k=0∑∞?(N+1N?1?)kxn?k?
由于在我們的序列 { X n } \lbrace X_n \rbrace {Xn?}中,沒有 X 1 X_1 X1?之前的資料,因此我們補充定義: X 0 = X ? 1 = X ? 2 = . . . = X 1 X_0=X_{-1}=X_{-2}=...=X_1 X0?=X?1?=X?2?=...=X1?
- 計算 E M A N ( x 1 ) EMA_N(x_1) EMAN?(x1?)的值,其中 x 1 ? k x_{1-k} x1?k?這一項我們可以全部替換為 x 1 x_1 x1?,因此公式變為:
E M A N ( x 1 ) = 2 N + 1 ∑ k = 0 ∞ [ ( N ? 1 N + 1 ) k x 1 ] EMA_N(x_1) = \frac{2}{N+1} \sum^\infty_{k=0}\bigg[\bigg (\frac{N-1}{N+1}\bigg )^kx_1\bigg] EMAN?(x1?)=N+12?k=0∑∞?[(N+1N?1?)kx1?]
- 可以發現中括號內是一個等比數列求和,因此根據等比數列求和公式知道:
其中 ( N ? 1 N + 1 ) ∞ (\frac{N-1}{N+1})^\infty (N+1N?1?)∞這一項由極限可知為0
∑ k = 0 ∞ [ ( N ? 1 N + 1 ) k x 1 ] = x 1 ( 1 ? ( N ? 1 N + 1 ) ∞ ) 1 ? N ? 1 N + 1 = x 1 2 N + 1 = ( N + 1 ) x 1 2 \sum^\infty_{k=0}\bigg[\bigg (\frac{N-1}{N+1}\bigg )^kx_1\bigg]=\frac{x_1\big(1-(\frac{N-1}{N+1})^\infty\big)}{1-\frac{N-1}{N+1}}=\frac{x_1}{\frac{2}{N+1}}=\frac{(N+1)x_1}{2} k=0∑∞?[(N+1N?1?)kx1?]=1?N+1N?1?x1?(1?(N+1N?1?)∞)?=N+12?x1??=2(N+1)x1??
綜上可知
E
M
A
N
(
x
1
)
=
x
1
EMA_N(x_1)=x_1
EMAN?(x1?)=x1?
通過上述推導程序,我們很容易發現一個特點,當
k
k
k越小、
x
n
?
k
x_{n-k}
xn?k?這一項的下標越大時,
x
n
?
k
x_{n-k}
xn?k?前的系數
(
N
?
1
N
+
1
)
k
\big(\frac{N-1}{N+1}\big)^k
(N+1N?1?)k越大,這說明當時間越靠近當前日期時(也就是
k
k
k越小、
n
?
k
n-k
n?k 越靠近
n
n
n時),
x
n
?
k
x_{n-k}
xn?k?的權重越大,也就是EMA函式對近期的價格加強了權重比,更能及時反映近期價格波動情況
移動平均線MA指標對時間段內每天的價格都是同等權重,延后性較高
遞推式
由EMA的定義式可以推匯出如下的遞推公式:
E
M
A
N
(
x
n
)
=
2
x
n
+
(
N
?
1
)
E
M
A
N
(
x
n
?
1
)
N
+
1
EMA_N(x_n) = \frac{2x_n + (N-1)EMA_N(x_{n-1})}{N+1}
EMAN?(xn?)=N+12xn?+(N?1)EMAN?(xn?1?)?
雙指數(二重)EMA公式
以下為其定義式,了解一下,MACD指標是從該指標上發展來的
對序列 { X n } \lbrace X_n \rbrace {Xn?} 的 N 周期 EMA 再取一個 M 周期 EMA,將得到
E M A M [ E M A N ( x n ) ] = ( M ? 1 ) E M A M ( x n ) ? ( N ? 1 ) E M A N ( x n ) M ? N EMA_M\big[EMA_N(x_n)\big] = \frac{(M-1)EMA_M(x_n)-(N-1)EMA_N(x_n)}{M-N} EMAM?[EMAN?(xn?)]=M?N(M?1)EMAM?(xn?)?(N?1)EMAN?(xn?)?
二、MACD指標
MACD指標,全稱Moving Average Convergence / Divergence(指數平滑移動平均線)
該指標包含三個部分:兩線一柱,快線稱DIF,慢線稱DEA,柱狀圖為MACD
MACD指標的數學計算程序
我們要獲得第n天的MACD,那么我們的數學計算程序如下
- 計算第 n n n天的 12日EMA(N=12) 和 26日EMA(N=26):
E M A 12 ( x n ) = 11 13 E M A 12 ( x n ? 1 ) + 2 13 x n EMA_{12}(x_n)=\frac{11}{13}EMA_{12}(x_{n-1})+\frac{2}{13}x_n EMA12?(xn?)=1311?EMA12?(xn?1?)+132?xn?
其中 x n x_n xn?表示第n天的價格, E M A 12 ( x n ? 1 ) EMA_{12}(x_{n-1}) EMA12?(xn?1?)表示前一天(第 n-1 天)的12日EMA
E M A 26 ( x n ) = 25 27 E M A 26 ( x n ? 1 ) + 2 27 x n EMA_{26}(x_n)=\frac{25}{27}EMA_{26}(x_{n-1})+\frac{2}{27}x_n EMA26?(xn?)=2725?EMA26?(xn?1?)+272?xn?
-
計算離差值 DIF:
第n日的DIF:
D I F n = E M A 12 ( x n ) ? E M A 26 ( x n ) DIF_n=EMA_{12}(x_n)-EMA_{26}(x_n) DIFn?=EMA12?(xn?)?EMA26?(xn?)
- 計算 DIF 的 9 日 EMA(該指標一般被稱為 DEA 或 DEM)
-
定義式:
- 第n天的DEA:
D
E
A
n
=
E
M
A
9
(
d
i
f
n
)
=
8
10
E
M
A
9
(
d
i
f
n
?
1
)
+
2
10
d
i
f
n
DEA_n=EMA_9(dif_n)=\frac{8}{10}EMA_9(dif_{n-1})+\frac{2}{10}dif_n
DEAn?=EMA9?(difn?)=108?EMA9?(difn?1?)+102?difn?
其中
d
i
f
n
dif_n
difn?表示第n天的DIF值
- 遞推式:
根據離差值計算其 9 日的EMA,即離差平均值,稱為第 n n n 日DEA
D E A n = 8 10 D E A ( x n ? 1 ) + 2 10 D I F ( x n ) DEA_n = \frac{8}{10}DEA(x_{n-1}) + \frac{2}{10}DIF({x_{n})} DEAn?=108?DEA(xn?1?)+102?DIF(xn?)
- 計算MACD柱狀圖
( D I F n ? D E A n ) × 2 (DIF_n-DEA_n)\times2 (DIFn??DEAn?)×2
計算得到的值即為柱狀圖的值
代碼實作各數值的計算
結合numpy庫計算MACD指標十分簡單,計算時使用遞推公式即可很方便的從第一個值得到之后各個時刻的值,得到MACD指標的兩線一柱只有一個需要實作的函式——EMA的計算函式
先加上部分庫的匯入,方便學習的程序可以直接運行
import abupy
import numpy as np
from abupy import ABuSymbolPd
# ———————————————————— #
# ———— 默認引數設定 ———— #
# ———————————————————— #
__colorup__ = "red"
__colordown__ = "green"
abupy.env.enable_example_env_ipython() # 使用沙盒資料,目的是和書中一樣的資料環境,不使用會報錯
tsla_df = ABuSymbolPd.make_kl_df('usTSLA', n_folds=2) # 固定匯入tsla的行情資料
tsla_df = tsla_df[:100] # 選取前100個,資料過多不易觀察
print(tsla_df[:10])
# ———————————————————— #
def EMA(data, window):
'''
計算EMA指標
:param data: 傳入的資料,需要為list、ndarray、series型別資料
:param window: 對應著計算的是幾日的EMA
:return: 回傳ndarray的資料型別
'''
list_ema = [] # 用于存盤計算得到的每個ema,也方便遞推公式的使用
list_ema.append(data[0])
for i in range(1, len(data)):
list_ema.append(2 * data[i] / (window+1) + (window-1) * list_ema[-1] / (window+1)) # 這部分是遞推公式的實作
return np.array(list_ema) # 最后轉換為ndarray的資料型別,方便之后的兩個ndarray的相減運算
有了計算EMA指標的函式后,我們就可以很方便的實作 E M A 12 EMA_{12} EMA12?, E M A 26 EMA_{26} EMA26? 、DIF指標、DIF指標的 E M A 9 EMA_9 EMA9? 以及MACD柱狀圖的值
ema_12 = EMA(data=tsla_df['close'], window=12) # 12日EMA的值
ema_26 = EMA(data=tsla_df['close'], window=26) # 26日EMA的值
dif = ema_12 - ema_26 # 利用ndarray之間的減法運算即為各對應元素相減,得到DIF
dea = EMA(data=dif, window=9) # 再計算DIF的9日EMA(該值被稱為DEA)
macd = (dif - dea) * 2 # 計算MACD柱狀圖的值
上面的兩塊代碼放在一起就組成了我們MACD指標的計算程序,接下來實作MACD指標的繪制
繪制MACD指標:兩線一柱
我們需要繪制的兩線一柱,其中MACD柱狀圖會有正負兩種情況,為了更好的區分正負情況,我們需要繪制兩次柱狀圖,其中一次用紅色繪制MACD值為正的情況,另外一次用綠色繪制MACD為負的情況,實作的函式如下:
def draw_macd(dif, dea, macd, axs=None, show=False):
'''
通過傳入DIF、DEA、MACD的值繪制MACD指標的兩線一柱
:param dif: DIF指標的list或者ndarray資料型別
:param dea: DEA指標的list或者ndarray資料型別
:param macd: 為了代碼簡潔,目前只支持ndarray型別的MACD資料
:param axs: 是否在子圖繪制
:param show: 是否繪圖
:return:
'''
x = np.arange(len(dif)) # 橫坐標
drawer = axs if axs is not None else plt
drawer.plot(x, dif, label='DIF', color='b', linestyle='--') # 繪制DIF曲線
drawer.plot(x, dea, label='DEA', color='y', linestyle='-.') # 繪制DEA曲線
pos_index = x[macd >= 0] # 得到MACD值大于等于0的索引
neg_index = x[macd < 0] # 得到MACD值小于0的索引
drawer.bar(pos_index, macd[pos_index], color='r', label='macd bar', alpha=0.6) # 繪制MACD大于等于0部分的柱狀圖
drawer.bar(neg_index, macd[neg_index], color='g', label='macd bar', alpha=0.6) # 繪制MACD小于0部分的柱狀圖
drawer.legend()
if show:
plt.show()
完整的繪圖代碼
為了繪圖全面,我們將“量化投資常用技能——繪圖篇 1:繪制股票收盤價格曲線和ochl燭狀圖”中繪制燭狀圖的函式 p l o t plot plot_ o c h l ochl ochl 黏貼到這一部分代碼中,即可完成多圖繪制,完整代碼如下
缺少的庫直接 pip install 安裝即可
import abupy
import numpy as np
from abupy import ABuSymbolPd, nd
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
import mpl_finance as mpf
# ———————————————————— #
# ———— 默認引數設定 ———— #
# ———————————————————— #
__colorup__ = "red"
__colordown__ = "green"
abupy.env.enable_example_env_ipython() # 使用沙盒資料,目的是和書中一樣的資料環境,不使用會報錯
tsla_df = ABuSymbolPd.make_kl_df('usTSLA', n_folds=2) # 固定匯入tsla的行情資料
tsla_df = tsla_df[:100] # 選取前100個,資料過多不易觀察
print(tsla_df[:10])
# ———————————————————— #
def plot_ochl(data_df=tsla_df, axs=None, show=False):
'''
繪制燭狀圖
:param data_df: 輸入的資料,默認采用tsla的歷史行情資料,輸入的資料型別目前只支持DataFrame型別
:param axs: 是否在子圖上繪制
:param show: 是否顯示影像
:return:
'''
drawer = plt if axs is None else axs
qutotes = []
for index, (d, o, c, h, l) in enumerate(
zip(data_df.index, data_df.open, data_df.close,
data_df.high, data_df.low)):
d = date2num(d) # 蠟燭圖的日期要使用matplotlib.finance.date2num進行轉換為特有的數字值
val = (d, o, c, h, l) # 日期,開盤,收盤,最高,最低組成tuple物件val
qutotes.append(val) # 加val加入qutotes
# 使用mpf.candlestick_ochl進行蠟燭繪制,ochl代表:open,close,high,low
mpf.candlestick_ochl(drawer, qutotes, width=0.6, colorup=__colorup__, colordown=__colordown__)
drawer.autoscale_view()
drawer.xaxis_date()
if show:
plt.show()
def EMA(data, window):
'''
:param data: 傳入的資料,需要為list、ndarray、series型別資料
:param window: 對應著計算的是幾日的EMA
:return: 回傳ndarray的資料型別
'''
list_ema = []
list_ema.append(data[0])
for i in range(1, len(data)):
list_ema.append(2 * data[i] / (window+1) + (window-1) * list_ema[-1] / (window+1))
return np.array(list_ema)
def draw_macd(dif, dea, macd, axs=None, show=False):
'''
通過傳入DIF、DEA、MACD的值繪制MACD指標的兩線一柱
:param dif: DIF指標的list或者ndarray資料型別
:param dea: DEA指標的list或者ndarray資料型別
:param macd: 為了代碼簡潔,目前只支持ndarray型別的MACD資料
:param axs: 是否在子圖繪制
:param show: 是否繪圖
:return:
'''
x = np.arange(len(dif)) # 橫坐標
drawer = axs if axs is not None else plt
drawer.plot(x, dif, label='DIF', color='b', linestyle='--') # 繪制DIF曲線
drawer.plot(x, dea, label='DEA', color='y', linestyle='-.') # 繪制DEA曲線
pos_index = x[macd >= 0] # 得到MACD值大于等于0的索引
neg_index = x[macd < 0] # 得到MACD值小于0的索引
drawer.bar(pos_index, macd[pos_index], color='r', label='macd bar', alpha=0.6) # 繪制MACD大于等于0部分的柱狀圖
drawer.bar(neg_index, macd[neg_index], color='g', label='macd bar', alpha=0.6) # 繪制MACD小于0部分的柱狀圖
drawer.legend()
if show:
plt.show()
if __name__ == '__main__':
# plot_ochl() # 繪制燭狀圖,會新建畫布
ema_12 = EMA(data=tsla_df['close'], window=12) # 12日EMA的值
ema_26 = EMA(data=tsla_df['close'], window=26) # 26日EMA的值
dif = ema_12 - ema_26 # 利用ndarray之間的減法運算即為各對應元素相減,得到DIF
dea = EMA(data=dif, window=9) # 再計算DIF的9日EMA(該值被稱為DEA)
macd = (dif - dea) * 2 # 計算MACD柱狀圖的值
fig, ax = plt.subplots(2, 1)
plot_ochl(tsla_df, axs=ax[0])
draw_macd(dif, dea, macd, axs=ax[1], show=True)
最后的繪制效果如下:

三、MACD指標的一般研判標準及代碼判斷
該部分主要介紹幾個常見的研判標準,實際情況并不一定會和研判標準相符合,由MACD指標的數學公式以及數學計算程序可以了解到MACD指標有一定的延后性
這部分借鑒了百度百科和多個MACD指標研究文章,放在最后供大家學習代碼后也可以了解一下一些MACD指標的研判標準
研判標準一:DIF和MACD的值及線的位置
- 當DIF和MACD均大于0(即在圖形上表示為它們處于零線以上)并向上移動時,一般表示為股市處于多頭行情中,可以買入開倉或多頭持倉
- 當DIF和MACD均小于0(即在圖形上表示為它們處于零線以下)并向下移動時,一般表示為股市處于空頭行情中,可以賣出股票或觀望
- 當DIF和MACD均大于0(即在圖形上表示為它們處于零線以上)但都向下移動時,一般表示為股票行情處于退潮階段,股票將下跌,可以賣出股票和觀望
- 當DIF和MACD均小于0時(即在圖形上表示為它們處于零線以下)但向上移動時,一般表示為行情即將啟動,股票將上漲,可以買進股票或持股待漲,
研判標準二:DIF和MACD的交叉情況
- 當DIF與MACD都在零線以上,而DIF向上突破MACD時,表明股市處于一種強勢之中,股價將再次上漲,可以加碼買進股票或持股待漲,這就是MACD指標“黃金交叉”的一種形式
- 當DIF和MACD都在零線以下,而DIF向上突破MACD時,表明股市即將轉強,股價跌勢已盡將止跌朝上,可以開始買進股票或持股,這是MACD指標“黃金交叉”的另一種形式
- 當DIF與MACD都在零線以上,而DIF卻向下突破MACD時,表明股市即將由強勢轉為弱勢,股價將大跌,這時應賣出大部分股票而不能買股票,這就是MACD指標的“死亡交叉”的一種形式
- 當DIF和MACD都在零線以上,而DIF向下突破MACD時,表明股市將再次進入極度弱市中,股價還將下跌,可以再賣出股票或觀望,這是MACD指標“死亡交叉”的另一種形式
研判標準三:MACD指標中的柱狀圖分析
- 當紅柱狀持續放大時,表明股市處于牛市行情中,股價將繼續上漲,這時應持股待漲或短線買入股票,直到紅柱無法再放大時才考慮賣出
- 當綠柱狀持續放大時,表明股市處于熊市行情之中,股價將繼續下跌,這時應持幣觀望或賣出股票,直到綠柱開始縮小時才可以考慮少量買入股票
- 當紅柱狀開始縮小時,表明股市牛市即將結束(或要進入調整期),股價將大幅下跌,這時應賣出大部分股票而不能買入股票
- 當綠柱狀開始收縮時,表明股市的大跌行情即將結束,股價將止跌向上(或進入盤整),這時可以少量進行長期戰略建倉而不要輕易賣出股票
- 當紅柱開始消失、綠柱開始放出時,這是股市轉市信號之一,表明股市的上漲行情(或高位盤整行情)即將結束,股價將開始加速下跌,這時應開始賣出大部分股票而不能買入股票
- 當綠柱開始消失、紅柱開始放出時,這也是股市轉市信號之一,表明股市的下跌行情(或低位盤整)已經結束,股價將開始加速上升,這時應開始加碼買入股票或持股待漲
歡迎大家關注我的GitHub
GItHub:ExileSaber
目前自己也正處于學習的階段,感謝各位的評論和建議!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230387.html
標籤:AI
上一篇:TPAGT解讀
