Skip to content

2015—2016 年股灾无上帝视角回放:机械加仓规则第二次验证 ​

1. 这一次验证的不是原始规则 ​

2008年的第一次回放结束以后,原始方案暴露出了几个明显问题。

其中最重要的是:

Start不能只由价格决定。

2008年真正建立Start时,上证已经从6124跌到1802附近。

这时候价格空间已经非常深,但随后按照Start再跌10%、20%、30%加仓的规则,却几乎没有获得继续部署资金的机会。

因此,第一次验证以后,我只做了有限修正:

  • Start仍然保持很小;
  • Start之后的 -10% / -20% / -30% 机械档位暂时不改;
  • 但Start本身不再只看价格;
  • 开始观察金融系统压力、被迫卖出状态、政策变化;
  • 尤其关注国家资本是否已经被公开确认实际进入二级市场。

其中最后一条来自2008的直接经验。

2008让我意识到:

“宣布准备买”和“已经实际买入”不是同一种信息。

所以到了2015年,我带着这套经过一次修正、但仍然保留大量原始结构的规则,重新进入第二个历史样本。

这一次仍然不是为了证明规则正确。

我要继续问:

2015—2016还能从哪里把它打坏?

2. 实验方法保持不变 ​

这次仍然采用和2008相同的方法。

不是自己打开完整历史K线寻找关键位置,而是:

由AI推进时间并提供截至当时能够获得的信息,我负责回答是否买入以及为什么。

决定作出后冻结,再继续向后推进。

和2008一样,这种方法并不是严格盲测。

AI知道完整历史,因此节点选择本身仍可能存在后视偏差。

这里所谓的“无上帝视角”,仍然只取一个有限含义:

我作出具体决策时,不使用尚未发生的价格和事件。

2015—2016这个历史样本一旦走完,以后也只能作为研究数据使用,不能再重新声称是在进行第一次未知决策。

3. 本轮实验条件 ​

实验资金仍然设定为:

50万元自有资金。

不使用:

  • 融资;
  • 期货;
  • 期权。

这一轮已经可以直接使用实际存在的沪深300ETF:

510300。

市场状态主要观察:

  • 上证综指;
  • 沪深300。

实际交易:

510300。

2008留下来的机械规则仍然是:

条件操作
Start极小仓位建立起点
Start -10%第一次机械加仓
Start -20%第二次机械加仓
Start -30%第三次机械加仓

这一轮开始之前,我对价格本身还有一个比较明显的心理判断:

上证3000点以下,才是我真正觉得足够便宜的区域。

但是2008已经告诉我,Start不能只由价格决定。

因此,如果出现足够强的新信息,尤其是:

公开确认国家资本已经实际通过二级市场买入,

允许在3000点以上提前建立一个很小的Start。

4. 2015年6月:高位开始下跌 ​

4.1 2015年6月12日:盘中5178点附近 ​

2015年6月12日,上证综指盘中最高达到5178.19点,当日收盘5166.35点。

这时候即使不考虑后来发生的股灾,我也不会开始买入。

原因和2007年的6124有些类似:

价格本身处于一轮大幅上涨后的高位。

当时经济数据虽然并不算特别强,但也还没有出现一个足以让我把高位价格理解成“深度机会”的危机状态。

与此同时,市场杠杆问题已经越来越明显。

场内融资融券之外,还有大量场外配资和高杠杆账户。

因此:

我的决定:不建立Start。

4.2 6月中下旬:开始出现强制去杠杆 ​

随后市场迅速下跌。

6月15日至19日,上证一周跌幅超过13%。

这时候我开始关注的已经不只是价格。

另一个问题变得越来越重要:

有多少卖盘不是因为投资者觉得股票贵了,而是因为杠杆账户已经承受不了?

如果账户触及平仓线,那么持有人即使主观上认为股票已经便宜,也可能不得不卖。

这正是2008以后开始关注的“被迫卖出”。

市场开始出现:

下跌→杠杆压力→强制减仓→继续下跌

这样的反馈。

但这时候价格仍然远高于我原本关注的3000附近。

我的决定:继续等待。

4.3 6月26日:单日暴跌,但仍然不Start ​

6月26日,上证出现超过7%的单日下跌。

市场已经非常剧烈。

但此时指数仍在4000点以上。

这给我带来了一个后来会越来越重要的问题:

单日跌得非常惨,是否本身就应该成为买入条件?

当时我的答案仍然是否定的。

因为:

一天跌7%,并不意味着整体价格已经足够低。

所以即使当天市场情绪和跌停数量都非常极端,我仍然不愿意因为“一天跌得很多”就建立仓位。

我的决定:不买。

5. 7月初:危机状态开始明显改变 ​

5.1 7月3日:上证3687附近 ​

到7月3日,上证已经跌到3686.92点附近。

如果以6月12日盘中高点5178.19点为基准,到7月3日3686.92点,跌幅已经接近30%。

到了这里,价格已经明显低于一个月前。

但如果只问:

“3687是不是我理想中的深度买入区?”

我的答案仍然是:

不是。

我原本更关注3000以下。

因此,单纯按照价格,我仍然不会建立Start。

但接下来的周末出现了新的信息。

5.2 7月4日:1200亿元蓝筹ETF计划 ​

7月4日,21家证券公司联合公告,决定按2015年6月底净资产的15%出资,合计不低于1200亿元,用于投资蓝筹股ETF;同时表示在上证4500点以下,自营股票盘不减持并择机增持。

这是一个很强的市场稳定信号。

但按照2008以后形成的认识,我仍然要区分:

准备投入资金

和:

已经确认真实资金进入市场。

所以单独看到这一条,我会明显提高关注,但还不一定立即改变原来的3000点心理锚。

5.3 7月5日:汇金确认已经买入ETF ​

7月5日,中央汇金公开确认:

近期已经在二级市场买入ETF,并将继续相关市场操作。

这和7月4日的信息出现了区别。

现在已经不只是:

“准备救市。”

而是:

公开确认真实资金已经通过二级市场进入ETF。

这正好触发了2008回放以后新增的那条规则。

我原本想等待上证3000点以下。

但现在出现了一种2008已经证明值得单独观察的信息:

国家资本实际成交。

因此,我改变了决定。

不是因为我认为:

“这里就是底。”

也不是因为:

“国家队买了,所以一定会上涨。”

而是认为:

现在已经具备提前建立一个极小Start的资格。

我的决定 ​

2015年7月6日开盘建立Start,买入510300共100股。

6. 7月6日:Start当天就触发第一档 ​

7月6日,510300开盘约3.561。

因此:

Start=3.561

买入:

100股。

按照仍然没有修改的机械规则:

3.561×90%=3.2049

所以第一档 -10% 大约是:

3.205。

但当天出现了一个非常有意思的情况。

510300开盘3.561以后迅速回落,盘中最低达到约3.166。

也就是说:

Start建立当天,-10%机械档位就被击穿了。

这里出现一个实际执行问题:

Start当天能不能再次触发机械加仓?

我的答案是:

可以。

既然规则定义的是价格触发,而不是“每天最多一个档位”,那么不能因为Start恰好发生在当天早上,就假装后面的价格没有发生。

我的决定 ​

在约3.205附近:

继续买入500股。

因此此时累计持有:

100+500=600股

下一档变成:

3.561×80%=2.8488

也就是:

约2.849。

再下一档:

3.561×70%=2.4927

也就是:

约2.493。

从这里开始,重新进入等待。

7. 7月7日至7月9日:价格之外,第一次真正看到流动性压力 ​

7.1 跌停已经不只是价格现象 ​

7月7日前后,市场出现上千只股票跌停。

如果只看上证指数,这只是一个跌幅数字。

但当大量股票同时失去流动性以后,问题已经发生变化:

即使有人想卖,也未必卖得出去。

这使“跌停家数”开始变成我认为值得单独观察的指标。

它不再只是描述:

今天市场跌得有多惨。

更重要的是帮助观察:

流动性是不是正在大面积消失。

7.2 大量停牌又带来了第二个问题 ​

随后越来越多上市公司申请停牌。

7月8日前后,停牌股票数量一度达到整个A股相当高的比例;当时公开报道也记录了市场出现大规模停牌。

这让我意识到:

停牌比例本身也应该成为危机压力指标。

因为如果大量股票根本不交易,那么:

  • 指数可能不能完整表达压力;
  • 可交易股票可能承担更多卖盘;
  • “指数没有继续暴跌”也未必等于市场已经恢复正常。

所以到这里,除了价格以外,我开始明确想增加几个观察量:

  • 跌停家数;
  • 停牌家数;
  • 停牌占全部A股的比例。

7.3 融资余额开始成为第三个核心指标 ​

与此同时,融资余额快速下降。

这非常符合“被迫卖出”的思路。

融资余额持续大幅下降意味着:

杠杆资金正在主动或被动退出。

于是我开始认为:

单独观察跌幅还不够。

还应该观察:

融资余额变化

尤其是:

每天到底减少多少。

因为如果融资余额还在连续快速下降,就说明去杠杆过程可能还没有结束。

8. 7月9日以后:第一次看到“卖压可能开始减弱” ​

7月9日市场出现大幅反弹。

与此同时,一个很有意思的变化发生了:

融资余额虽然还在下降,但下降速度开始明显减弱。

接下来甚至出现短暂企稳。

这让我第一次产生了一种和“价格见底”不同的想法:

也许更值得观察的,不是指数有没有到最低点,而是强制卖出的速度有没有开始下降。

换句话说:

被迫卖出还存在

和:

被迫卖出正在加速

不是同一种状态。

如果原来每天都在极快去杠杆,随后去杠杆速度显著下降,这可能意味着:

最猛烈的流动性反馈正在暂时减弱。

但这里仍然不能得出:

“危机结束。”

后面的行情很快证明,这种判断如果过早使用同样会有问题。

9. 7月27日:又一次极端单日暴跌,但旧规则什么都不做 ​

7月中旬以后,市场一度明显反弹。

到7月27日,上证再次出现超过8%的大跌,大量股票跌停。

510300当天最低约3.138。

但是Start的第二档仍然是:

2.849

因此:

3.138>2.849

机械规则没有触发。

这里第一次非常明显地暴露出一个新问题。

7月27日在市场体验上已经属于非常极端的一天。

但对于原规则来说:

只要累计跌幅没有达到Start -20%,这一天和一个普通的-1%下跌没有区别。

它们在系统里都得到同一个答案:

不买。

这让我开始怀疑:

累计跌幅是不是遗漏了“单日冲击”这个独立维度?

10. 8月24日至25日:同样的问题再次出现 ​

8月下旬,市场又经历一轮极端下跌。

8月24日,上证单日跌幅超过8%。

510300当天最低约3.263。

仍然高于:

2.849

所以:

不触发。

8月25日,上证再次大跌。

510300最低约2.974。

已经越来越接近2.849,但仍然没有穿过。

因此:

还是不触发。

这就出现了一个越来越明显的现象。

市场已经连续出现:

  • 大规模跌停;
  • 巨大单日跌幅;
  • 杠杆资金快速退出;
  • 极端市场恐慌。

但机械规则仍然只有一句:

没有到-20%。

这和2008的1665问题其实很相似。

只是这一次表现得更加明显。

11. 一个新问题:是不是应该“暴跌就买”? ​

看到7月27日、8月24日、8月25日以后,一个非常自然的修正想法出现了:

既然单日极端暴跌包含重要信息,是不是当天跌7%、8%就额外买一次?

这个想法看起来合理。

但继续思考以后,很快又发现它存在新的漏洞。

假设市场走成:

−7%→+6%→−8%→+8%→−8%→+9%

价格可能一直在差不多的区域震荡。

如果规则变成:

“每次单日跌7%以上就买。”

那么可能出现:

在同一个价格区域反复买入。

这实际上就是另一种形式的重复触发。

因此:

单日暴跌值得观察,但不能无限重复触发

这成为第二次实验暴露出的一个新问题。

12. 进入2016:旧规则仍然异常迟钝 ​

12.1 1月4日:熔断第一次触发 ​

2016年1月4日,指数熔断机制正式实施。

当天市场先触发5%暂停,恢复交易以后很快继续下跌并触发7%阈值,当日提前结束交易。

市场中再次出现大量跌停。

但510300当天最低约3.528。

和Start相比仍然没有进入第二档。

所以机械规则继续给出:

不买。

12.2 1月7日:熔断再次触发 ​

1月7日,市场开盘后很快再次触发5%和7%的熔断阈值,当天交易很快结束。

随后从1月8日起暂停实施指数熔断机制。

这是一个非常有意思的制度案例。

原本设计熔断,是为了缓解极端波动。

但在真实交易中,临近熔断阈值可能反而改变投资者行为:

如果大家担心一旦触发以后卖不出去,就可能提前卖。

这让我再次意识到:

市场制度本身也会反过来影响卖出机制。

但从机械加仓规则看:

仍然没有动作。

13. 1月26日前后:距离第二档越来越近 ​

1月26日,上证再次大跌超过6%。

510300最低约2.930。

而第二档仍然是:

2.849

距离已经非常近。

如果当时我们使用的是5%一级:

Start×85%=3.561×0.85≈3.027

那么-15%档早已经触发。

但旧规则仍然只有:

没到-20%,继续等。

这时候10%一级的迟钝已经非常直观。

14. 2016年1月底:第二档终于获得触发 ​

继续向后,510300最终在2016年1月底进入约2.849以下区域。

这意味着从2015年7月6日建立Start以后,经历:

  • 2015年7月股灾;
  • 大量停牌;
  • 大规模跌停;
  • 融资快速去杠杆;
  • 7月27日暴跌;
  • 8月24日至25日再次暴跌;
  • 2016年两次熔断;
  • 1月下旬再次急跌;

以后:

Start -20%终于获得触发资格。

但是这里有一个必须保留的实验事实:

当时我们只确认了第二档触发,并没有冻结一个明确的买入数量。

因此,这篇文章不能事后补一个数字,然后计算“最终赚了多少钱”。

那会违反整个实验的基本原则。

所以第二档只能记录为:

-20%触发,买入数量未在当时确定。

而:

−30%≈2.493

在后续这一轮市场过程中没有获得触发。

15. 第二次验证的最终结果 ​

2015—2016走完以后,原有规则大致留下了这样的路径:

时间/条件结果
2015年6月高位不买
7月3日约3687仍不Start
7月5日汇金确认已买ETFStart资格发生变化
7月6日510300开盘约3.561买100股
当天跌破Start -10%加500股
-20%约2.849直到2016年1月底才触发
-30%约2.493未触发

从结果看,这套规则并不是完全没有部署资金。

它比2008的100股已经向前走了一步。

但第二次真实路径又暴露出了比2008更多的问题。

16. 2015—2016到底暴露了哪些问题 ​

16.1 10%一级再次被证明太粗 ​

2008只是告诉我:

10%可能太粗。

到了2015—2016,这个问题变得更加明显。

从Start到第二档之间,市场经历了如此多次极端波动,但规则几乎一直保持沉默。

所以:

10

这一次,一个自然候选开始出现:

−5%,−10%,−15%,−20%,−25%,−30%

但它仍然只能作为下一版候选。

不能因为2015—2016适合5%,就证明5%一定正确。

16.2 累计回撤无法表达单日极端冲击 ​

7月27日、8月24日、8月25日以及2016年1月的极端交易日都暴露了同一个问题:

一个单日-8%的市场,和一个普通的-1%日,在累计档位没有跨线时,对旧规则来说完全一样。

这显然丢失了信息。

因此下一版需要考虑:

单日冲击应该拥有独立表达

16.3 但“暴跌就买”同样有明显漏洞 ​

如果简单增加:

单日跌幅超过X%就买,

那么震荡行情可能产生:

−7,+6,−8,+8,−8,+9

这样的路径。

价格没有真正打开新的空间,却反复触发买入。

因此必须避免:

在同一个价格区域重复消费同一种极端信号。

一个可能的方向是:

每次极端日买入以后,记录一个Shock Anchor。

下一次即使再次出现极端日,也必须相对上一次Shock Anchor进一步打开足够大的价格空间,才重新获得买入资格。

也就是说,需要同时满足:

Rday≤ShockThreshold

以及:

CurrentShockAnchor−1≤ReArmThreshold

具体阈值仍然不在本轮根据历史答案确定。

16.4 单看一个指数可能不够 ​

2015—2016还有一个问题逐渐显现。

实际执行使用的是510300。

但整个市场的压力并不一定只体现在沪深300。

因此下一版可以同时记录:

DSSE

和:

DCSI300

也就是上证综指与沪深300相对Start各自的回撤。

然后使用更深的一个作为整体市场深度:

Dmarket=min(DSSE,DCSI300)

实际交易仍然可以使用510300。

这样做的目的不是寻找“哪个指数最惨就买哪个”,而是:

避免单一指数暂时失真时低估整个市场的压力。

16.5 跌停、停牌、融资余额值得成为危机状态指标 ​

这一轮最大的收获之一,是把一些原本只是新闻描述的东西变成了可以持续观察的状态变量。

例如:

  • 跌停家数;
  • 停牌数量;
  • 停牌占全部A股比例;
  • 融资余额;
  • 融资余额每日变化。

这些数据分别从不同角度帮助回答:

市场现在只是价格下跌,还是已经出现流动性和被迫卖出的反馈?

尤其是融资余额。

它让我越来越关注:

被迫卖出的速度是在增加,还是在下降?

这可能比单纯寻找最低价更接近我真正关心的问题。

16.6 强制卖出减弱,不等于危机已经结束 ​

7月9日前后融资余额下降速度明显放缓,看起来像是一个积极变化。

但随后7月27日、8月下旬又出现新的剧烈波动。

所以:

第一次看到去杠杆减速,不能直接解释成“危机结束”。

它最多意味着:

某一阶段最猛烈的强制卖出反馈可能正在减弱。

下一版如果使用这一指标,也应该把它理解成“状态变化”,而不是“底部确认”。

16.7 不同价格深度下,同样的极端下跌价值不同 ​

这一轮还暴露了另一个问题。

假设:

  • 上证3500附近单日跌8%;
  • 上证3000附近单日跌8%;
  • 上证2700附近单日再跌8%。

三次的“单日冲击”可能一样。

但它们发生的整体价格空间不同。

直觉上:

越深位置出现的同样极端冲击,机会价值可能越高。

这意味着以后如果涉及“买多少”,不能只写:

每次暴跌固定买U元。

更可能应该是:

BuyAmount=f(累计价格深度,单日冲击,市场压力状态)

但是这里已经开始进入另一个问题:

买多少。

本轮先不解决。

17. 本轮确认了什么,又没有回答什么 ​

经过第二次验证,现在可以更加明确地确认:

  • 10%一级累计档位过粗;
  • 累计回撤不能完整表达单日极端冲击;
  • 单日极端冲击不能无条件重复触发;
  • 需要考虑“重新获得冲击买入资格”的机制;
  • 市场深度可以考虑同时观察上证与沪深300;
  • 跌停、停牌、融资余额等数据对判断被迫卖出状态有价值;
  • 国家资本实际买入可以改变Start资格,但不能被当成底部确认。

但本轮仍然没有回答:

  • 累计档位最终是不是5%;
  • 极端日到底定义为-5%、-7%还是其他值;
  • Shock Anchor重新武装到底需要再跌5%、8%还是10%;
  • 每次触发应该买多少钱;
  • 越深的位置应该增加多少资金;
  • 一天同时跨越多个条件时应该买几次;
  • 总资金应该在-20%、-30%、-40%、-50%之间怎样保留;
  • 是否应该在危机期间使用做T降低成本。

这些问题不能继续用2015—2016已经知道的路径把参数调漂亮。

18. 第二次验证之后形成的V3方向 ​

2008之后,第一次修正主要解决了:

Start不能只由价格决定。

2015—2016以后,第二次修正开始进一步触及:

Start以后如何识别新的买入机会。

目前可以形成一个V3方向,但仍然只是草案。

18.1 市场深度 ​

同时记录:

DSSE

和:

DCSI300

取:

Dmarket=min(DSSE,DCSI300)

作为市场价格深度参考。

18.2 累计档位提高分辨率 ​

从原来的:

−10,−20,−30

候选修改为:

−5,−10,−15,−20,−25,−30...

但具体是否采用5%,仍需继续验证。

18.3 增加单日极端冲击 ​

累计档位之外,再增加:

单日极端下跌资格。

但极端日不能无限重复触发。

18.4 增加Shock Anchor ​

第一次极端日触发以后:

记录当时的市场位置作为Shock Anchor。

以后再次出现极端日,只有价格相对上一个Shock Anchor进一步打开足够空间,才能重新获得额外买入资格。

这样试图解决:

同一区域反复暴跌、反复买入的问题。

18.5 市场状态继续作为辅助变量 ​

继续观察:

  • 跌停家数;
  • 停牌比例;
  • 融资余额变化;
  • 强制平仓和去杠杆状态;
  • 国家资本实际买入;
  • 市场制度变化。

这些变量主要用于回答:

现在到底是什么性质的下跌?

而不是直接替代价格规则。

19. 一个问题开始需要单独拆出去:买多少 ​

走完2008和2015—2016以后,我越来越感觉到:

“什么时候买”和“买多少”其实是两个足够大的问题。

如果全部塞进同一套实验:

  • Start;
  • 累计档位;
  • 极端日;
  • Shock Anchor;
  • 市场状态;
  • 单次仓位;
  • 深度梯度;
  • 总资金上限;
  • 每日部署上限;

很快就会变成一个复杂到难以判断到底是哪条规则出了问题的系统。

因此更干净的做法可能是:

深度回撤实验首先解决“什么时候获得买入资格”。

它输出:

今天有没有新的买入资格。

然后把:

获得资格以后到底投入多少钱

交给另一个资金部署实验处理。

这样以后即使资金方案设计失败,也不会反过来污染机会识别规则。

20. 第二次验证真正留下了什么 ​

2008给我的最大教训是:

一个看起来简单合理的机械规则,放进真实历史以后可能根本无法完成资金部署。

2015—2016则进一步告诉我:

即使解决了Start问题,后面的市场路径仍然比简单的累计回撤复杂得多。

它可能:

  • 一天暴跌;
  • 第二天暴涨;
  • 再次暴跌;
  • 大量股票停牌;
  • 杠杆持续退出;
  • 强制卖出突然减弱;
  • 随后再次爆发;
  • 甚至交易制度本身也会改变参与者行为。

因此,第二次实验仍然没有证明这套策略正确。

它做的事情和2008完全一样:

继续排除错误方案。

2008把:

“从一个很深的Start以后,每10%买一次就够了”

打出了问题。

2015—2016又把:

“只要看累计回撤就够了”

继续打出了问题。

这正是这套实验方法真正想得到的结果。

我并不需要每一次历史回放都告诉我:

应该怎样完美抄底。

只要它能够告诉我:

哪些我原本以为合理的方案,在真实市场路径里其实会失效,

这次实验就已经产生价值。

下一步,不是急着继续优化2015—2016。

而是先把这些已经暴露的问题冻结下来,形成V3草案。

以后如果再进入2018、2020等新的未知历史样本,继续问同一个问题:

这一次,还能从哪里把V3打坏?