背景
构建基础技术指标 有助于实现对全局市场监控和模型层面的训练构建特征工程。同时能够熟悉理论基础。
技术指标代码
百分比收益率 (Percentage Return)
计算方法:当前价格与前一交易日价格的差额除以前一交易日的价格,再乘以100%。
用途:衡量股票价格的变动幅度。
def calculate_return(series):
return series.pct_change() * 100
滞后收益率 (Lagged Returns)
计算方法:将收益率指标应用到过去的数据上,例如,Lag1 表示前一天的收益率。
用途:分析过去价格变动对当前价格变动的潜在影响。
def create_lagged_series(symbol, start_date, end_date, lags=5):
# ... 省略其他代码 ...
for i in range(0, lags):
tslag["Lag%s" % str(i+1)] = ts["Adj Close"].shift(i+1)
# ... 省略其他代码 ...
变动率 (Rate of Change, ROC)
计算方法:当前价格与若干天前价格之差除以若干天前的价格。
用途:衡量价格变动的速率,常用于识别趋势的加速或减缓。
def ROC(data, n):
N = data['Close'].diff(n)
D = data['Close'].shift(n)
ROC = pd.Series(N / D, name='Rate of Change')
data = data.join(ROC)
return data
简单移动平均线 (Simple Moving Average, SMA)
计算方法:选定周期内的平均价格。
用途:平滑价格数据,帮助识别趋势。
def SMA(data, ndays):
SMA = pd.Series(data['Close'].rolling(window=ndays).mean(), name='SMA')
data = data.join(SMA)
return data
指数移动平均线 (Exponentially-weighted Moving Average, EWMA)
计算方法:给予近期数据更高的权重,对价格进行加权平均。
用途:更敏感地反映近期价格变动,常用于趋势跟踪和交易信号。
def EWMA(data, ndays):
EMA = pd.Series(data['Close'].ewm(span=ndays, min_periods=ndays-1).mean(),
name='EWMA_' + str(ndays))
data = data.join(EMA)
return data
力道指标 (Force Index, FI)
计算方法:价格变化乘以交易量。
用途:衡量市场力量,反映价格变动背后的动力。
def ForceIndex(data, ndays):
FI = pd.Series(data['Close'].diff(ndays) * data['Volume'], name='ForceIndex')
data = data.join(FI)
return data
布林带 (Bollinger Bands)
计算方法:中轨是简单移动平均线,上轨和下轨分别是中轨加上或减去两倍的标准差。
用途:衡量价格波动性,识别超买或超卖状态。
def BBANDS(data, ndays):
MA = data['Close'].rolling(window=ndays).mean()
SD = data['Close'].rolling(window=ndays).std()
b1 = MA + (2 * SD)
B1 = pd.Series(b1, name='Upper BollingerBand')
data = data.join(B1)
b2 = MA - (2 * SD)
B2 = pd.Series(b2, name='Lower BollingerBand')
data = data.join(B2)
return data
商品通道指数 (Commodity Channel Index, CCI)
计算方法:(TP - TP的移动平均) / (0.015 * TP的标准差),其中TP是商品价格的平均值。
用途:衡量价格相对于其平均价格的位置,常用于发现价格的异常波动。
def CCI(data, ndays):
TP = (data['High'] + data['Low'] + data['Close']) / 3
CCI = pd.Series((TP - TP.rolling(ndays).mean()) / (0.015 * TP.rolling(ndays).std()), name='CCI')
data = data.join(CCI)
return data
移动平均收敛发散 (Ease of Movement, EVM)
计算方法:真实波幅(True Range)除以交易量的移动平均,再除以价格范围。
用途:衡量价格变动的强度和持续性,常用于识别趋势的强度。
def EVM(data, ndays):
dm = ((data['High'] + data['Low']) / 2) - ((data['High'].shift(1) + data['Low'].shift(1)) / 2)
br = (data['Volume'] / 100000000) / (data['High'] - data['Low'])
EVM = dm / br
EVM_MA = pd.Series(EVM.rolling(ndays).mean(), name='EVM')
data = data.join(EVM_MA)
return data