完整教学项目:用 mock 数据跑通策略
学做菜只看菜谱不够,得真的把菜洗了、切了、下锅、尝味道。量化交易也一样,单独学数据、策略、回测、报告都不难,难的是把它们连起来跑一遍。
这是什么
量化教学项目,就是用 mock 数据跑通策略、回测、报告和风险提示的完整练习。说白了,它不是为了立刻赚钱,而是让你在本地样本里,把“数据进来、信号出来、回测成交、报告生成、风险拦截、模拟盘记录”完整走通。
如果把量化学习比作开一家小店,前面几章像分别学进货、定价、记账和查账;量化教学项目就是开一天试营业:东西不一定卖得多,但你要知道每个环节有没有卡住。
入门阶段,一个合格的练习不用复杂,能回答这 6 个问题就够了:
| 环节 | 要回答的问题 | 不能偷懒的点 |
|---|---|---|
| mock 数据 | 今天有哪些价格和成交量 | 不接外部行情,只用本地样本 |
| 策略规则 | 什么时候买入、卖出 | 规则要写清楚,不能凭感觉 |
| 回测引擎 | 现金、持仓、成交怎么变 | 不能假装所有信号都成交 |
| 回测报告 | 收益、回撤、胜率怎么看 | 不只看赚没赚钱 |
| 风险提示 | 仓位和回撤有没有越界 | 越界要能拦住 |
| 量化模拟盘 | 新数据来了怎么记录偏差 | 每天留痕,方便复盘 |
为什么要用 mock 数据
mock 数据的好处,是可控。你知道每一行数据长什么样,也知道哪一天应该触发买入、哪一天应该被 T+1 或跌停挡住。这样练习时,错了就能定位,不会把问题推给行情源。
这跟学开车先在空地练一样。你不是为了证明自己已经能上高速,而是先把方向盘、刹车、倒车这些动作练顺。量化教学项目的目标也类似:先把流程跑顺,再谈表现好不好。
经验
方向性做法:第一次做量化教学项目,建议只用十几行 mock 数据和一条简单策略。适用条件是你已经理解量化策略规则、回测报告、A 股实盘约束和量化模拟盘;反例是一开始就塞进很多指标和参数;风险是项目看起来很热闹,真正出错时却找不到问题在哪。
一个具体场景
以贵州茅台(600519,白酒行业,上交所主板,2001 年 8 月 27 日上市)作为真实 A 股公司背景;下面数字是教学样本,不代表真实历史行情或回测结果。表格里的 SAMPLE_A 只是教学标签,避免把练习价格误认成真实 600519 行情。
假设本地样本只有 6 行:
| date | code | close | volume | state |
|---|---|---|---|---|
| 2024-05-06 | SAMPLE_A | 100.00 | 12000 | 正常交易 |
| 2024-05-07 | SAMPLE_A | 103.00 | 18000 | 正常交易 |
| 2024-05-08 | SAMPLE_A | 113.30 | 26000 | 涨停 |
| 2024-05-09 | SAMPLE_A | 105.00 | 24000 | 正常交易 |
| 2024-05-10 | SAMPLE_A | 94.50 | 30000 | 跌停 |
| 2024-05-13 | SAMPLE_A | 97.00 | 22000 | 正常交易 |
为了练流程,规则故意写得很简单:价格连续两天上涨且成交量放大,就发出买入信号;价格跌破买入价 5%,就发出卖出信号。这里不是推荐这条策略,只是用它当练习题。
rows = [
{"date": "2024-05-06", "code": "SAMPLE_A", "close": 100.00, "volume": 12_000, "state": "正常交易"},
{"date": "2024-05-07", "code": "SAMPLE_A", "close": 103.00, "volume": 18_000, "state": "正常交易"},
{"date": "2024-05-08", "code": "SAMPLE_A", "close": 113.30, "volume": 26_000, "state": "涨停"},
{"date": "2024-05-09", "code": "SAMPLE_A", "close": 105.00, "volume": 24_000, "state": "正常交易"},
{"date": "2024-05-10", "code": "SAMPLE_A", "close": 94.50, "volume": 30_000, "state": "跌停"},
{"date": "2024-05-13", "code": "SAMPLE_A", "close": 97.00, "volume": 22_000, "state": "正常交易"},
]
def signal(today, yesterday, entry_price):
if yesterday and today["close"] > yesterday["close"] and today["volume"] > yesterday["volume"] * 1.3:
return "buy"
if entry_price and today["close"] < entry_price * 0.95:
return "sell"
return "hold"这个练习的重点不在“策略聪不聪明”,而在后面的检查:收盘数据生成的信号是否放到下一交易日执行?涨停时买入能不能默认成交?当天买入后能不能当天卖?跌停时卖出是不是一定成功?如果这些都没处理,回测报告再漂亮也不踏实。
把流程跑成一张清单
完整教学项目最怕写散。新手可以按这张清单逐项打勾:
- 读入 mock 数据:确认日期、价格、成交量、涨停或跌停状态都存在;
- 生成信号:每一天只能有明确的 buy、sell 或 hold;
- 检查 A 股实盘约束:T+1、涨停、跌停和换手率不能忽略;
- 更新账户:现金、持仓、成交价格和账户净值要能对上;
- 生成回测报告:至少看收益、回撤、胜率、盈亏比和期望值;
- 做过拟合验证:换一小段样本或换相近参数,看结果会不会立刻塌掉;
- 加量化风控监控:仓位上限、回撤红线和日志要生效;
- 进入量化模拟盘记录:新一天数据来了,记录信号、风控结果和成交偏差。
可以把每天的结果记成这样:
| date | signal | fill | account_note | risk_note |
|---|---|---|---|---|
| 2024-05-06 | hold | none | 空仓观察 | 未触发 |
| 2024-05-07 | buy | accepted | 买入 200 股 | 仓位未超上限 |
| 2024-05-08 | buy | rejected | 涨停不默认追买 | 单只仓位接近上限 |
| 2024-05-09 | hold | none | 持仓观察 | 未触发 |
| 2024-05-10 | sell | rejected | 跌停不默认卖出 | 回撤接近红线 |
| 2024-05-13 | sell | accepted | 卖出离场 | 记录回撤 |
风险
这张表只是教学样本,不是对贵州茅台的交易建议。真实市场里,价格、成交、仓位和情绪都会更复杂,不能拿几行 mock 数据推导真实买卖结论。
新手最容易踩的坑
第一个坑,是把教学项目写成“收益展示”。真正该展示的是流程:哪天发出信号、哪天被风控拦住、哪天因为 A 股实盘约束不能成交。只展示收益,等于只端出成品菜,不让人看后厨。
第二个坑,是只跑一次就觉得结束。量化教学项目至少要故意造几种情况:涨停买不到、跌停卖不出、回撤触线、仓位过重、参数稍微变化。问题越早在 mock 数据里暴露,真钱前越省心。
第三个坑,是把复杂当专业。散户很容易被一堆曲线和表格唬住,主力和机构看的是规则能不能执行、风险有没有边界。一个简单但能复盘的项目,比一个看不懂、改不动的“豪华项目”更适合入门。
大坑
不要用教学项目里的结果给自己壮胆。mock 数据是练手材料,不是市场承诺;如果用它来证明某只股票“应该买”,方向就错了。
总结
量化教学项目把量化阶段串成一条线:用 mock 数据喂给量化策略规则,再经过 A 股实盘约束、回测引擎、回测报告、过拟合验证、量化风控监控和量化模拟盘记录。它的目标不是制造漂亮收益,而是让你知道策略从数据到复盘的每一步有没有说得清、跑得通、挡得住风险。
自检 3 问:
- 为什么教学项目要先用 mock 数据,而不是直接接真实行情?
- 一条策略发出买入信号后,为什么还要经过 A 股实盘约束和风控检查?
- 教学项目里最应该保留哪些记录,方便以后复盘?
股市有风险,入市需谨慎。本文不构成任何投资建议。
本章新学到:量化教学项目。