特征是原始数据中提取的可量化指标,用于描述股票的状态、趋势或模式。在选股中,特征是模型预测的“燃料”。
✨ 好的特征 = 模型成功的一半
| 指标 | 全称 | 核心含义 | 典型参数 |
|---|---|---|---|
| MA | 移动平均线 | 平滑价格趋势,支撑/阻力 | 5日, 20日, 60日 |
| RSI | 相对强弱指标 | 超买/超卖,动量反转 | 14日 (经典) |
| MACD | 异同移动平均线 | 趋势强度、金叉/死叉 | 12, 26, 9 |
公式: MAn = (P1 + P2 + ... + Pn) / n
选股用法 价格上穿MA = 买入信号
公式: RSI = 100 - 100/(1 + RS)
RS = 平均上涨幅度 / 平均下跌幅度
组成: DIF = EMA12 - EMA26
DEA = EMA9(DIF) · 柱状线 = 2×(DIF - DEA)
# 导入库 import pandas as pd import numpy as np # 假设 df 包含 'close' 列 def add_technical_features(df): # ---- MA (简单移动平均) ---- df['MA_5'] = df['close'].rolling(window=5).mean() df['MA_20'] = df['close'].rolling(window=20).mean() df['MA_60'] = df['close'].rolling(window=60).mean() # ---- RSI (14日) ---- delta = df['close'].diff() gain = delta.where(delta > 0, 0.0) loss = (-delta.where(delta < 0, 0.0)) avg_gain = gain.rolling(window=14).mean() avg_loss = loss.rolling(window=14).mean() rs = avg_gain / avg_loss df['RSI_14'] = 100 - (100 / (1 + rs)) # ---- MACD (12,26,9) ---- ema12 = df['close'].ewm(span=12, adjust=False).mean() ema26 = df['close'].ewm(span=26, adjust=False).mean() df['MACD_DIF'] = ema12 - ema26 df['MACD_DEA'] = df['MACD_DIF'].ewm(span=9, adjust=False).mean() df['MACD_HIST'] = 2 * (df['MACD_DIF'] - df['MACD_DEA']) return df # 使用示例 # df = pd.read_csv('stock.csv') # df = add_technical_features(df) # print(df[['close','MA_20','RSI_14','MACD_DIF']].tail())
不同指标量纲差异大 (MA ~ 价格, RSI 0~100),建议使用 StandardScaler 或 MinMaxScaler 归一化。
MA(5) 与 MA(20) 高度相关,可考虑只保留部分或使用PCA降维。
移动平均类指标天生滞后,可结合差分、动量特征 (如ROC) 补充。