用 Python 實現(xiàn)股票指數(shù)移動平均線
移動平均指標(biāo)用于各種交易策略,以發(fā)現(xiàn)價格數(shù)據(jù)的長期趨勢。簡單移動平均線策略的一個潛在缺點是它們對所有價格的權(quán)重相同,而您可能希望最近的價格占有更大的比重。指數(shù)移動平均線 (EMA) 是實現(xiàn)這一目標(biāo)的一種方法。
下面我們通過代碼示例詳細介紹 EMA 的實現(xiàn),并將其與 SMA (簡單移動平均)進行比較。
EMA 通過加權(quán)乘數(shù)賦予最新價格更多權(quán)重。這個乘數(shù)應(yīng)用于最后一個價格,因此它比其他數(shù)據(jù)點占移動平均線更大的部分。EMA 是通過采用最近的價格(我們將其稱為“時間 t 的價格”) 減去前一個時間段 (EMA_{t-1})。此差異由您將 EMA 設(shè)置為 (N) 并加回到 EMA_{t-1}的時間段數(shù)加權(quán)。在數(shù)學(xué)上,我們可以這樣寫:
你可能已經(jīng)注意到上面的等式有一個小問題,它是如何開始的?它參考了最后一個時期的 EMA,所以如果你進行第一次計算,它參考的是什么?這通常可以通過替換簡單移動平均線 (SMA) 來初始化計算來延緩,這樣您就可以在第一次之后的所有時間段構(gòu)建 EMA。
讓我們通過導(dǎo)入我們的包,用 Python 中的一個簡單示例來展示它是如何工作的。
- import numpy as np
- import pandas as pd
- import yfinance as yf
- import matplotlib.pyplot as plt
從這里開始,我們將構(gòu)建兩個函數(shù)來協(xié)同工作并計算我們的指標(biāo)。第一個函數(shù)將是我們上面概述的公式的簡單實現(xiàn):
- def _calcEMA(P, last_ema, N):
- return (P - last_ema) * (2 / (N + 1)) + last_ema
第二個函數(shù)將計算我們所有數(shù)據(jù)的 EMA,首先使用 SMA 對其進行初始化,然后迭代我們的數(shù)據(jù)以使用我們的 SMA 列中的值更新每個后續(xù)條目,或者調(diào)用我們上面定義的 _calcEMA 函數(shù)來處理大于 N的值。
- def calcEMA(data, N):
- # Initialize series
- data['SMA_' + str(N)] = data['Close'].rolling(N).mean()
- ema = np.zeros(len(data))
- for i, _row in enumerate(data.iterrows()):
- row = _row[1]
- if i < N:
- ema[i] += row['SMA_' + str(N)]
- else:
- ema[i] += _calcEMA(row['Close'], ema[i-1], N)
- data['EMA_' + str(N)] = ema.copy()
- return data
現(xiàn)在,讓我們獲取一些數(shù)據(jù),看看它是如何工作的。我們將拉出比回測更短的時間段,并比較 EMA 和 SMA 的 10、50 和 100 天。
- ticker = 'BABA'
- yfyfObj = yf.Ticker(ticker)
- data = yfObj.history(ticker, start='2018-01-01', end='2020-12-31')
- N = [10, 50, 100]
- _ = [calcEMA(data, n) for n in N]
- colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
- fig, ax = plt.subplots(figsize=(18, 8))
- ax.plot(data['Close'], label='Close')
- for i, n in enumerate(N, 1):
- ax.plot(data[f'EMA_{n}'], label=f'EMA-{n}', color=colors[i])
- ax.plot(data[f'SMA_{n}'], label=f'SMA-{n}', color=colors[i], linestyle=':')
- ax.legend()
- ax.set_title(f'EMA and Closing Price Comparison for {ticker}')
- plt.show()
您可以在上圖中看到,EMA 比 SMA 對最近的變化更敏感。較短的時間范圍也比較長的時間范圍更具響應(yīng)性,較長的時間范圍具有可以追溯到幾個月或更長時間的價格“記憶”。
所有類型的移動平均線都是滯后指標(biāo),這意味著它們只能告訴您價格中已經(jīng)發(fā)生了什么。然而,這并不意味著它們不能用于識別趨勢和制定使用一個或多個移動平均指標(biāo)的策略。如果您有想法,請繼續(xù)進行測試,看看如何結(jié)合 EMA、SMA 和其他值來開發(fā)新的盈利交易策略。