Skip to content

完整教学项目:用 mock 数据跑通策略 ​

学做菜只看菜谱不够,得真的把菜洗了、切了、下锅、尝味道。量化交易也一样,单独学数据、策略、回测、报告都不难,难的是把它们连起来跑一遍。

这是什么 ​

量化教学项目,就是用 mock 数据跑通策略、回测、报告和风险提示的完整练习。说白了,它不是为了立刻赚钱,而是让你在本地样本里,把“数据进来、信号出来、回测成交、报告生成、风险拦截、模拟盘记录”完整走通。

如果把量化学习比作开一家小店,前面几章像分别学进货、定价、记账和查账;量化教学项目就是开一天试营业:东西不一定卖得多,但你要知道每个环节有没有卡住。

入门阶段,一个合格的练习不用复杂,能回答这 6 个问题就够了:

环节要回答的问题不能偷懒的点
mock 数据今天有哪些价格和成交量不接外部行情,只用本地样本
策略规则什么时候买入、卖出规则要写清楚,不能凭感觉
回测引擎现金、持仓、成交怎么变不能假装所有信号都成交
回测报告收益、回撤、胜率怎么看不只看赚没赚钱
风险提示仓位和回撤有没有越界越界要能拦住
量化模拟盘新数据来了怎么记录偏差每天留痕,方便复盘

为什么要用 mock 数据 ​

mock 数据的好处,是可控。你知道每一行数据长什么样,也知道哪一天应该触发买入、哪一天应该被 T+1 或跌停挡住。这样练习时,错了就能定位,不会把问题推给行情源。

这跟学开车先在空地练一样。你不是为了证明自己已经能上高速,而是先把方向盘、刹车、倒车这些动作练顺。量化教学项目的目标也类似:先把流程跑顺,再谈表现好不好。

经验

方向性做法:第一次做量化教学项目,建议只用十几行 mock 数据和一条简单策略。适用条件是你已经理解量化策略规则、回测报告、A 股实盘约束和量化模拟盘;反例是一开始就塞进很多指标和参数;风险是项目看起来很热闹,真正出错时却找不到问题在哪。

一个具体场景 ​

以贵州茅台(600519,白酒行业,上交所主板,2001 年 8 月 27 日上市)作为真实 A 股公司背景;下面数字是教学样本,不代表真实历史行情或回测结果。表格里的 SAMPLE_A 只是教学标签,避免把练习价格误认成真实 600519 行情。

假设本地样本只有 6 行:

datecodeclosevolumestate
2024-05-06SAMPLE_A100.0012000正常交易
2024-05-07SAMPLE_A103.0018000正常交易
2024-05-08SAMPLE_A113.3026000涨停
2024-05-09SAMPLE_A105.0024000正常交易
2024-05-10SAMPLE_A94.5030000跌停
2024-05-13SAMPLE_A97.0022000正常交易

为了练流程,规则故意写得很简单:价格连续两天上涨且成交量放大,就发出买入信号;价格跌破买入价 5%,就发出卖出信号。这里不是推荐这条策略,只是用它当练习题。

python
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"

这个练习的重点不在“策略聪不聪明”,而在后面的检查:收盘数据生成的信号是否放到下一交易日执行?涨停时买入能不能默认成交?当天买入后能不能当天卖?跌停时卖出是不是一定成功?如果这些都没处理,回测报告再漂亮也不踏实。

把流程跑成一张清单 ​

完整教学项目最怕写散。新手可以按这张清单逐项打勾:

  1. 读入 mock 数据:确认日期、价格、成交量、涨停或跌停状态都存在;
  2. 生成信号:每一天只能有明确的 buy、sell 或 hold;
  3. 检查 A 股实盘约束:T+1、涨停、跌停和换手率不能忽略;
  4. 更新账户:现金、持仓、成交价格和账户净值要能对上;
  5. 生成回测报告:至少看收益、回撤、胜率、盈亏比和期望值;
  6. 做过拟合验证:换一小段样本或换相近参数,看结果会不会立刻塌掉;
  7. 加量化风控监控:仓位上限、回撤红线和日志要生效;
  8. 进入量化模拟盘记录:新一天数据来了,记录信号、风控结果和成交偏差。

可以把每天的结果记成这样:

datesignalfillaccount_noterisk_note
2024-05-06holdnone空仓观察未触发
2024-05-07buyaccepted买入 200 股仓位未超上限
2024-05-08buyrejected涨停不默认追买单只仓位接近上限
2024-05-09holdnone持仓观察未触发
2024-05-10sellrejected跌停不默认卖出回撤接近红线
2024-05-13sellaccepted卖出离场记录回撤

风险

这张表只是教学样本,不是对贵州茅台的交易建议。真实市场里,价格、成交、仓位和情绪都会更复杂,不能拿几行 mock 数据推导真实买卖结论。

新手最容易踩的坑 ​

第一个坑,是把教学项目写成“收益展示”。真正该展示的是流程:哪天发出信号、哪天被风控拦住、哪天因为 A 股实盘约束不能成交。只展示收益,等于只端出成品菜,不让人看后厨。

第二个坑,是只跑一次就觉得结束。量化教学项目至少要故意造几种情况:涨停买不到、跌停卖不出、回撤触线、仓位过重、参数稍微变化。问题越早在 mock 数据里暴露,真钱前越省心。

第三个坑,是把复杂当专业。散户很容易被一堆曲线和表格唬住,主力和机构看的是规则能不能执行、风险有没有边界。一个简单但能复盘的项目,比一个看不懂、改不动的“豪华项目”更适合入门。

大坑

不要用教学项目里的结果给自己壮胆。mock 数据是练手材料,不是市场承诺;如果用它来证明某只股票“应该买”,方向就错了。

总结 ​

量化教学项目把量化阶段串成一条线:用 mock 数据喂给量化策略规则,再经过 A 股实盘约束、回测引擎、回测报告、过拟合验证、量化风控监控和量化模拟盘记录。它的目标不是制造漂亮收益,而是让你知道策略从数据到复盘的每一步有没有说得清、跑得通、挡得住风险。

自检 3 问:

  1. 为什么教学项目要先用 mock 数据,而不是直接接真实行情?
  2. 一条策略发出买入信号后,为什么还要经过 A 股实盘约束和风控检查?
  3. 教学项目里最应该保留哪些记录,方便以后复盘?

股市有风险,入市需谨慎。本文不构成任何投资建议。

本章新学到:量化教学项目。

内容仅用于学习交流,不构成任何投资建议。股市有风险,入市需谨慎。