DeepSeek 最近热度很高,我和大家一样,对背后的研发团队也十分好奇。一番了解后才发现,它竟是出自幻方量化之手。顺着这条线索,我又了解到量化交易这个领域。
作为技术人,遇到感兴趣的领域,第一反应就是亲手实践。于是我从零搭建了一套股票量化交易系统,完整跑了遍数据获取、特征工程、预测建模、运筹优化、回测等全流程。虽然成品远不能与幻方这类专业机构相提并论,但至少把整个技术链路跑通了,也算理解了量化系统是怎么运作的。
本文作为整个系列的开篇,主要介绍项目的整体架构、技术选型以及最终实现效果。后续还会推出 5 篇详细的技术文章,逐一拆解各个模块的具体实现。
一、为什么选择量化交易
数据好搞
A股数据有API接口(Tushare),不用自己爬数据。这点很重要,很多想做项目的时候都卡在数据获取这一步。
技术有意思
不是简单的分类或回归,涉及时间序列预测、特征工程、运筹优化、回测验证,技术栈挺全面的。而且这些技术其实很通用,做完量化也能用到其他场景。
效果可量化
有明确的评价指标(准确率、收益率、夏普比率),做完能清楚地看到效果好不好。不像有些项目,做完了也不知道到底有没有用。
有挑战性
真正做起来才发现,数据清洗、特征构建、避免过拟合、优化决策,每个环节都有坑。比想象中难多了,但也更有意思。
二、系统整体架构
整个系统分5层,自底向上构建:
┌─────────────────────────────────┐
│ 5. 回测验证 │ 验证策略效果
│ - 夏普比率 0.47 │
│ - 年化收益 12.15% │
├─────────────────────────────────┤
│ 4. 运筹优化 (核心) │ 决策买什么、买多少
│ - OR-Tools 线性规划 │
│ - 整数规划、二次规划 │
├─────────────────────────────────┤
│ 3. 预测模型 │ 预测涨跌
│ - LightGBM │
│ - 方向准确率 58% │
├─────────────────────────────────┤
│ 2. 特征工程 │ 提取信息
│ - 39个技术指标 │
│ - 6大类特征 │
├─────────────────────────────────┤
│ 1. 数据获取 │ 原始数据
│ - Tushare │
│ - 沪深300+中证500,10年数据 │
└─────────────────────────────────┘
为什么是这个顺序?因为每一层都依赖下面一层:
- 没有数据,后面都做不了
- 没有特征,模型没法学习
- 没有预测,不知道该买什么
- 没有优化,不知道该买多少
- 没有回测,不知道能不能赚钱
就像盖房子,必须先打地基。
2.1 数据流转过程
数据在各层之间是这样流转的:
第1层:原始数据
股票代码:600519(贵州茅台)
日期:2022-01-05
开盘价:1850元
收盘价:1829元
成交量:28396手
第2层:特征数据
return_1d: -1.47%(今天跌了1.47%)
ma_20: 1800元(20日均线)
rsi: 65(相对强弱指标)
macd: 0.5(趋势指标)
... 共39个特征
第3层:预测结果
茅台:预测明天涨2.5%
五粮液:预测明天涨1.8%
中国平安:预测明天跌0.5%
招行:预测明天涨1.2%
平安银行:预测明天涨0.3%
第4层:优化决策
在10万预算下,OR-Tools计算:
茅台:投资3万(涨幅最高)
五粮液:投资2.5万
招行:投资2万
平安银行:投资1.5万
中国平安:不投资(预测下跌)
总计:9万(留1万现金)
第5层:回测结果
年化收益率:12.15%
夏普比率:0.47
最大回撤:-12.21%
胜率:57.89%
这就是整个系统的数据流。
三、技术栈选型
3.1 数据源:为什么选Tushare
调研了几个数据源:
- Wind/彭博:专业金融数据库,数据质量最高。但太贵了,个人用不起。
- Yahoo Finance:免费,数据也全。但国内访问经常超时,不太稳定。
- Akshare:开源免费,接口简单。但是爬虫性质的接口,稳定性一般,批量下载容易被限流。
- Tushare Pro:需要积分,但接口是真正的API,稳定性比Akshare好得多。前复权数据一次调用直接拿到,不需要自己手动计算。
最终选了Tushare,主要是稳定+数据质量高。
3.2 预测模型:为什么选LightGBM
一开始其实想用LSTM的,毕竟是时间序列,LSTM看起来更合适。但试了之后发现:
数据形式问题
虽然这是时间序列数据,但我的特征工程已经把时序信息编码成了表格特征(滞后值、滚动窗口、技术指标等)。在这种表格数据上,LightGBM这类树模型天然有优势,而LSTM需要原始序列才能发挥能力。
训练速度
LightGBM训练6秒,LSTM需要34秒。日频策略需要每天收盘后快速更新模型,速度差距会被放大。
可解释性
LightGBM能看特征重要性,LSTM是个黑盒。
效果对比
实际测试了LightGBM、XGBoost和LSTM三个模型:
- LSTM的RankIC最高(0.0415)
- XGBoost次之(0.0377)
- LightGBM第三(0.0362)
0.0053的RankIC差距,在日频股票预测里不算大。
虽然LSTM效果最好,但综合考虑效果、速度、工程成本三个维度,最终选了LightGBM:
- 效果差距可接受(换算到收益约差1.5-2.5%年化)
- 速度快6倍(6秒 vs 34秒)
- 部署简单,无需深度学习框架
- 可解释性强,便于调试和维护
我的场景是日频、需要快速迭代、追求工程简单,所以选了LightGBM。
如果你的情况不同:
- 追求极致效果且不在意训练时间 → 选LSTM
- 不需要频繁更新模型,看重稳定性 → 选XGBoost
- 需要快速迭代,平衡效果和速度 → 选LightGBM(我的选择)
3.3 运筹优化:为什么选OR-Tools
做过一些调研:
PuLP:支持整数约束,但对复杂约束支持不够好,速度一般。
CVXPY:很强大,支持凸优化,但学习曲线陡峭。
Gurobi:业界标杆,速度极快。但商业许可证非常贵,个人项目用不起。
OR-Tools:Google 出品,免费、开源,支持线性规划、整数规划、约束规划等。最关键的是,这玩意在工业界用得很广,物流、排班、资源调度都在用。
最终选了OR-Tools。
四、各模块简介
这里简单介绍下每个模块,后面会有详细文章。
4.1 模块1:数据获取与清洗
核心问题:怎么获取高质量的数据?
我用Tushare下载了沪深300和中证500成分股(共800只)10年的历史数据(2015-2024)。然后做了三层清洗:
- 删除缺失值
- 过滤停牌数据(成交量为0的)
- 删除异常涨跌幅(超过30%的)
这块踩了不少坑,比如停牌数据不过滤的话,会导致技术指标计算错误。
4.2 模块2:特征工程
核心问题:怎么从原始价格变成模型能理解的特征?
我构建了6大类特征:
- 收益率(1日、5日、10日、20日)
- 移动平均线(MA5、MA20、MA60等)
- 动量指标(RSI、MACD)
- 波动率
- 价格位置
- 滞后特征
总共39个特征。这里有个技术点是要用 groupby按股票分组计算,不然茅台的均线会用到五粮液的数据。
4.3 模块3:预测模型
核心问题:怎么预测股票涨跌?
用LightGBM训练了价格预测模型,预测明天的涨跌幅。
关键技术点:
- 时间序列交叉验证(不能随机打乱)
- 避免数据泄露(用shift(-1)获取未来值作为标签)
- 参数调优
4.4 模块4:运筹优化
核心问题:在预算和约束条件下,怎么决策买哪些股票、各买多少?
这是整个项目的核心。我用OR-Tools实现了线性规划:
# 决策变量:每只股票投资金额
x = [solver.NumVar(0, max_limit, f'x_{i}') for i in range(n)]
# 目标:最大化收益
max: sum(x[i] * expected_return[i])
# 约束
s.t. sum(x) <= 100000 # 预算约束
x[i] <= 30000 # 单只上限
优化后,夏普比率提升明显。
4.5 模块5:回测系统
核心问题:怎么验证策略是不是真的能赚钱?
写了个简单的回测框架,模拟实际交易过程。关键指标:
- 年化收益率:12.15%
- 夏普比率:0.47
- 最大回撤:-12.21%
五、最终效果
5.1 数据规模
- 沪深300 + 中证500,共800只股票
- 10年历史数据(2015-2024)
- 总计约158万条记录
- 39个特征
5.2 模型性能
- RankIC:0.037(超过0.03有效阈值)
- ICIR:0.24(信号持续稳定)
- Q5-Q1年化价差:69.5%(区分强弱股票能力显著)
- 7个季度IC全部为正
5.3 优化效果
使用OR-Tools优化后:
- 夏普比率:0.47
- 年化收益率:12.15%
- 最大回撤:-12.21%
六、写在最后
最大的收获是理解了量化交易的技术链路。之前只是听说过"量化很赚钱"、"算法交易"这些概念,但具体怎么做的完全不清楚。现在从数据到决策,整个流程都走了一遍,算是真正理解了。
还有就是发现技术真的是通用的。一开始还担心做量化会不会太偏门,后来发现预测就是预测,优化就是优化,换个场景照样能用。尤其是OR-Tools这个工具,真的挺强大,值得深入学习。
如果你也对量化交易或者预测优化感兴趣,希望这个系列对你有帮助。
系列文章目录: