第 7 课
指标亮了,就已经可以买了吗?
串起变量、指标、候选因子、候选信号、规则、最小策略与回测,明确每一站的职责和边界。
蛙兄关掉了大部分指标,只留下跳泡可乐的虚构收盘价和一条二十日均线。
屏幕终于清爽了。
就在这时,价格从均线下方穿到了上方。
行情软件亮起一个向上的箭头:
价格上穿二十日均线
蛙兄把鼠标移到“买入”按钮上。
蛙博士问:“你准备什么时候买?”
“就现在。”
“现在是收盘前,还是收盘后?”
蛙兄停了一下。
蛙博士又问:“买了以后,什么时候卖?”
蛙兄把鼠标慢慢移开。
箭头看起来像一个答案。
可才问了两个问题,答案就开始漏风了。

先别急着买,我们还在研究链的中间
上一章里,我们说指标只是对已有记录的加工。
二十日均线算出来了,说明程序成功制作了一把尺子。
价格上穿均线,说明我们又定义了一个可以在具体日期判断的事件。
但“尺子做好了”“事件发生了”“值得交易”和“拥有一套策略”,不是同一句话。
这一章不再增加新指标。
我们只沿着这条均线,把几个经常挤在一起的词拆开。
收盘价负责留下记录
跳泡可乐每天都有一个收盘价。
它会随着日期变化,也会随着股票变化。
这种会随着研究对象或时间取得不同数值的东西,可以叫作变量。
变量的工作很朴素:把我们准备研究的某一面记录下来。
它暂时没有表达“好”“坏”“应该买”或“应该卖”。
十元只是十元。
均线负责整理记录
把最近二十个交易日的收盘价放在一起求平均,我们得到二十日均线。
它是一个指标。
这里的“二十日”只是教学例子,不是推荐参数。
指标比原始收盘价多做了一步加工,但仍然只是在描述已经进入计算的历史记录。
它不会因为名字里有“二十日”,就知道第二十一天会发生什么。
相对位置开始承担候选因子的工作
接下来,我们可以继续问:
价格在均线上方时,后来的表现是否与价格在均线下方时不同?
为了比较,我们需要记录价格相对均线的位置。
最简单的版本可以只有“上方”和“下方”。也可以把距离写成一个连续数字。
到了这里,这项特征开始承担候选因子的工作。
本课程暂时使用下面这套大白话定义:
候选因子,是我们准备系统地拿来解释、比较或预测研究结果的一项可测特征。
“候选”两个字很重要。
它只表示这项特征准备接受检查,不表示它已经有效,更不表示它是价格变化的原因。
如果我们只是把二十日均线画在屏幕上,它首先是一项指标。
当我们开始系统比较“价格相对均线的位置”与后来结果之间有没有关系,这项特征才在当前研究中承担候选因子的职责。
同一个数字可以出现在不同环节。它叫什么,除了看计算方式,也要看它在研究中负责什么。
上穿事件只负责标出一个时点
现在再看蛙兄发现的箭头。
我们可以把“由下向上穿过均线”写得更明确一点:
前一个交易日:收盘价不高于当日二十日均线
当前交易日:收盘价高于当日二十日均线
两个条件同时成立,我们就在当前交易日记下一个事件。
这可以叫作一个候选信号。
候选信号的主要工作,是回答:
明确条件是否在某个时点发生了?
它把一段连续变化,变成一个可以标在日历上的日期。
但它仍然只是行动候选。
它还没有证明这个时点值得买,也没有告诉我们应该怎样买。

一个信号,没回答的问题比想象中多
蛙兄看着箭头问:
“既然已经叫信号了,为什么还不能回测?”
因为一个箭头只告诉我们“这里发生了某件事”。
它没有告诉程序接下来该怎样处理。
- 研究哪些股票? 2. 什么时候才能确认信号已经出现? 3. 使用什么价格进入? 4. 什么时候、按什么条件退出? 5. 连续或重复信号怎样处理? 6. 停牌、涨跌停或缺失数据怎样处理? 7. 费用和可能的成交价偏差怎样计算? 8. 每次机会使用什么统一仓位假设?
这些空格不填,程序就只能替我们猜。
而程序每猜一次,研究问题就可能悄悄换一个版本。
比如,我们用当天收盘价确认上穿以后,不能又假装自己早已知道这个收盘价,并毫无困难地按同一个价格成交。
决策时点知道什么、订单何时发出、历史数据能否代表实际成交,必须前后一致。
在 A 股案例里,停牌和涨跌停等市场状态还可能让“理论上想买”与“实际上能成交”不是一回事。其他市场也有各自的交易时间、订单和成交限制。

每填清一个空格,我们就多了一条规则
规则没有神秘之处。
它只是把“遇到这种情况怎么办”写清楚。
例如,研究者以后需要明确:
- 信号使用哪些信息确认;
- 信号出现以后,从哪个可执行时点开始处理;
- 满足什么条件结束一次观察或持有;
- 多个机会撞在一起时采用什么一致做法;
- 不可交易和数据异常时怎样记录。
这里故意没有替你填具体答案。
因为这一章的任务不是偷偷送出一套均线交易法,而是让我们看见:信号只负责按铃,规则才说明听见铃以后怎么办。
多条规则前后一致,才组成最小策略
当进入、退出、重复信号、交易限制、成本和仓位假设都写清楚以后,程序终于可以从头到尾照着执行。
这组能够被完整执行的规则,可以组成一套最小策略。
“策略”在这里不等于“赚钱方法”。
它只表示处理说明已经足够完整:同一份历史数据交给同一段程序,程序知道每一步该做什么。
一套策略完全可能定义清楚,却表现很差。
这不矛盾。
规则完整解决的是“能不能一致执行”,不是“执行以后会不会赚钱”。
为什么回测仍然需要仓位假设?
只要我们想把多次历史机会合成一条收益曲线,就必须说明每次使用多少研究资金。
否则,一次上涨究竟为整个研究账户贡献多少收益,程序无法计算。
因此,后面的课程会使用简单、统一的仓位假设。
它的作用是让不同规则可以放在同一把尺子上比较。
这不等于课程在教你建立适合个人资金、风险承受能力和真实生活需求的仓位系统。
前者是研究条件,后者是完整的投资决策问题。我们的核心课程先停在前者。
回测是一场历史彩排
规则和最小策略准备好以后,才能进入回测。
回测会把历史数据按时间顺序交给程序,让它模拟:
如果当时只能看到当时已经出现的信息,
并一直按照这套规则处理,
历史上会发生什么?
所以,回测更像一场历史彩排。
舞台、演员和过去发生过的天气都已经留下记录。我们可以检查规则在这段历史里怎样运行。
但剧院后面那扇写着“未来”的门,仍然关着。
回测不能从门缝里偷看下一场。

回测回答的是:过去按照当前数据和规则模拟,会得到什么结果。
它不回答:未来一定会不会赚钱。
漂亮结果,也可能是研究过程化了妆
一条回测曲线很好看,不代表程序撒谎。
程序可能非常认真地执行了一套有问题的研究定义。
常见麻烦包括:
- **偷看未来:**把当时还不知道的数据提前交给了策略;
- **只留下幸存者:**使用今天仍然存在的股票,漏掉历史中已经退市或被排除的对象;
- **反复挑答案:**不停更换窗口、条件和参数,只保留最好看的一组;
- **忘记摩擦:**没有计算手续费、滑点或实际无法成交的情况;
- **把运气当规律:**一段历史刚好配合当前规则,换个时期可能消失。
后面的实战课会一点点检查这些问题。
现在只要先记住:程序运行成功,只能证明程序完成了某种计算;它没有自动证明研究设计正确。
七个名字,各自只负责一站
最后,把这一章的词重新排成一条队:
| 名称 | 在当前课程里的工作 | | -------- | ------------------------------------------------------------------ | | 变量 | 记录会随对象或时间变化的内容,例如每日收盘价 | | 指标 | 按明确方法加工已有记录,例如二十日均线 | | 候选因子 | 等待系统检查、用于解释或比较结果的可测特征,例如价格相对均线的位置 | | 候选信号 | 在具体时点满足明确条件的行动候选,例如价格由下向上穿过均线 | | 规则 | 说明信号出现以后,各种情况怎样一致处理 | | 最小策略 | 把多条规则组成程序能够完整执行的说明 | | 回测 | 在历史数据中模拟这套策略,并记录过去发生了什么 |
这张表不是金融行业唯一允许使用的词典。
它是我们后续实验的工作地图。
以后只要有人说“这个因子出了买入信号,策略有效”,我们就能停下来问:
他说的是哪一站?
中间还有哪些站被跳过去了?
下一站:把研究零件装成完整路线
蛙兄再次看向屏幕上的向上箭头。
这一次,他没有点击买入。
他在箭头旁边写下了一句话:
这里出现了一个可以继续研究的日期。
蛙博士点了点头。
箭头没有消失,只是回到了它应该待的位置。
下一章,我们把已经认识的这些零件装成一条完整路线,看看后面的实战究竟准备怎样走。
本章参考资料
资料核对日期:2026-08-14
- CFA Institute:Active Equity Investing—Strategies,用于核对量化主动投资从投资论点、数据处理、回测、评估到风险和成本处理的基本位置,以及常见研究陷阱;
- QuantConnect:Backtesting,用于核对回测是在历史数据中模拟交易算法、衡量其过去表现的基本定义;
- QuantConnect:Research Guide,用于核对前视偏差、幸存者偏差、过拟合和反复挑选参数可能扭曲历史结果;
- QuantConnect:Trading and Orders,用于核对费用、滑点和成交模型会影响回测与实际执行的一致性。
跳泡可乐、价格、均线、箭头和全部交易情节均为虚构教学案例,不对应真实公司、股票、收益或策略。二十日均线仅用于串联概念,不是参数推荐。金融行业对因子、信号和策略存在不同定义,本章采用的是后续课程内部保持一致的工作定义。本章不提供买卖信号、仓位建议或投资建议。
课后讨论
留下你的问题、理解或不同意见,也看看其他学习者怎么想。