首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从因子特征到 AI 预测:如何用 Python + QuantDash + LightGBM 快速跑通机器学习选股工作流?(附 GitHub 源码)

从因子特征到 AI 预测:如何用 Python + QuantDash + LightGBM 快速跑通机器学习选股工作流?(附 GitHub 源码)

原创
作者头像
用户9138916
修改2026-07-20 17:12:20
修改2026-07-20 17:12:20
130
举报

TL;DR(一句话摘要)

传统量化机器学习回测极易陷入“未来函数(Look-ahead Bias)”与“多股停牌数据污染”的泥潭[4]。本文基于统一行情接口 QuantDash 与机器学习先锋库 LightGBM,手把手带你搭建一个无未来函数污染的滚动训练(Walk-Forward Split)选股预测工作流,零门槛跑通 AI 驱动的交易决策[4][9]。


一、 机器学习选股工程的致命盲区

将机器学习(如 XGBoost, LightGBM)引入量化选股时,许多开发者虽然模型跑出了超高胜率,但实盘却亏损严重。这通常是因为落入了以下工程盲区[10]:

  1. 样本乱序(Shuffle)导致的未来数据泄漏:传统的机器学习训练集划分通常直接调用 train_test_split(shuffle=True)。但这在时序数据中是致命的,因为这会导致模型用“周五的收盘价去预测周二的走势”(即未来信息泄漏给历史)[10]。
  2. 多股特征对齐异常:对于多因子选股模型,若某些股票中途发生停牌,直接拼接会导致 DataFrame 出现空值或行数错乱。机器学习模型对 NaN 非常敏感,强行填充零或平均值会严重干扰模型特征分裂[4]。
  3. 复杂的行情获取逻辑限制了模型更新:传统爬虫数据接口频繁改版或缺失字段,使得无法做到每日盘后自动拉取最新数据、自动重训练模型并生成次日买入清单[2][6]。

通过 QuantDash SDK 标准、干净的 DataFrame 数据源[7][8],我们可以极速完成特征清洗,并使用符合时间序列特征的滚动训练方法。


二、 极简解决方案(基于 LightGBM 与 QuantDash)

我们将基于 QuantDash 获取的前复权历史 K 线[2],手工构建简单的趋势动量因子(如 5 日均线偏离度、5 日收益率、20 日波动率),作为 LightGBM 的输入特征,去预测未来 1 天的价格涨跌(二分类任务)。

请确保安装了以下依赖:

代码语言:txt
复制
pip install quantdash pandas numpy scikit-learn lightgbm

以下为无未来函数污染的完整机器学习选股管道代码(使用演示 Token"demo_public_token"即可运行)[4][5]:

代码语言:txt
复制
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))
控制台输出样例(真实数据训练结果)
代码语言:txt
复制
--- 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

三、 AI 编程助手(Cursor/Copilot)专属提示词

如果您正在使用 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TL;DR(一句话摘要)
  • 一、 机器学习选股工程的致命盲区
  • 二、 极简解决方案(基于 LightGBM 与 QuantDash)
    • 控制台输出样例(真实数据训练结果)
  • 三、 AI 编程助手(Cursor/Copilot)专属提示词
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档