前言|一个容易被误读的“停止线”
研究者给策略设了10%的回撤停止线,以为账户最多亏到这里。某天收盘,净值已经跌到线下;系统安排次日减仓,第二天却遇到跳空。卖出之前,账户继续下跌。看着超过10%的实际回撤,他的第一反应可能是:“风控没有生效。”
但这句话可能把三个时刻当成了一个:发现风险、决定处置、实际成交。规则正确触发,不代表损失停在触发位置;订单生成,也不代表仓位已经降下来。反过来,净值变得平稳,也可能只是账户清仓后再也没有重新入场。
第十篇讨论后续观察要每天留证。本篇专门审查风险规则本身:**它避免了什么,又牺牲了什么?**仍沿用本系列的动量策略,设计不设回撤处置、停止常规调仓、降低仓位、清仓四组比较。文中的金额仅为手工教学数字,没有运行新的四组实验,也不预设任何一种处置必然更好。
目录
- 前言|一个容易被误读的“停止线”
- 01|回撤线从哪里量,损失又到哪里停
- 02|三个按钮,不是同一种风控
- 03|四次回测,尽量只改变回撤处置
- 04|触发以后,追到订单与实际持仓
- 05|少亏了多少,也要看少赚了多少
- 06|清仓之后,凭什么重新入场
- 07|回撤阈值也会被历史成绩诱惑
- 08|怎样写一份不过界的风控结论
- 关于本文的研究口径
- 参考资料
01|回撤线从哪里量,损失又到哪里停
回撤不是从最初本金开始算的每一笔亏损,而是当前总资产相对此前最高总资产的下降。账户先从100涨到120,再跌到108,回撤是10%;相对最初本金,它仍盈利8%。这两个数各有用途,不能把“本金没亏”当作“没有回撤”。
平台按每日收盘估值更新资产高点,再计算当日回撤。设账户资产为E t E_tEt,此前至当日的最高资产为H t H_tHt:
H t = max s ≤ t E s , D t = E t H t − 1 H_t=\max_{s\leq t}E_s,\qquad D_t=\frac{E_t}{H_t}-1Ht=s≤tmaxEs,Dt=HtEt−1
D t D_tDt为负数表示处于回撤中。若设置正数d dd为停止线,在D t ≤ − d D_t\leq-dDt≤−d时触发。这里比较的是收盘后的账户资产,不是盘中每一笔报价,也不是某只股票从买入价下跌多少。
图1:独立教学算例。资产高点100,触发日收盘90,假定次日开盘全仓资产再跌10%到81。忽略税费与滑点,回撤已为19%;这些数字不是平台实测。
图1不需要程序出错也会发生。触发日收盘时,账面资产90;次日开盘才模拟卖出,开盘前后价格已经不同。假设账户完全持有股票、没有现金,股票整体再下跌10%,就剩81。即使此时全部成交,触发线10%也没把回撤封顶在10%。
如果之后遇到停牌、开盘跌停、可卖数量不足或成交额参与率限制,还可能无法一次卖完。**停止线规定的是何时采取行动,不规定市场给我们什么成交价。**研究风控的第一张图,应先把这个时间差画出来。
02|三个按钮,不是同一种风控
平台在回撤触发后提供“停止新开仓”“自动降低仓位”“自动清仓”。名称容易懂,实际行为却需要查明。
图2:按当前实现绘制。“停止新开仓”在本项目中会跳过常规调仓,不是仅删掉买单。
停止新开仓。当前引擎检测到这一动作后,直接跳过当天后续策略调仓流程,普通买单与卖单都不会照常生成。已有持仓仍承受市场波动。不能把它理解成“买入暂停,策略卖出仍正常继续”。日常风险纠偏也可能受这一分支影响,必须查看实际事件和持仓。
自动降低仓位。平台主要按现有持仓生成缩减目标,使总仓位不高于所设上限,并结合其他仓位限制。它不自动寻找更安全的替代股票,也不会把仓位本来低于上限的账户抬高到上限。目标仓位与成交后的实际仓位之间,仍隔着整手、价格与流动性。
自动清仓。目标股票持仓变为空,订单生成器据此安排卖出。清仓是目标,不是订单发出瞬间已全部卖掉。未成交的剩余持仓仍要每天估值,并继续接受风险检查。
还有一个会影响实验解释的细节:每日风险检查有先后顺序。单日亏损限制、行业资料缺失等条件,可能先返回暂停委托,使当日没有走到回撤清仓分支。四组输入中的其他风险参数即使一样,也可能与不同账户路径发生交互。因此报告应说“在这些共同约束下比较回撤动作”,而不声称其他风控绝对没起作用。
03|四次回测,尽量只改变回撤处置
沿用同一动量策略,固定日期、股票资格、参数、初始资金、调仓周期、组合方式、成本与成交约束。总仓位、单股权重、行业、单日亏损和换手等规则也要保持一致,然后安排四组:
| 组别 | 回撤设置 | 比较的问题 |
|---|---|---|
| A | 保留其他风控,将回撤线设为100% | 常规正资产情况下,不触发回撤处置的基准 |
| B | 预先登记同一回撤线,停止新开仓 | 当前实现的暂停常规调仓有何后果? |
| C | 同一回撤线,降低仓位 | 减少风险敞口以后,损失与机会怎样变? |
| D | 同一回撤线,清仓 | 退出股票以后,账户如何演变? |
图3:实验方案,未运行。A组不关闭全部风控;100%也不是专门的“关闭回撤控制”开关。
为什么不把A组的“启用风控”直接取消?因为那会同时取消仓位与其他限制,比较对象就不再只差回撤规则。100%是在保持其他风控时的基准设置;若出现资产归零等边界情况,应另查,不把它当成任何状态都永不触发的专用模式。
四组完整回测开始时参数相同,触发后持仓路径就会分开。此后各组的资产高点、回撤和触发日期也可能不同。这正是整套规则的后果,不应强行令它们在同一天卖出。同一事件窗口的详细比较可以另做,但不能代替四组完整路径。
最好事先登记一个主要目的。例如希望减少深回撤,同时接受一定的收益牺牲,就应将回撤、收益损失、空仓时间和未成交放在一起评价。若看完结果才把评价标准换成某组最擅长的指标,风控实验也会变成挑历史赢家。
04|触发以后,追到订单与实际持仓
完整证据链至少包含触发日的资产高点与回撤、当日风险事件、下一交易日的目标和订单、成交或拒单、成交后的持仓。净值线只能告诉我们结果,无法证明风险规则在哪一步起作用。
图4:日频执行路径。风控订单仍走成交模型,没有独立的“强制按止损价卖出”通道。
当前日常风险调整优先于普通策略调仓;强制纠偏没有先套普通调仓换手约束,但仍受实际可卖数量、交易状态、开盘价、费用、滑点和参与率限制。不能把“优先”理解成“必定成交”。若触发发生在回测最后一天,也没有后续交易日供它执行。
未成交还要继续追。当前引擎没有把每张未完成旧单自动跨日滚动的机制;若后续收盘检查仍要求调整,会基于新的持仓和价格生成新订单。旧单的剩余数量、新单的数量、最终卖掉多少,要分别核对。不能简单统计“系统每天发过清仓事件”,就说清仓已完成。
触发次数也不是日志的行数。平台每天检查实际持仓,调仓时还检查目标组合,一天可能有多条风险记录。账户连续在线下十天,并不自动代表十次独立风险冲击。若研究要数“回撤事件”,可事先定义为从线内进入线下的一段,直到回到线内才结束,并保留观察结束仍未结束的段。否则日志多的方案可能被误读为风险更多,实际只是同一个问题持续没有解决。
实际仓位本身也会随着价格和资产总额变化。卖出一些股票后,剩余股票再上涨,仓位可能回到上限附近;若仍跌,账户回撤可能继续扩大。有效的风控报告要展示每日实际仓位,而不是只在配置图上圈出“降到50%”一行。50%若被使用,也应是登记的目标,不是保证值,更不是本文推荐参数。
05|少亏了多少,也要看少赚了多少
如果风控组的最大回撤变小,下一句不该直接是“策略升级成功”。先看它付出的代价:是否长期空仓,是否卖出后错过反弹,是否增加了费用,是否因为可成交性限制才恰好少持有了后来下跌的股票。
图5:评价维度示意。少亏与少赚都是需要查证的相对结果,不是既定事实。
最大回撤是一项重要指标,却容易被“提前退出此后全部行情”改善。若D组早早清仓,后来净值几乎横着走,它的低波动只说明账户不再承担股票风险。读者还需要看到同期基准、股票参与时间、现金比例和收益差,才知道这是否符合研究目标。
收益不能只看末端,风险也不能只看最深一点。报告至少并列累计净收益、最大回撤、回撤持续时间、平均仓位、空仓天数、交易成本和成交缺口。研究目标若关心下跌期保护,可进一步列出登记的事件窗口;若主要依赖一个窗口,结论也应限定在那个窗口。
还可以追问:改善是否主要来自“少持有股票”,而不是特别准确地避开下跌?若需要支持后一个主张,可另设事先登记的较低固定仓位方案,观察同样减少市场敞口时会怎样。不过这属于新增对照,不能偷换本篇四组。现金比例不同会自然改变波动;低风险并不能单独证明退出时点有预测力,也不能把收益除以平均仓位就当成严格公平的比较。
Kaminski与Lo研究止损规则如何增加或减少组合的收益与波动,提醒我们将退出规则当成一种需要评价的投资决策。[1] 其样本和规则并非本项目的A股动量策略;本文不借论文预告清仓优于降仓,只借它确认问题应同时包含效果与代价。
06|清仓之后,凭什么重新入场
卖出是风控故事的一半,另一半是什么时候再买。当前平台并没有独立的“冷静几天后重新入场”或“清仓后重置资产高点”规则。只要回撤仍在线下,普通策略目标仍可能被回撤检查拒绝。
图6:按当前实现分析的条件路径。没有新增现金变化等因素时,线下清仓账户可能长期保持空仓。
假设清仓后账户只剩现金,资产仍低于停止线,且没有额外资金变化、待收款入账或现金收益。市场反弹并不会自动增加它的现金,原来的回撤也不会自己改善。普通买入继续被拒,账户便可能长时间停在那里。这不是“市场没有给出买点”的充分证据,而是退出规则缺少能让账户恢复交易的机制。
停止常规调仓和降仓组则不同:它们通常还持有股票,价格回升可能把回撤带回线内,之后才可能按正常流程恢复。不过恢复不是发生在任意盘中时点;还要考虑收盘检查、调仓日期及其他风险限制,不能画成碰到线就立即全仓买回。
恢复指标也要讲清含义。“重新产生订单”“恢复股票仓位”“总资产回到历史高点”是三个日期。观察结束仍未发生时,应标为“尚未恢复”,不能填成0天。若跌去比例L LL,单从数学上回到原高点,需要在剩余资产基础上增长:
G = L 1 − L G=\frac{L}{1-L}G=1−LL
下跌20%需要随后上涨25%才能回到原点;这不说明清仓账户会得到那25%。若研究者另加再入场规则,应登记为新方案并重新验证,不能悄悄将它补进本篇现有四组。
07|回撤阈值也会被历史成绩诱惑
10%、15%还是20%,并非只差一个数字。阈值会决定触发日期,继而改变持仓、现金、后续高点和再入场条件。一条刚好避开某次大跌的回撤线,在另一段震荡里也可能频繁退出,或在反弹前把账户停在场外。
图7:研究流程。阈值、降仓目标、再入场规则及选择标准都应记录;未开展新的参数实验。
第五篇对参数选择的要求,在这里原样适用:先登记候选范围和主要目标,在训练期选择阈值与动作,再冻结后检验未见时期。若阈值与降仓目标一起尝试,全部组合都应保留;不能只展示一个“最佳止损方案”。
还要区分初始持仓。从历史开始一路运行到测试期,会把此前账户高点和风险状态带过来;在测试期第一天另建现金账户,则重新开始计算高点。两种设计回答不同问题,不能在结果出来后选择更漂亮的一种。本篇的四组全路径比较与后来开展的训练/测试实验,也应分别登记。
回撤线不是越紧越专业。是否值得接受收益牺牲,取决于研究目标、成交条件和稳定的后续证据。本文的10%和20%只是解释数字,不构成适合读者账户的参数建议。
08|怎样写一份不过界的风控结论
图8:空白对照表。净收益、回撤、空仓、成本与恢复情况,均待真实实验填写。
一份有用的结论,应该让读者看到四件事:哪些处置确实触发了,实际仓位有没有改变,相对基准改善或损失了什么,后续是否能恢复正常交易。若缺订单与风险事件记录,只能讨论净值差异,不足以解释机制。
“清仓组最大回撤较小,但随后长期空仓、没有重新入场机制”是完整的信息。“降仓组净收益较低,但满足事先登记的回撤目标”也可能是符合研究目的的结果。相反,若成本增加而风险没有得到预期改善,就应保留不利结论,不继续调阈值直到它看起来有用。
本篇最想澄清的,是风控并不站在策略之外施加一个神奇保护罩。它会改变下一步持仓,也会改变往后每一天的机会与风险。只有把触发、成交、恢复和代价连起来,回撤停止线才从一个令人安心的数字,变成一条可以认真评价的规则。
关于本文的研究口径
本文没有运行四组风控实验或修改项目风险配置。图1的100、90、81为独立手工算例,20%下跌需25%恢复为数学示例;图8留白。所有示意图不代表本项目策略净收益、风控效果或成交概率。
本地实现核对:收盘估值更新账户历史资产高点与回撤,每日风控先检查部分其他条件,再按回撤动作处理。stop_new跳过当日常规策略调仓;reduce调整现有持仓目标;liquidate目标为空。纠偏优先于普通调仓,但仍通过次日开盘成交模型,受交易状态、可卖数量、流动性与费用等限制。未完成旧单未自动跨日滚动,后续日检可重新生成调整单。目标组合检查仍会拒绝处于回撤线下的普通策略目标,未实现独立的冷静期、重新入场或高点重置机制。
A组100%回撤线是正资产常规范围下的比较设置,不是关闭全部风控,也不是专用的无回撤控制开关。其他风控有顺序和交互,四组应记录共同约束及优先触发事件。“恢复”需要分别报告交易、仓位和历史高点恢复;观察结束尚未恢复时不能视为0天。正文机制结论来自实现核对,绩效结论仍待真实运行。
文中“回撤更小”指损失幅度更小;若页面用负数展示,应按幅度解释,避免把更负的数字误说成改善。风险日志条数、回撤事件段数和实际减仓次数也不是同一统计量。
参考资料
Kaminski, K. M., & Lo, A. W. (2014).When do stop-loss rules stop losses?Journal of Financial Markets, 18, 234–254. MIT公开稿与发表信息。用于说明应评价退出规则对收益、波动的增减;其期货样本与退出政策不等同于本文策略。
本系列第五篇:《最好的参数,为什么未必值得选?》。阈值选择、尝试记录与后续检验同样属于参数研究。
本系列第十篇:《回测通过以后,策略就能上场吗?》。方案冻结、每日留证与异常记录,是验证风险规则的基础。