mcpField
F
feature-engineering

feature-engineering

github.com/agiprolabs数据与数据库456523 次安装8 周前更新
代码仓库

关于 feature-engineering

feature-engineering 是面向加密货币交易机器学习建模者的特征工程技能,介绍如何从行情、交易和链上数据构造输入特征。它还涵盖平稳性、滚动归一化、防止前视偏差、特征筛选和标签生成。

主要功能

  1. 01价格、成交量与技术指标特征
  2. 02微观结构、链上及跨资产特征
  3. 03平稳性检验与转换
  4. 04滚动归一化以避免前视偏差
  5. 05特征筛选与标签生成

适用场景

  1. 01从 OHLCV 数据构建模型输入
  2. 02检查特征平稳性并进行转换
  3. 03避免归一化和数据切分中的前视偏差
  4. 04筛选特征并为分类或回归创建目标

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/agiprolabs/claude-trading-skills --skill feature-engineering

安装后在 Claude Code 中输入/feature-engineering确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
feature_catalog.md
pitfalls.md
scripts/
build_features.py
feature_importance.py

详细介绍

面向交易机器学习的特征工程

特征工程是构建机器学习交易模型中杠杆效应最高的单项工作。模型选择(XGBoost、神经网络还是逻辑回归)的重要性远不及输入特征的质量和多样性。使用优质特征的简单模型,始终胜过直接使用原始价格的复杂模型。

本技能介绍如何从市场数据中构建、验证和筛选特征,以用于分类(信号分类)和回归模型,目标是加密货币/Solana 代币交易。

为什么特征胜过模型

原始 OHLCV 数据具有非平稳性、噪声和高维度。直接在价格序列上训练的模型会过拟合。特征工程将原始数据转换为平稳且信息丰富的信号,捕捉市场行为的不同方面:

  • 压缩:将数千根价格 K 线缩减为数十个描述性统计量
  • 平稳性:将非平稳价格转换为平稳的收益率和比率
  • 领域知识:将交易者直觉(支撑位/阻力位、成交量高潮)编码为可计算的量
  • 市场状态感知:在趋势市场和区间震荡市场中表现不同的特征,可帮助模型适应市场变化

特征类别

1. 价格特征

仅从 OHLCV 价格列推导。这些特征从价格序列本身捕捉趋势、动量和波动率。

特征公式回溯窗口
log_returnln(close_t / close_{t-1})1 根 K 线
abs_returnabs(log_return)1 根 K 线
return_volatilitystd(log_return, N)20 根 K 线
momentum_Nclose_t / close_{t-N} - 15、10、20
accelerationmomentum_5 - momentum_5[5]10 根 K 线
high_low_range(high - low) / close1 根 K 线
close_position(close - low) / (high - low)1 根 K 线
gapopen_t / close_{t-1} - 11 根 K 线
rolling_skewskew(log_return, N)20 根 K 线
rolling_kurtosiskurtosis(log_return, N)20 根 K 线
2. 成交量特征

成交量可以确认或否定价格走势。价格与成交量之间的背离是短线交易中最可靠的信号之一。

特征公式回溯窗口
volume_ratiovolume_t / mean(volume, N)20 根 K 线
volume_ma_ratiosma(volume, 5) / sma(volume, 20)20 根 K 线
obv_slopeslope(OBV, N)10 根 K 线
vwap_deviation(close - VWAP) / VWAP日内
volume_accelerationvolume_ratio_t - volume_ratio_{t-1}21 根 K 线
buy_volume_ratiobuy_volume / total_volume1 根 K 线
dollar_volumeclose * volume1 根 K 线
volume_cvstd(volume, N) / mean(volume, N)20 根 K 线
3. 技术特征

通过 pandas-ta 计算的标准技术指标。完整的参数文档请参阅 pandas-ta 技能。

特征来源回溯窗口
rsiRSI(14)14 根 K 线
macd_histogramMACD(12,26,9) 柱状图33 根 K 线
bb_position(close - BB_lower) / (BB_upper - BB_lower)20 根 K 线
bb_width(BB_upper - BB_lower) / BB_mid20 根 K 线
atr_ratioATR(14) / close14 根 K 线
adxADX(14)14 根 K 线
stoch_k随机指标 %K(14,3)14 根 K 线
cciCCI(20)20 根 K 线
mfiMFI(14)14 根 K 线
supertrend_directionSupertrend 方向(+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_changeN 个周期内独立持有者数量的变化
whale_net_flow前 10 大持有者转移的代币净额
token_velocity转账量 / 流通供应量
liquidity_changeDEX 流动性池 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
使特征平稳
非平稳特征平稳变换
价格对数收益率
成交量成交量比率(成交量 / 平均成交量)
OBVOBV 斜率(回归系数)
持有者数量持有者数量变化
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()

无前视偏差保证

交易机器学习中最危险的错误是前视偏差——使用未来信息计算特征或目标。请严格遵守以下规则:

  1. 仅使用滚动计算:切勿对完整序列使用 .mean() 或 .std()。始终使用 .rolling(N).mean()。
  2. 将目标向前移位,而不是将特征向后移位:目标应为 close.shift(-N) / close - 1(未来收益率),而不是 close / close.shift(N) - 1(作为目标使用的过去收益率)。
  3. 不使用未来索引对齐:合并特征和目标 DataFrame 时,请确认特征行 t 与目标行 t 配对(其中目标已包含向前移位)。
  4. 按时间划分训练集和测试集:切勿随机划分。始终使用 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 — 使用基于树的特征重要性和置换重要性,按预测能力对特征进行 排名。通过相关性分析识别冗余特征。

评论

支持 Markdown