跳到主要内容

Feature Get

· 阅读需 4 分钟
Jiujiuwhoami
Digital nomads

在时间序列数据(如 OHLCV 数据)中,提取特征是构建高效预测模型的关键步骤。本文介绍从原始数据中提取对模型有用的技术指标、统计特征和时间特征的方法,并提供完整代码示例。

🧠 特征类型总览

特征提取主要分为三类:

  • 📉 技术指标
  • 📊 统计特征
  • ⏱️ 时间特征

1️⃣ 技术指标(Technical Indicators)

技术指标是金融领域中常用的分析工具,能够帮助捕捉价格趋势、动量和波动性。

常见技术指标

✅ 移动平均线(MA)

  • 简单移动平均(SMA)
SMA=1ni=1nClosei\text{SMA} = \frac{1}{n} \sum_{i=1}^{n} \text{Close}_i
  • 指数移动平均(EMA)
EMAt=αCloset+(1α)EMAt1,α=2n+1\text{EMA}_t = \alpha \cdot \text{Close}_t + (1 - \alpha) \cdot \text{EMA}_{t-1}, \quad \alpha = \frac{2}{n+1}

✅ 相对强弱指数(RSI)

衡量价格变动强度与速度:

RSI=1001001+RS,RS=平均涨幅平均跌幅\text{RSI} = 100 - \frac{100}{1 + RS}, \quad RS = \frac{\text{平均涨幅}}{\text{平均跌幅}}

✅ 布林带(Bollinger Bands)

使用标准差衡量波动性:

  • 中轨:SMA
  • 上轨:SMA + 2σ
  • 下轨:SMA - 2σ

✅ MACD(移动平均收敛/发散)

  • 快线 = 12日 EMA - 26日 EMA
  • 慢线 = 快线的 9 日 EMA

✅ VWAP(成交量加权平均价格)

VWAP=(Price×Volume)Volume\text{VWAP} = \frac{\sum (\text{Price} \times \text{Volume})}{\sum \text{Volume}}

2️⃣ 统计特征(Statistical Features)

描述价格和收益率的分布和波动。

常见统计特征

  • 收益率(Returns)
Returnst=ClosetCloset1Closet1\text{Returns}_t = \frac{\text{Close}_t - \text{Close}_{t-1}}{\text{Close}_{t-1}}
  • 波动率(Volatility)
Volatility=1ni=1n(ReturnsiReturnsˉ)2\text{Volatility} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (\text{Returns}_i - \bar{\text{Returns}})^2}
  • 最大值/最小值:过去 (n) 天内的最高/最低价
  • 分位数:如 25%、50%、75% 分位值
  • 偏度 & 峰度:反映收益率分布的形态特征

3️⃣ 时间特征(Time Features)

从时间索引中提取周期性与趋势性特征。

常见时间特征

data['Year'] = data.index.year
data['Month'] = data.index.month
data['Day'] = data.index.day
data['Weekday'] = data.index.weekday
  • 滞后特征(Lag features):
data['Lag_1'] = data['Close'].shift(1)
data['Lag_2'] = data['Close'].shift(2)
  • 滚动窗口统计(Rolling stats):
data['Rolling_Mean'] = data['Close'].rolling(window=5).mean()
data['Rolling_Std'] = data['Close'].rolling(window=5).std()

💻 特征提取完整代码示例

import pandas as pd
import numpy as np
from ta import add_all_ta_features # pip install ta

# 1. 加载数据
data = pd.read_csv('ohlcv_data.csv', index_col='Date', parse_dates=True)

# 2. 添加所有技术指标
data = add_all_ta_features(
data, open="Open", high="High", low="Low", close="Close", volume="Volume", fillna=True
)

# 3. 统计特征
data['Returns'] = data['Close'].pct_change()
data['Volatility'] = data['Returns'].rolling(window=5).std()

# 4. 时间特征
data['Year'] = data.index.year
data['Month'] = data.index.month
data['Weekday'] = data.index.weekday

# 5. 滞后特征
data['Lag_1'] = data['Close'].shift(1)
data['Lag_2'] = data['Close'].shift(2)

# 6. 滚动统计
data['Rolling_Mean'] = data['Close'].rolling(window=5).mean()
data['Rolling_Std'] = data['Close'].rolling(window=5).std()

# 7. 删除缺失值
data = data.dropna()

# 8. 输出结果
print(data.head())

🧬 特征选择(Feature Selection)

提取大量特征后,需要选择最相关的特征来提高模型效果,避免过拟合:

  • 相关性分析:删除与目标变量弱相关或与其他特征高度相关的变量。
  • PCA 降维:将高维特征映射到低维空间。
  • 模型评估法:如基于树模型的特征重要性分析(随机森林、LightGBM)。

📌 总结

  • 技术指标能反映价格行为;
  • 统计特征描述波动性与收益;
  • 时间特征挖掘周期性;
  • 代码示例展示完整的提取流程;
  • 特征选择至关重要。