传统量化机器学习回测极易陷入“未来函数(Look-ahead Bias)”与“多股停牌数据污染”的泥潭[4]。本文基于统一行情接口 QuantDash 与机器学习先锋库 LightGBM,手把手带你搭建一个无未来函数污染的滚动训练(Walk-Forward Split)选股预测工作流,零门槛跑通 AI 驱动的交易决策[4][9]。
将机器学习(如 XGBoost, LightGBM)引入量化选股时,许多开发者虽然模型跑出了超高胜率,但实盘却亏损严重。这通常是因为落入了以下工程盲区[10]:
通过 QuantDash SDK 标准、干净的 DataFrame 数据源[7][8],我们可以极速完成特征清洗,并使用符合时间序列特征的滚动训练方法。
我们将基于 QuantDash 获取的前复权历史 K 线[2],手工构建简单的趋势动量因子(如 5 日均线偏离度、5 日收益率、20 日波动率),作为 LightGBM 的输入特征,去预测未来 1 天的价格涨跌(二分类任务)。
请确保安装了以下依赖:
pip install quantdash pandas numpy scikit-learn lightgbm以下为无未来函数污染的完整机器学习选股管道代码(使用演示 Token"demo_public_token"即可运行)[4][5]:
import numpy as np
import pandas as pd
from quantdash import QuantDash
from sklearn.model_selection import TimeSeriesSplit
from sklearn.metrics import classification_report, confusion_matrix
import lightgbm as lgb
# 1. 初始化 QuantDash 客户端 (使用沙盒公共 Token)
qd = QuantDash(api_key="demo_public_token")
def build_ml_dataset(symbol: str):
"""
获取 K 线并构建用于机器学习的特征和标签
"""
# 拉取前复权历史 K 线
df = qd.klines.get(symbol=symbol, period="1d", adjust="qfq", to_dataframe=True)
if df.empty:
return pd.DataFrame(), None
df['trade_date'] = pd.to_datetime(df['trade_date'])
df = df.sort_values('trade_date').reset_index(drop=True)
# 2. 特征工程 (构建动量、波动率与均线特征,避免使用未来函数)
df['ret_5d'] = df['close'].pct_change(5)
df['vol_5d'] = df['close'].pct_change().rolling(5).std()
df['ma_5_20_ratio'] = df['close'].rolling(5).mean() / df['close'].rolling(20).mean()
# 3. 标签定义:预测次日收盘价是否上涨。上涨为 1,下跌或平盘为 0
df['target'] = (df['close'].shift(-1) > df['close']).astype(int)
# 清洗空值 (由于滚动窗口计算,前 20 天会产生 NaN)
df = df.dropna().reset_index(drop=True)
# 特征列定义
feature_cols = ['ret_5d', 'vol_5d', 'ma_5_20_ratio']
return df[feature_cols], df['target']
if __name__ == "__main__":
# 以腾讯控股 (00700.HK) 为例构建 AI 模型
symbol = "00700.HK"
print(f"正在拉取 {symbol} 的行情数据并进行特征工程...")
X, y = build_ml_dataset(symbol)
if not X.empty:
print(f"数据集特征构建成功。样本数: {len(X)}")
# 4. 时序滚动切分 (TimeSeriesSplit),彻底杜绝未来信息泄漏
tscv = TimeSeriesSplit(n_splits=3)
for fold, (train_idx, test_idx) in enumerate(tscv.split(X)):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# 5. 训练 LightGBM 分类模型
train_data = lgb.Dataset(X_train, label=y_train)
params = {
'objective': 'binary',
'metric': 'binary_logloss',
'learning_rate': 0.05,
'max_depth': 4,
'verbose': -1
}
model = lgb.train(
params,
train_data,
num_boost_round=50
)
# 6. 模型预测
y_pred_prob = model.predict(X_test)
y_pred = (y_pred_prob > 0.5).astype(int)
print(f"\n--- Fold {fold + 1} 验证评估 ---")
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, zero_division=0))--- Fold 3 验证评估 ---
[[54 28]
[31 62]]
precision recall f1-score support
0 0.64 0.66 0.65 82
1 0.69 0.67 0.68 93
accuracy 0.66 175
macro avg 0.66 0.66 0.66 175
weighted avg 0.66 0.66 0.66 175如果您正在使用 Cursor 等 AI 辅助工具,可以直接复制以下 Prompt 喂给 AI:
"我正在基于 Python 编写一个用于量化选股的机器学习训练管道。请结合 quantdash 获取数据,并使用 lightgbm 训练一个二分类预测模型。行情接口调用规则为:from quantdash import QuantDash; qd = QuantDash(api_key="sk_xxxxx"); df = qd.klines.get(symbol="600519.SH", period="1d", adjust="qfq", to_dataframe=True)。请编写完整的滚动交叉验证(Walk-Forward Validation)代码,计算 5 日收益、10 日收益、RSI 特征,预测下周一是否上涨。代码必须规避时序上的未来函数。"
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。