关于 feature-engineering
feature-engineering 是面向加密货币交易机器学习建模者的特征工程技能,介绍如何从行情、交易和链上数据构造输入特征。它还涵盖平稳性、滚动归一化、防止前视偏差、特征筛选和标签生成。
主要功能
- 01价格、成交量与技术指标特征
- 02微观结构、链上及跨资产特征
- 03平稳性检验与转换
- 04滚动归一化以避免前视偏差
- 05特征筛选与标签生成
适用场景
- 01从 OHLCV 数据构建模型输入
- 02检查特征平稳性并进行转换
- 03避免归一化和数据切分中的前视偏差
- 04筛选特征并为分类或回归创建目标
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill feature-engineering安装后在 Claude Code 中输入/feature-engineering确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/feature_catalog.mdpitfalls.mdscripts/build_features.pyfeature_importance.py详细介绍
面向交易机器学习的特征工程
特征工程是构建机器学习交易模型中杠杆效应最高的单项工作。模型选择(XGBoost、神经网络还是逻辑回归)的重要性远不及输入特征的质量和多样性。使用优质特征的简单模型,始终胜过直接使用原始价格的复杂模型。
本技能介绍如何从市场数据中构建、验证和筛选特征,以用于分类(信号分类)和回归模型,目标是加密货币/Solana 代币交易。
为什么特征胜过模型
原始 OHLCV 数据具有非平稳性、噪声和高维度。直接在价格序列上训练的模型会过拟合。特征工程将原始数据转换为平稳且信息丰富的信号,捕捉市场行为的不同方面:
- 压缩:将数千根价格 K 线缩减为数十个描述性统计量
- 平稳性:将非平稳价格转换为平稳的收益率和比率
- 领域知识:将交易者直觉(支撑位/阻力位、成交量高潮)编码为可计算的量
- 市场状态感知:在趋势市场和区间震荡市场中表现不同的特征,可帮助模型适应市场变化
特征类别
1. 价格特征
仅从 OHLCV 价格列推导。这些特征从价格序列本身捕捉趋势、动量和波动率。
| 特征 | 公式 | 回溯窗口 |
|---|---|---|
log_return | ln(close_t / close_{t-1}) | 1 根 K 线 |
abs_return | abs(log_return) | 1 根 K 线 |
return_volatility | std(log_return, N) | 20 根 K 线 |
momentum_N | close_t / close_{t-N} - 1 | 5、10、20 |
acceleration | momentum_5 - momentum_5[5] | 10 根 K 线 |
high_low_range | (high - low) / close | 1 根 K 线 |
close_position | (close - low) / (high - low) | 1 根 K 线 |
gap | open_t / close_{t-1} - 1 | 1 根 K 线 |
rolling_skew | skew(log_return, N) | 20 根 K 线 |
rolling_kurtosis | kurtosis(log_return, N) | 20 根 K 线 |
2. 成交量特征
成交量可以确认或否定价格走势。价格与成交量之间的背离是短线交易中最可靠的信号之一。
| 特征 | 公式 | 回溯窗口 |
|---|---|---|
volume_ratio | volume_t / mean(volume, N) | 20 根 K 线 |
volume_ma_ratio | sma(volume, 5) / sma(volume, 20) | 20 根 K 线 |
obv_slope | slope(OBV, N) | 10 根 K 线 |
vwap_deviation | (close - VWAP) / VWAP | 日内 |
volume_acceleration | volume_ratio_t - volume_ratio_{t-1} | 21 根 K 线 |
buy_volume_ratio | buy_volume / total_volume | 1 根 K 线 |
dollar_volume | close * volume | 1 根 K 线 |
volume_cv | std(volume, N) / mean(volume, N) | 20 根 K 线 |
3. 技术特征
通过 pandas-ta 计算的标准技术指标。完整的参数文档请参阅 pandas-ta 技能。
| 特征 | 来源 | 回溯窗口 |
|---|---|---|
rsi | RSI(14) | 14 根 K 线 |
macd_histogram | MACD(12,26,9) 柱状图 | 33 根 K 线 |
bb_position | (close - BB_lower) / (BB_upper - BB_lower) | 20 根 K 线 |
bb_width | (BB_upper - BB_lower) / BB_mid | 20 根 K 线 |
atr_ratio | ATR(14) / close | 14 根 K 线 |
adx | ADX(14) | 14 根 K 线 |
stoch_k | 随机指标 %K(14,3) | 14 根 K 线 |
cci | CCI(20) | 20 根 K 线 |
mfi | MFI(14) | 14 根 K 线 |
supertrend_direction | Supertrend 方向(+1/-1) | 10 根 K 线 |
4. 微观结构特征
从交易级别的数据(单笔兑换/交易)中推导。需要链上数据或 DEX API 数据。
| 特征 | 说明 |
|---|---|
trade_count_ratio | 本根 K 线的交易笔数 / 每根 K 线的平均交易笔数 |
avg_trade_size | 平均交易规模(美元) |
large_trade_pct | 交易额 > $10k 的交易占成交量的百分比 |
unique_traders | 不同钱包地址的数量 |
buy_count_ratio | 买入交易笔数 / 总交易笔数 |
trade_size_entropy | 交易规模分布的香农熵 |
5. 链上特征
根据区块链状态变化得出。需要 Helius 或 Solana RPC 数据。
| 特征 | 描述 |
|---|---|
holder_count_change | N 个周期内独立持有者数量的变化 |
whale_net_flow | 前 10 大持有者转移的代币净额 |
token_velocity | 转账量 / 流通供应量 |
liquidity_change | DEX 流动性池 TVL 的变化 |
6. 跨资产特征
捕捉目标代币与更广泛市场之间的关系。
| 特征 | 描述 |
|---|---|
sol_correlation | 与 SOL 价格的滚动相关性 |
btc_beta | 对 BTC 收益率的滚动 Beta |
sector_momentum | 同一板块代币的平均收益率 |
7. 时间特征
对日历时间进行周期性编码。使用正弦/余弦编码来保留周期连续性(第 23 小时接近第 0 小时)。
import numpy as np
hour_sin = np.sin(2 * np.pi * hour / 24)
hour_cos = np.cos(2 * np.pi * hour / 24)
day_of_week = np.sin(2 * np.pi * day / 7)
平稳性
非平稳特征会导致模型在新数据上失效。 如果特征的统计属性(均值、方差)不会随时间变化,则该特征是平稳的。
平稳性检验
使用增广迪基-富勒(ADF)检验:
from scipy.stats import adfuller
result = adfuller(feature_series.dropna())
p_value = result[1]
is_stationary = p_value < 0.05
使特征平稳
| 非平稳特征 | 平稳变换 |
|---|---|
| 价格 | 对数收益率 |
| 成交量 | 成交量比率(成交量 / 平均成交量) |
| OBV | OBV 斜率(回归系数) |
| 持有者数量 | 持有者数量变化 |
| RSI | 已是平稳特征(范围为 0–100) |
| 美元成交额 | 美元成交额 / 滚动均值 |
规则:如果某个特征随时间持续上升或下降,则它是非平稳的。将其转换为比率、差值或变化率。
归一化
计算特征后,对其进行归一化,使所有特征的尺度具有可比性。这对于基于距离的模型(KNN、SVM)至关重要,对树模型也有帮助。
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Z 分数 | (x - mean) / std | 类似高斯分布的数据 |
| 最小-最大值 | (x - min) / (max - min) | 有界特征(RSI、BB 位置) |
| 排名 | rank(x) / len(x) | 重尾分布 |
关键:使用滚动统计量进行归一化。切勿使用全样本均值/标准差,否则会引入前视偏差。
# CORRECT: rolling z-score
z = (feature - feature.rolling(60).mean()) / feature.rolling(60).std()
# WRONG: full-sample z-score (lookahead bias!)
z = (feature - feature.mean()) / feature.std()
无前视偏差保证
交易机器学习中最危险的错误是前视偏差——使用未来信息计算特征或目标。请严格遵守以下规则:
- 仅使用滚动计算:切勿对完整序列使用
.mean()或.std()。始终使用.rolling(N).mean()。 - 将目标向前移位,而不是将特征向后移位:目标应为
close.shift(-N) / close - 1(未来收益率),而不是close / close.shift(N) - 1(作为目标使用的过去收益率)。 - 不使用未来索引对齐:合并特征和目标 DataFrame 时,请确认特征行
t与目标行t配对(其中目标已包含向前移位)。 - 按时间划分训练集和测试集:切勿随机划分。始终使用
train = data[:split_idx]、test = data[split_idx:]。
特征选择
计算多个特征后,选出预测力最强且冗余最少的特征:
步骤 1:移除低方差特征
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)
X_filtered = selector.fit_transform(X)
步骤 2:相关性筛选
移除与其他特征的相关性 > 0.9 的特征(保留与目标相关性更高的那个):
corr_matrix = X.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
to_drop = [col for col in upper.columns if any(upper[col] > 0.9)]
步骤 3:特征重要性
训练随机森林并按重要性排序:
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
importances = pd.Series(rf.feature_importances_, index=X.columns).sort_values(ascending=False)
步骤 4:互信息
相关性分析的非线性替代方法:
from sklearn.feature_selection import mutual_info_classif
mi = mutual_info_classif(X_train, y_train, random_state=42)
mi_scores = pd.Series(mi, index=X.columns).sort_values(ascending=False)
标签创建
标签(目标)定义模型要学习预测的内容。
二分类
forward_return = close.shift(-N) / close - 1
label = (forward_return > threshold).astype(int) # 1 = up, 0 = not up
典型阈值:1h K 线为 1%,4h K 线为 3%,日 K 线为 5%。
多分类
label = pd.cut(forward_return,
bins=[-np.inf, -threshold, threshold, np.inf],
labels=[0, 1, 2]) # 0=down, 1=flat, 2=up
回归
target = forward_return # Predict exact return magnitude
建议初始模型使用二分类——它更简单,也更能抵抗噪声。
与其他技能集成
pandas-ta:计算技术指标,并将其作为特征birdeye-api:获取 OHLCV 和交易数据,用于计算特征helius-api:获取链上数据,用于计算持有人/鲸鱼特征signal-classification:将工程化特征用作模型输入regime-detection:将市场状态标签用作特征,或用于依赖市场状态的模型ohlcv-processing:在计算特征前清理并重新采样原始数据
文件
参考资料
references/feature_catalog.md— 约 40 个特征的完整目录,包含公式、 回溯窗口、平稳性状态和解读说明references/pitfalls.md— 交易特征工程中的常见错误: 前视偏差、过拟合、幸存者偏差、数据窥探、非平稳性
脚本
scripts/build_features.py— 从 OHLCV 数据计算 25 个以上特征,并进行 平稳性测试和质量报告。支持使用合成数据的演示模式,或通过 Birdeye API 获取实时数据。scripts/feature_importance.py— 使用基于树的特征重要性和置换重要性,按预测能力对特征进行 排名。通过相关性分析识别冗余特征。