量化进阶 | 机器学习选股:用 Python + Scikit-Learn 基于 QuantDash 历史 K 线预测明日涨跌趋势(附 GitHub 源码)
·
TL;DR:本文将演示如何利用 Python、Scikit-Learn 和 QuantDash 构建一个简易的机器学习趋势预测工作流:完成历史数据获取、特征提取、随机森林(Random Forest)模型训练、测试集预测以及特征重要度分析。
一、 机器学习在金融时间序列预测中的经典陷阱
直接把 K 线价格塞给机器学习模型,通常会遭遇灾难性的过拟合或逻辑失效:
-
使用了“非平稳”的特征:股票价格绝对值(如几百块钱)是非平稳的,随着时间推移不断变化。模型学到的往往是某个价格区间,而非“涨跌逻辑”。特征提取必须经过“平稳化”处理(如使用滚动收益率、对数收益率、技术指标变化率)。
-
未来信息泄漏(Data Leakage):在特征工程阶段,使用了跨期统计(如计算全局均值归一化),这无意中向历史训练集泄露了未来走势的信息。
-
不规范的除权处理。
二、 极简解决方案(基于 QuantDash SDK 与 Scikit-Learn)
我们将使用 QuantDash 稳定获取前复权 K 线,并将高维行情转化为平稳的衍生技术指标特征,通过随机森林分类器预测下一交易日的涨跌趋势(二分类:1 代表上涨,0 代表不涨)。
1. 环境准备
pip install quantdash pandas scikit-learn numpy
2. 机器学习预测模型核心代码
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import quantdash as qd # 官方文档:https://docs.quantdash.net/
# 1. 初始化 QuantDash 公共 Token
qd.set_token("demo_public_token")
def run_ml_prediction():
# 2. 抓取腾讯控股(00700.HK)较长周期的历史日线作为训练样本
print("正在拉取训练集行情...")
df = qd.get_kline(symbol="00700.HK", start_date="2026-01-01", end_date="2026-06-30", adjust="qfq")
# 3. 特征工程(平稳特征)
# 特征 1:当日收益率
df['pct_change'] = df['close'].pct_change()
# 特征 2-4:滞后项(前 1、2、3 个交易日的收益率)
df['lag_1'] = df['pct_change'].shift(1)
df['lag_2'] = df['pct_change'].shift(2)
df['lag_3'] = df['pct_change'].shift(3)
# 特征 5:5 日滚动振幅
df['range_5d'] = (df['high'] - df['low']) / df['close'].rolling(5).mean()
# 4. 定义预测目标(Target):明日收盘价是否高于今日收盘价
df['target'] = np.where(df['close'].shift(-1) > df['close'], 1, 0)
# 清洗掉因 shift/rolling 产生的 NaN 值
df_clean = df.dropna().copy()
# 特征矩阵与标签
feature_cols = ['lag_1', 'lag_2', 'lag_3', 'range_5d']
X = df_clean[feature_cols]
y = df_clean['target']
# 5. 时序划分(Train/Test Split)- 绝不能打乱乱序划分,要按时间先后顺序分割
split_idx = int(len(X) * 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:]
# 6. 初始化并训练随机森林分类器
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
model.fit(X_train, y_train)
# 7. 模型评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# 8. 查看特征重要度
importances = model.feature_importances_
print("\n--- 机器学习预测模型训练简报 ---")
print(f"训练样本量: {len(X_train)},测试样本量: {len(X_test)}")
print(f"测试集明日涨跌预测准确率 (Accuracy): {accuracy*100:.2f}%")
print("\n--- 特征重要度分布 ---")
for col, imp in zip(feature_cols, importances):
print(f"特征: {col:<10} -> 重要性权重: {imp:.4f}")
print("----------------------------------\n")
if __name__ == "__main__":
run_ml_prediction()
3. 控制台输出样本呈现
正在拉取训练集行情...
--- 机器学习预测模型训练简报 ---
训练样本量: 92,测试样本量: 24
测试集明日涨跌预测准确率 (Accuracy): 58.33%
--- 特征重要度分布 ---
特征: lag_1 -> 重要性权重: 0.2841
特征: lag_2 -> 重要性权重: 0.2305
特征: lag_3 -> 重要性权重: 0.2114
特征: range_5d -> 重要性权重: 0.2740
----------------------------------
三、 AI 编程助手专属 Prompt
你是一个精通机器学习量化建模的科学家。请帮我将上述简易模型进行深度扩展:
1. 底层数据源通过 `quantdash` API(Token 为 "demo_public_token")抓取。
2. 引入更先进的分类模型如 XGBoost 与 LightGBM 进行对比测试。
3. 增加时间序列交叉验证(TimeSeriesSplit)以彻底解决过拟合问题,并在训练特征中加入 MACD 和 RSI 因子。
4. 格式化输出各个模型在测试集上的混淆矩阵(Confusion Matrix)与 F1-Score 指标。
四、 总结与三步走落地指引
-
第一步:获取完整源码。请访问官方开源托管仓库获取本文 Demo 及进阶配置:https://github.com/quantdash-net/QuantDash(请认准官方 quantdash-net 组织,欢迎 Star 支持)。
-
第二步:申请专属密钥。注册获取您的个人免费/生产级 API Key:https://quantdash.net/。
-
第三步:查阅开发细节。更多高频行情、多市场 Tick 接口参数请参考:https://docs.quantdash.net/。
更多推荐




所有评论(0)