写第一个策略:把买卖条件变成代码
很多人第一次写量化策略,会急着追求“聪明”。其实第一条策略先别聪明,先要清楚。就像开店先把“什么情况进货、什么情况清库存、每次进多少”写成规矩,再谈生意做得多漂亮。
这是什么
量化策略规则,就是把买入、卖出和仓位条件写成可执行逻辑。说人话,它像一张厨房出餐单:什么条件下开始炒,什么条件下停火,一锅最多放多少菜,都要写明白,不能靠临场感觉。
在程序里,一条最小策略通常拆成三块:
| 部分 | 要回答的问题 | 例子 |
|---|---|---|
| 买入条件 | 什么情况下可以买 | 收盘价站上 MA20,并且放量 |
| 卖出条件 | 什么情况下要卖 | 收盘价跌回 MA20 下方,或触发止损 |
| 仓位条件 | 每次买多少 | 每只股票最多用 20% 资金 |
本章只做第一条能看懂、能检查的小策略:用 A 股量化数据里的收盘价和成交量,配合均线与突破,写出一套清楚的量化策略规则。
经验
第一条策略的目标不是赚钱,而是把“想法”翻译成“规则”。规则能被自己复盘,才有资格继续改进。
为什么不能只写一句“涨了就买”
“涨了就买”听起来直观,但程序会追问很多细节。
涨多少算涨?站上哪条均线算强?突破的是哪一天的压力?成交量要不要放大?当天买入后,A 股普通股票通常 T+1,能不能同一天卖出?每次买满仓,还是只买一部分?
如果这些问题没写清楚,程序不会帮你补脑子,只会按你给的模糊规则乱跑。散户临盘时常说“感觉要突破了”,但量化交易不能靠感觉,要把“突破”拆成可检查的条件。
比如我们先定一个很朴素的买入条件:
- 当天收盘价高于 MA20。
- 当天收盘价高于过去 10 个交易日的最高收盘价。
- 当天成交量大于过去 5 个交易日平均成交量的 1.5 倍。
这三句话的意思是:价格站到中期均线上方,同时越过近期压力,还伴随放量。它不保证会涨,只是把“看起来比较强”改成了程序能判断的条件。
用一张教学样本表跑通
以贵州茅台(600519,白酒行业,上交所主板,2001 年 8 月 27 日上市)为真实 A 股公司例子,但下面数字是教学样本,不代表它的真实历史行情。我们只用它说明数据长什么样、规则怎么落地。
| date | code | close | volume | avg_volume_5 | ma20 | high_close_10 |
|---|---|---|---|---|---|---|
| 2024-01-08 | SAMPLE | 98.00 | 8.1 万 | 8.0 万 | 97.20 | 99.20 |
| 2024-01-09 | SAMPLE | 99.10 | 8.4 万 | 8.1 万 | 97.35 | 99.20 |
| 2024-01-10 | SAMPLE | 100.30 | 13.2 万 | 8.5 万 | 97.50 | 99.20 |
| 2024-01-11 | SAMPLE | 101.00 | 14.1 万 | 9.2 万 | 97.70 | 100.30 |
在 2024-01-10 这一天,收盘价 100.30 高于 MA20 的 97.50,也高于过去 10 个交易日最高收盘价 99.20;如果过去 5 个交易日平均成交量约 8.5 万,那么 13.2 万就是放量。按这条规则,2024-01-10 会出现买入条件。
用 Python 写出来,可以先保持很直白:
def make_signal(row):
price_ok = row["close"] > row["ma20"]
breakout_ok = row["close"] > row["high_close_10"]
volume_ok = row["volume"] > row["avg_volume_5"] * 1.5
return price_ok and breakout_ok and volume_ok这段逻辑没有神秘感:三个条件都满足,才给出买入提示。量化策略规则越早期,越应该这么朴素。你要能指着每一行说清楚:为什么是买,为什么不是买。
还有一个时间点要写清楚:如果用当天收盘价判断买入条件,通常应假设“收盘后生成信号,下一交易日再按可成交价格执行”,不能默认已经知道收盘结果后还按当天收盘价成交。
卖出和仓位也要写进规则
只写买入条件,是很多新手的第一坑。买入像进门,卖出和仓位才决定你会不会被困在屋里。
一个入门版卖出条件可以这样定:
- 收盘价跌破 MA20,卖出。
- 买入后浮亏达到预设止损线,卖出。
- 普通股票遵守 T+1,买入当天不假装可以马上卖出。
仓位条件也要简单。比如“单只股票最多 20% 仓位”,意思是 10 万元本金里,单只股票最多用 2 万元。这样即使这条规则连续犯错,也不至于一次把账户打穿。
风险
方向性做法:第一条策略可以先用“突破 + 放量 + 均线”做买入条件,用“跌破均线 + 止损”做卖出条件。适用条件是你只想练习把规则写清楚;反例是把它当成任何行情都适用的赚钱机器;风险是横盘和假突破里会频繁买错,必须配合仓位控制。
把买入、卖出、仓位放在一起,策略才算有骨架:
def decide(row, holding, can_sell):
buy_signal = (
row["close"] > row["ma20"]
and row["close"] > row["high_close_10"]
and row["volume"] > row["avg_volume_5"] * 1.5
)
sell_signal = holding and can_sell and row["close"] < row["ma20"]
if not holding and buy_signal:
return "buy", 0.2
if sell_signal:
return "sell", 1.0
return "hold", 0这里的 0.2 代表用 20% 仓位买入,1.0 代表把当前持仓卖出。代码不是重点,重点是每个动作都有理由:为什么买、为什么卖、买多少、能不能卖。
新手最容易踩的坑
第一个坑,是偷看未来。比如用“未来 5 天最高价”判断今天要不要买,这在真实交易里根本不可能。程序如果偷看未来,结果会漂亮得不正常,但那不是能力,是作弊。
第二个坑,是把收盘后才知道的数据,当成盘中就能用。比如用当天收盘价判断买入,又假装自己当天已经按收盘价成交。真实交易里,你看到完整收盘价时,当天已经收盘了;如果规则用收盘价判断,成交假设就要写清楚,不能让程序偷偷占便宜。
第三个坑,是参数太多。MA5、MA10、MA20、放量倍数、止损线都能调,一不小心就变成“调到历史样本最好看”。主力不会按你的参数出牌,市场也不会因为你找到了漂亮组合就让路。
散户做策略容易被一两次成功吸引,越调越兴奋;老手更关心规则有没有犯低级错。真正该先检查的是:有没有偷看未来,有没有违反 T+1,有没有混用复权口径,有没有一上来就满仓。
大坑
不要把“代码能跑”当成“策略有效”。代码能跑,只说明语法大致没问题;规则是否合理,还要看数据口径、交易规则、成本、仓位和风险是否写清楚。
总结
量化策略规则就是把买入、卖出和仓位条件写成可执行逻辑。第一条策略不需要复杂,先做到四件事:买入条件清楚,卖出条件清楚,仓位条件清楚,不偷看未来、不违反 A 股交易规则。
自检 3 问:
- 为什么“涨了就买”不能直接当成量化策略规则?
- 用收盘价判断买入时,为什么要特别小心成交假设?
- 一条最小策略为什么必须同时写买入、卖出和仓位?
股市有风险,入市需谨慎。本文不构成任何投资建议。
本章新学到:量化策略规则。