0基础学量化:技术指标构建(第一期续)
  无名的人 2天前 24 0

一、引言

1.1 研究背景

在金融投研领域,量化投资已成为不可或缺的一部分,它通过数学模型和计算机算法来执行交易决策,极大地提高了投资效率和准确性。
本文旨在为那些希望踏入量化投资领域,但缺乏技术基础的投资者提供一个全面的技术因子整理框架。我们将详细解析各类技术指标因子的计算方法及其在市场分析中的应用,帮助投资者构建坚实的量化投资基础。

1.2 研究目的与范围

核心目的:构建一套可直接复用的技术因子计算框架,明确各类因子的 “计算逻辑→应用场景→信号含义”,避免投资者陷入 “指标堆砌” 的误区。
研究范围:聚焦技术面因子(不涉及基本面因子如 PE、ROE),覆盖 8 大类指标(移动平均线类、趋势指标、动量指标、波动率指标、成交量指标、价格形态指标、支撑阻力指标、综合指标),所有因子均基于日度 OHLCV 数据(开盘价、最高价、最低价、收盘价、成交量)计算,适配股票、期货等主流交易品种。
适用人群:0 基础量化投资者、传统主观投资者转型量化的入门者、需要标准化因子计算框架的投研人员。

二. 技术因子体系构建基础

2.1 数据预处理规范

技术因子计算的准确性依赖于高质量的原始数据,因此需首先完成数据类型校验与清洗,这是后续所有因子计算的前提,具体要求如下:
数据类型要求:OHLCV 数据需为 “数值型”(如 float64),避免因字符串、空值导致计算报错;
数据清洗逻辑:若存在缺失值(如停牌导致的价格空缺),采用np.nan填充,后续因子计算时通过 “滚动窗口跳过空值”(如rolling(period).mean()默认跳过 NaN);
数据频率适配:本报告默认使用 “日度数据”,若需适配小时级、分钟级数据,需调整因子周期参数(如日度 MA20 对应小时级 MA480,需根据交易品种的活跃时间调整)。

2.2 因子计算整体框架

为提升因子的可扩展性(如后续新增 “均线偏离度”“量价背离” 等指标),本报告设计了 “总函数 + 分函数” 的模块化结构,核心逻辑如下:
总函数(compute_all_factors):作为入口函数,负责调用所有分函数,输出包含所有因子的完整数据集;
分函数(如_compute_moving_averages):按因子类别拆分,每个分函数专注于一类因子的计算,降低代码维护难度;
因子命名规范:采用 “指标类型 + 周期 + 含义” 的格式(如MA5=5 日简单移动平均,RSI_Overbought=RSI 超买信号),便于后续策略调用时识别。
核心框架代码实现:
python
运行
def compute_all_factors(self, df):
“”"
总函数:整合所有技术因子计算,输出完整因子数据集
参数:df - 包含OHLCV数据的DataFrame(列名:open, high, low, close, volume)
返回:df - 新增所有技术因子后的DataFrame
“”"
# 第一步:数据预处理(确保数值类型正确,避免计算报错)
df[‘open’] = pd.to_numeric(df[‘open’])
df[‘high’] = pd.to_numeric(df[‘high’])
df[‘low’] = pd.to_numeric(df[‘low’])
df[‘close’] = pd.to_numeric(df[‘close’])
df[‘volume’] = pd.to_numeric(df[‘volume’])

# 第二步:调用各类因子分函数
df = self._compute_moving_averages(df)  # 1. 移动平均线类
df = self._compute_trend_indicators(df)  # 2. 趋势指标
df = self._compute_momentum_indicators(df)  # 3. 动量指标
df = self._compute_volatility_indicators(df)  # 4. 波动率指标
df = self._compute_volume_indicators(df)  # 5. 成交量指标
df = self._compute_price_pattern_indicators(df)  # 6. 价格形态指标
df = self._compute_support_resistance_indicators(df)  # 7. 支撑阻力指标
df = self._compute_composite_indicators(df)  # 8. 综合指标

return df

3. 各类技术因子详细解析(原理 + 计算 + 应用)

3.1 移动平均线类因子:趋势平滑与方向判断

3.1.1 核心原理

移动平均线(MA)通过 “平均化历史价格” 平滑短期价格波动,突出中长期趋势方向 —— 当价格在均线上方且均线向上时,视为 “多头趋势”;反之则为 “空头趋势”。不同周期的 MA 对应不同级别的趋势(如短期 MA5 反映日内 / 次日波动,长期 MA250 反映年线牛熊分界)。

3.1.2 关键因子计算实现与解读

本类因子包含 “简单移动平均(MA)、指数移动平均(EMA)、加权移动平均(WMA)” 及交叉信号,具体如下:
因子名称 计算逻辑 核心含义与应用
MA{period} 过去 N 期收盘价的算术平均(close.rolling(period).mean()) 周期越小越灵敏(如 MA5 反映短期趋势),周期越大越稳定(如 MA250 为 “牛熊线”,价格在 MA250 上方大概率为牛市)
MA{period}_Ratio (收盘价 / MA {period})- 1 衡量价格相对均线的偏离度:Ratio>0→价格在均线上方(看涨),Ratio<-5%→价格大幅低于均线(可能超跌反弹)
EMA{period} 指数加权平均(close.ewm(span=period).mean()),近期价格权重更高 比 MA 更灵敏,适合捕捉短期趋势变化(如 EMA12、EMA26 是 MACD 指标的核心输入)
MA5_MA20_Cross 若 MA5>MA20 则为 1,否则为 - 1 “金叉信号”(1):短期趋势向上,可作为买入参考;“死叉信号”(-1):短期趋势向下,可作为卖出参考
代码实现与注释:
python
运行
def _compute_moving_averages(self, df):
“”“计算移动平均线类因子:含MA/EMA/WMA及交叉信号”""
close = df[‘close’] # 核心数据源:收盘价(反映当期最终价格)

# 1. 简单移动平均线(SMA):适合识别中长期趋势
for period in [3, 5, 10, 20, 30, 60, 120, 250]: 
    df[f'MA{period}'] = close.rolling(period).mean()  # 算术平均计算
    df[f'MA{period}_Ratio'] = close / df[f'MA{period}'] - 1  # 偏离度指标

# 2. 指数移动平均线(EMA):适合短期趋势跟踪
for period in [5, 10, 20, 30, 60]: 
    df[f'EMA{period}'] = close.ewm(span=period).mean()  # 指数加权,近期权重高
    df[f'EMA{period}_Ratio'] = close / df[f'EMA{period}'] - 1 

# 3. 加权移动平均线(WMA):进一步强化近期价格影响
for period in [5, 10, 20]: 
    weights = np.arange(1, period + 1)  # 权重:1→period递增(近期权重更高)
    df[f'WMA{period}'] = close.rolling(period).apply( 
        lambda x: np.dot(x, weights) / weights.sum(),  # 加权求和后归一化
        raw=True 
    ) 

# 4. 交叉信号:实战中最常用的趋势切换信号
df['MA5_MA20_Cross'] = np.where(df['MA5'] > df['MA20'], 1, -1)  # 短期交叉
df['MA10_MA30_Cross'] = np.where(df['MA10'] > df['MA30'], 1, -1)  # 中期交叉

return df

3.1.3 因子有效性边界

适用场景:趋势明确的市场(如牛市单边上涨、熊市单边下跌),MA 交叉信号有效性高;
失效场景:震荡市场(如价格在 MA5 与 MA20 之间反复横跳),易产生 “假金叉 / 假死叉”,需结合波动率指标(如 ATR)过滤信号。

3.2 趋势指标:判断趋势强度与方向

3.2.1 核心原理

趋势指标的核心作用是 “量化趋势的强度与持续性”—— 不同于移动平均线仅反映 “方向”,趋势指标可进一步判断 “趋势是否强劲”(如 ADX>25 说明趋势强,ADX<20 说明趋势弱),帮助投资者区分 “真趋势” 与 “假突破”。
本类指标包含 MACD(指数平滑异同平均线)、布林带(BOLL)、抛物线 SAR、DMI(方向移动指标)四大经典指标。

3.2.2 关键因子计算与应用解读

以 MACD 和布林带为例(实战中最常用),具体解析如下:
MACD 指标(指数平滑异同平均线)
计算逻辑:由 “快速 EMA(12 期)- 慢速 EMA(26 期)” 得到 MACD 线,再对 MACD 线做 9 期 EMA 得到信号线,两者差值为 MACD 柱状图(Histogram);
核心信号:
MACD 线从下向上穿信号线→“金叉”,提示趋势由空转多;
Histogram 由负转正→多头力量增强,Histogram 由正转负→空头力量增强;
应用场景:适合判断中期趋势(1-3 个月),如股票日线级别 MACD 金叉可作为波段买入信号。
布林带(BOLL)
计算逻辑:以 20 期 MA 为中轨(BB_Middle),中轨 + 2 倍标准差为上轨(BB_Upper),中轨 - 2 倍标准差为下轨(BB_Lower);
核心衍生因子:
BB_Width(带宽):(上轨 - 下轨)/ 中轨,带宽扩大→波动率上升(如行情突破),带宽收窄→波动率下降(如行情横盘);
BB_Position(位置):(收盘价 - 下轨)/(上轨 - 下轨),Position>0.8→价格靠近上轨(超买),Position<0.2→价格靠近下轨(超卖);
应用场景:震荡市场中 “上轨卖、下轨买”,趋势市场中 “价格沿上轨走(多头)则持有,沿下轨走(空头)则空仓”。
代码实现与注释:
python
运行
def _compute_trend_indicators(self, df):
“”“计算趋势指标:MACD、布林带、SAR、DMI”""
high, low, close = df[‘high’], df[‘low’], df[‘close’]

# 1. MACD:中期趋势判断核心指标
ema12 = close.ewm(span=12).mean()  # 快速EMA(12期)
ema26 = close.ewm(span=26).mean()  # 慢速EMA(26期)
df['MACD'] = ema12 - ema26  # MACD线
df['MACD_Signal'] = df['MACD'].ewm(span=9).mean()  # 信号线
df['MACD_Histogram'] = df['MACD'] - df['MACD_Signal']  # 柱状图(反映多空力量差)

# 2. 布林带:波动率+趋势结合指标
ma20 = close.rolling(20).mean()  # 中轨(20期MA,平衡灵敏与稳定)
std20 = close.rolling(20).std()  # 20期价格标准差(衡量波动)
df['BB_Upper'] = ma20 + 2 * std20  # 上轨(95%概率区间上限)
df['BB_Middle'] = ma20  # 中轨
df['BB_Lower'] = ma20 - 2 * std20  # 下轨(95%概率区间下限)
df['BB_Width'] = (df['BB_Upper'] - df['BB_Lower']) / df['BB_Middle']  # 带宽(波动率 proxy)
df['BB_Position'] = (close - df['BB_Lower']) / (df['BB_Upper'] - df['BB_Lower'])  # 价格位置

# 3. 抛物线SAR:止损与趋势跟踪(适合波段交易)
try: 
    df['SAR'] = talib.SAR(high.values, low.values)  # SAR值(价格在SAR上方为多头,下方为空头)
except: 
    df['SAR'] = np.nan  # 数据异常时填充空值

# 4. DMI:趋势强度量化(ADX)+ 方向(DI+/-)
try: 
    df['ADX'] = talib.ADX(high.values, low.values, close.values, timeperiod=14)  # 趋势强度(0-100)
    df['DI_Plus'] = talib.PLUS_DI(high.values, low.values, close.values, timeperiod=14)  # 多头方向强度
    df['DI_Minus'] = talib.MINUS_DI(high.values, low.values, close.values, timeperiod=14)  # 空头方向强度
except: 
    df['ADX'] = df['DI_Plus'] = df['DI_Minus'] = np.nan 
df['ADX_Trend'] = np.where(df['ADX'] > 25, 1, np.where(df['ADX'] < 20, -1, 0))  # 趋势强度信号:1=强趋势,-1=弱趋势

return df

3.3 其他核心因子类别简述(动量、波动率、成交量等)

为避免报告冗长,以下仅提炼各因子类别的 “核心价值 + 关键指标”,计算逻辑可参考上述章节的结构化解析:
因子类别 核心价值 关键指标与应用
动量指标 捕捉 “价格惯性”(涨的继续涨,跌的继续跌),识别超买超卖

  1. RSI(14 期):RSI>70→超买(卖),RSI<30→超卖(买);
  2. KDJ(14 期):K>D 且均 <20→金叉买入,K<D 且均> 80→死叉卖出;
  3. CCI(14 期):CCI>100→超买,CCI<-100→超卖
    波动率指标 衡量价格波动风险,用于设置止损 / 止盈
  4. ATR(14 期):真实波幅,ATR2 可作为止损幅度(如买入价 - 2ATR = 止损价);
  5. Volatility_20D:20 日历史波动率,波动率高则缩小仓位
    成交量指标 验证 “价格变动的有效性”(量价配合才是真趋势)
  6. OBV(能量潮):OBV 与价格同步上涨→量价配合(趋势延续),OBV 涨而价格跌→量价背离(趋势反转预警);
  7. VWAP(成交量加权均价):机构常用,价格在 VWAP 上方→强市,下方→弱市
    价格形态指标 识别经典 K 线形态(如锤子线、吞没形态),捕捉短期反转信号 1. Hammer(锤子线):底部出现→反转上涨;
  8. Engulfing(吞没形态):底部看涨吞没→买入,顶部看跌吞没→卖出;
  9. Gap_Up/Gap_Down(跳空缺口):跳空上涨且放量→强势,跳空下跌且放量→弱势
    支撑阻力指标 确定关键价格位(支撑 = 买盘集中区,阻力 = 卖盘集中区)
  10. Resistance_20(20 期高点):价格突破阻力→趋势延续,遇阻回落→短期回调;
  11. 斐波那契回撤(Fib_618):61.8% 回撤位是常见支撑位,适合抄底;
  12. 枢轴点(Pivot):R1 = 阻力 1,S1 = 支撑 1,用于日内交易止损
    综合指标 整合多类因子信号,降低单一指标的误导性 1. Technical_Score(技术评分):综合 RSI、MACD、布林带、成交量信号,评分 > 0.5→看涨,<-0.5→看跌;
  13. Trend_Strength(趋势强度):ADX*ATR / 收盘价,值越大→趋势越强劲
  14. 技术因子应用建议与风险提示
    4.1 实战应用建议
    因子组合而非单一依赖:避免仅用 MA 交叉信号交易,可组合 “MA 金叉 + OBV 放量 + RSI<50”(确保趋势、量能、动量一致),提升信号胜率;
    周期匹配策略目标:短期交易(1-5 天)用 MA5/EMA10/RSI,中期交易(1-3 个月)用 MA20/MACD/ADX,长期投资(1 年以上)用 MA250/ATR;
    回测验证再实盘:所有因子信号需通过历史数据回测(如 2019-2023 年股票数据),验证 “胜率(盈利次数 / 总次数)>50%、盈亏比(总盈利 / 总亏损)>1.5” 后,再小仓位实盘。
    4.2 核心风险提示
    滞后性风险:技术因子基于历史数据计算,若市场突发消息(如政策、业绩暴雷),因子信号可能失效(如 MA 金叉后突然跌停);
    过度拟合风险:若为追求回测收益刻意调整因子参数(如将 MA 交叉周期从 5/20 改为 6/21),可能导致 “回测盈利、实盘亏损”;
    市场环境适配风险:趋势因子(如 MACD)在震荡市失效,动量因子(如 RSI)在趋势市失效,需结合市场状态切换因子;
    数据质量风险:未复权价格(如除权除息后价格断层)会导致 MA、MACD 计算错误,需使用 “前复权数据” 进行因子计算。

5. 结论与后续扩展方向

本报告构建的技术因子体系,为 0 基础投资者提供了标准化的 “因子计算 + 应用框架”,核心价值在于:1)降低代码与原理的学习门槛;2)明确因子的有效性边界,避免盲目应用;3)为后续策略构建提供基础模块(如基于 “Technical_Score>0.5 买入、<-0.5 卖出” 的简单策略)。
后续扩展方向可包括:
融入机器学习优化:用线性回归、随机森林等模型,筛选对未来收益预测能力强的因子(如通过特征重要性排除无效因子);
结合基本面因子:添加 PE、ROE 等基本面指标,构建 “技术 + 基本面” 的多因子策略,提升策略稳定性;
动态参数调整:通过市场波动率(如 ATR)动态调整因子周期(波动率高时缩短 MA 周期,波动率低时延长周期),适应不同市场环境。
附录:关键代码依赖与环境配置
核心库:pandas(数据处理)、numpy(数值计算)、talib(技术指标计算,需提前安装:pip install TA-Lib);
数据格式:输入 DataFrame 需包含列名 “open, high, low, close, volume, date”(date 为日期索引);
环境要求:Python 3.7+,建议使用 Jupyter Notebook 运行代码,便于逐段调试与查看因子结果。

最后一次编辑于 2天前 0

暂无评论

推荐阅读