Skip to content

写第一个策略:把买卖条件变成代码 ​

很多人第一次写量化策略,会急着追求“聪明”。其实第一条策略先别聪明,先要清楚。就像开店先把“什么情况进货、什么情况清库存、每次进多少”写成规矩,再谈生意做得多漂亮。

这是什么 ​

量化策略规则,就是把买入、卖出和仓位条件写成可执行逻辑。说人话,它像一张厨房出餐单:什么条件下开始炒,什么条件下停火,一锅最多放多少菜,都要写明白,不能靠临场感觉。

在程序里,一条最小策略通常拆成三块:

部分要回答的问题例子
买入条件什么情况下可以买收盘价站上 MA20,并且放量
卖出条件什么情况下要卖收盘价跌回 MA20 下方,或触发止损
仓位条件每次买多少每只股票最多用 20% 资金

本章只做第一条能看懂、能检查的小策略:用 A 股量化数据里的收盘价和成交量,配合均线与突破,写出一套清楚的量化策略规则。

经验

第一条策略的目标不是赚钱,而是把“想法”翻译成“规则”。规则能被自己复盘,才有资格继续改进。

为什么不能只写一句“涨了就买” ​

“涨了就买”听起来直观,但程序会追问很多细节。

涨多少算涨?站上哪条均线算强?突破的是哪一天的压力?成交量要不要放大?当天买入后,A 股普通股票通常 T+1,能不能同一天卖出?每次买满仓,还是只买一部分?

如果这些问题没写清楚,程序不会帮你补脑子,只会按你给的模糊规则乱跑。散户临盘时常说“感觉要突破了”,但量化交易不能靠感觉,要把“突破”拆成可检查的条件。

比如我们先定一个很朴素的买入条件:

  1. 当天收盘价高于 MA20。
  2. 当天收盘价高于过去 10 个交易日的最高收盘价。
  3. 当天成交量大于过去 5 个交易日平均成交量的 1.5 倍。

这三句话的意思是:价格站到中期均线上方,同时越过近期压力,还伴随放量。它不保证会涨,只是把“看起来比较强”改成了程序能判断的条件。

用一张教学样本表跑通 ​

以贵州茅台(600519,白酒行业,上交所主板,2001 年 8 月 27 日上市)为真实 A 股公司例子,但下面数字是教学样本,不代表它的真实历史行情。我们只用它说明数据长什么样、规则怎么落地。

datecodeclosevolumeavg_volume_5ma20high_close_10
2024-01-08SAMPLE98.008.1 万8.0 万97.2099.20
2024-01-09SAMPLE99.108.4 万8.1 万97.3599.20
2024-01-10SAMPLE100.3013.2 万8.5 万97.5099.20
2024-01-11SAMPLE101.0014.1 万9.2 万97.70100.30

在 2024-01-10 这一天,收盘价 100.30 高于 MA20 的 97.50,也高于过去 10 个交易日最高收盘价 99.20;如果过去 5 个交易日平均成交量约 8.5 万,那么 13.2 万就是放量。按这条规则,2024-01-10 会出现买入条件。

用 Python 写出来,可以先保持很直白:

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

这段逻辑没有神秘感:三个条件都满足,才给出买入提示。量化策略规则越早期,越应该这么朴素。你要能指着每一行说清楚:为什么是买,为什么不是买。

还有一个时间点要写清楚:如果用当天收盘价判断买入条件,通常应假设“收盘后生成信号,下一交易日再按可成交价格执行”,不能默认已经知道收盘结果后还按当天收盘价成交。

卖出和仓位也要写进规则 ​

只写买入条件,是很多新手的第一坑。买入像进门,卖出和仓位才决定你会不会被困在屋里。

一个入门版卖出条件可以这样定:

  1. 收盘价跌破 MA20,卖出。
  2. 买入后浮亏达到预设止损线,卖出。
  3. 普通股票遵守 T+1,买入当天不假装可以马上卖出。

仓位条件也要简单。比如“单只股票最多 20% 仓位”,意思是 10 万元本金里,单只股票最多用 2 万元。这样即使这条规则连续犯错,也不至于一次把账户打穿。

风险

方向性做法:第一条策略可以先用“突破 + 放量 + 均线”做买入条件,用“跌破均线 + 止损”做卖出条件。适用条件是你只想练习把规则写清楚;反例是把它当成任何行情都适用的赚钱机器;风险是横盘和假突破里会频繁买错,必须配合仓位控制。

把买入、卖出、仓位放在一起,策略才算有骨架:

python
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 问:

  1. 为什么“涨了就买”不能直接当成量化策略规则?
  2. 用收盘价判断买入时,为什么要特别小心成交假设?
  3. 一条最小策略为什么必须同时写买入、卖出和仓位?

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

本章新学到:量化策略规则。

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