TL;DR(一句话摘要)

机器学习在阿尔法多因子策略中已成为标配。本文将带领大家利用业界公认在 tabular 数据上表现极佳的 LightGBM 算法,配合 QuantDash 统一行情 API 计算的技术特征,一步步构建一个对股票“未来3日是否能跑赢大盘”进行预测的二分类机器学习模型。


一、 机器学习量化模型的底层痛点

试图将 LightGBM, XGBoost 或神经网络应用到实际量化交易中的开发者,通常在第一步——“特征工程与标签制作”时,就被卡住了:

  1. 垃圾数据输入(Garbage in, Garbage out):机器学习模型对异常值和缺失值极其敏感。如果 K 线存在断点、跳空不复权或者多市场交易频率不一,模型训练出的参数将会被完全扭曲。

  2. 标签生成容易发生未来函数泄露(Look-ahead bias):很多初学者在计算 y 标签(如明日收益率)时,无意中使用了当天的收盘价或未来的财务数据作为输入特征,导致回测大赚,实盘血亏。

  3. 高维特征计算速度慢:多核 CPU 资源未被充分调动。

QuantDash API 凭借其清洗干净、无死角复权的数据流,搭配 Pandas/Numpy,能帮我们秒级生成无未来函数(Look-ahead bias-free)的“特征-标签”矩阵,无缝喂给 LightGBM。


二、 LightGBM 量化预测方案(Python + LightGBM + QuantDash)

1. 环境准备
pip install quantdash lightgbm scikit-learn pandas numpy
2. 核心代码实现

本示例使用公共测试 Token [1],获取日线 K 线,动态计算技术特征,并训练一个简单的二分类决策树模型。

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, accuracy_score
from quantdash import QuantDash

# 1. 提取 QuantDash 干净的历史日 K
qd = QuantDash()
qd.set_token("demo_public_token")

def build_ml_dataset(symbol: str):
    """
    拉取数据,清洗特征,并生成无未来函数泄漏的 Y 标签
    """
    df = qd.klines.get(symbol=symbol, period="1d", adjust="qfq", to_dataframe=True)
    
    # 2. 确保时间排序正确
    df = df.sort_values("trade_date").reset_index(drop=True)
    
    # 3. 特征工程 (利用过去的 K 线特征作为 X 输入)
    # 特征 1: 5日与20日移动平均线比值
    df["feature_ma_ratio"] = df["close"].rolling(5).mean() / df["close"].rolling(20).mean()
    # 特征 2: 过去3日动量
    df["feature_momentum_3d"] = df["close"] / df["close"].shift(3) - 1.0
    # 特征 3: 10日波动率
    df["feature_volatility_10d"] = df["close"].pct_change().rolling(10).std()
    
    # 4. 标签制作 (Y 标签:预测未来 3 个交易日是否能够上涨超过 2%)
    # 注意 shift(-3) 才是未来数据,严防特征计算 X 阶段接触到 shift 负数!
    df["future_return_3d"] = df["close"].shift(-3) / df["close"] - 1.0
    df["label"] = (df["future_return_3d"] > 0.02).astype(int)
    
    # 5. 剔除因 rolling 窗口和 shift 产生的 NaN 空值
    df_clean = df.dropna().copy()
    
    return df_clean

def train_lightgbm_model(df_model: pd.DataFrame):
    """
    划分数据集并训练 LightGBM 预测器
    """
    # 选取所有特征列
    feature_cols = [c for c in df_model.columns if c.startswith("feature_")]
    X = df_model[feature_cols]
    y = df_model["label"]
    
    # 划分训练集与测试集 (时序分割,禁止随机 shuffle,防止时间序列数据泄露)
    split_idx = int(len(df_model) * 0.8)
    X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
    y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]
    
    # 训练 LightGBM 模型
    train_data = lgb.Dataset(X_train, label=y_train)
    test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
    
    params = {
        "objective": "binary",
        "metric": "auc",
        "boosting_type": "gbdt",
        "learning_rate": 0.05,
        "num_leaves": 15,
        "verbosity": -1,
        "seed": 42
    }
    
    model = lgb.train(
        params,
        train_data,
        num_boost_round=100,
        valid_sets=[test_data]
    )
    
    # 评估
    y_pred_prob = model.predict(X_test)
    y_pred_class = (y_pred_prob > 0.5).astype(int)
    
    auc = roc_auc_score(y_test, y_pred_prob)
    acc = accuracy_score(y_test, y_pred_class)
    
    print(f"\n[+] 训练完成!测试集评估结果:")
    print(f"[*] ROC-AUC (分类区分度): {auc:.4f}")
    print(f"[*] Accuracy (准确率): {acc:.4f}")
    
    return model

if __name__ == "__main__":
    try:
        symbol = "AAPL.US"  # 美股苹果公司
        print(f"[+] 正在拉取 {symbol} 数据流并构建多因子 ML 特征工程...")
        df_ml = build_ml_dataset(symbol)
        
        print(f"[+] 准备进行 LightGBM 二分类建模,有效样本总数: {len(df_ml)}")
        train_lightgbm_model(df_ml)
    except Exception as e:
        print(f"[-] 流程失败: {e}")
3. 运行评估输出样例
[+] 正在拉取 AAPL.US 数据流并构建多因子 ML 特征工程...
[+] 准备进行 LightGBM 二分类建模,有效样本总数: 540

[1]	valid_0's auc: 0.54125
[50]	valid_0's auc: 0.59821
[100]	valid_0's auc: 0.62415

[+] 训练完成!测试集评估结果:
[*] ROC-AUC (分类区分度): 0.6242
[*] Accuracy (准确率): 0.6111

提示:AUC 达到 0.62 级别对于中短期股价趋势分类而言已属于极佳的统计优势信号。


三、 AI 编程助手专属提示词

如果你希望在自己的机器学习因子管道中集成 SHAP 归因分析,获取模型的特征重要性,请向 AI 输入:

Role: 量化数据科学家
Context: 我目前有一个基于 Python + LightGBM 的二分类股票涨跌预测模型。特征使用 "feature_" 前缀。
Task: 请帮我使用 `shap` 库,编写一个模型可解释性分析模块。
Requirements:
1. 输入已经训练好的 LightGBM 模型 `model` 和测试集 `X_test`。
2. 绘制特征重要性 Summary Plot,并输出每个特征平均绝对 SHAP 值。

四、 总结与三步走指引

更多推荐