金融工程--基础技术指标构建

背景

构建基础技术指标 有助于实现对全局市场监控和模型层面的训练构建特征工程。同时能够熟悉理论基础。

技术指标代码

百分比收益率 (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

参考文献

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值