美股残差反转研究案例:剔除市场共振后只做多异常弱势股票
只多头残差反转策略,购买的是在声明的市场解释模型之外仍显得偏弱的股票。市场收益只是构造信号的解释变量,账户并不卖空市场,也不会自动成为市场中性组合。负残差反映相对于模型的偏离,不能证明价格必然回归,更不能把一段市场调整后的指标当成已经对冲的真实仓位。
本文实现滞后二十期回归、五期残差入场条件、残差恢复和最长持有退出,并给出完整合成现金账户。CoTrading是否支持完全相同的回归与撮合契约仍属规划或待核实。输入收益和执行开盘价都是受控夹具,不是从真实股票与指数档案恢复出的历史数据。
先对齐股票与市场收益
在第i期收盘后,股票收益与市场收益必须对应同一个已经结束的区间,单位、复权和会话对齐一致。市场数组只用来解释股票变化;脚本没有市场订单,不会卖空股票,也不会从账户权益中减掉一个虚拟指数组合。因此不能把最后账户称作市场中性收益。
真实研究需保存股票身份、市场基准构成、收益定义、复权版本和数据时间。市场缺一条不能因为股票有交易就补零,退市或停牌股票也不能无说明地从面板消失。残差依赖这些输入,公式正确无法抵消错误基准、跨市场错日或后来修订的数据。
本例把执行开盘价单独提供,没有用信号收益数组逐期复合出开盘。这样可以分别控制信号和成交价格,独立验算现金;它不是一条真实市场价格历史。迁移到历史数据时,两类输入必须与同一套连贯行情核对,不能把独立测试夹具混称已经复原的股票路径。
系数只用当前之前的二十条观测
对第i期,取索引i减二十到i减一,带截距拟合股票收益y与市场收益x。先求均值,再求x离均差平方和;beta等于协方差分子除以该平方和,alpha等于y均值减beta乘x均值。最后用当期y减alpha再减beta乘当期x,得到当前残差。
当期收益参与计算残差,却不进入它自己的系数训练窗。这样当前异常不会立即改变衡量这次异常的模型。Python统计模块文档提供线性回归概念参考,样例直接写出短公式,方便逐行核对窗口端点,并没有声称实际调用文档中的回归函数。
如果此前二十条市场收益完全相同,市场方差为零,beta不可识别。输出标记unidentified_market_variance,残差保持未知,不能伪造beta为零。缺失或非有限输入同样产生无效观测。前二十条为热身;只有连续五个当前残差均已知,才计算五期算术和。未知与算出来恰好为零是不同状态。
夹具使用Python Fraction精确分数,避免浮点近似改变手算案例的严格阈值。这不代表真实金融回归普遍必须使用有理数,也不能解决历史输入的测量误差。数值数组实现可以采用明确容忍度,但必须用相同窗口与端点进行对照验收。
入场、恢复和到期分别定义
空仓时,最近五个残差的算术和严格小于负0.06才请求进入。决策发生在当前收盘之后,订单安排在下一条给定开盘。固定买入四十股,现金必须覆盖成交金额和一单位费用;资金不足直接报错,不静默借款,也不自行把数量缩到读者未声明的范围。
持仓时,五期残差和大于或等于零,表示本例的恢复条件成立,请求下一开盘退出。独立的最长持有规则要求进入后十个开盘间隔退出。恢复依赖收盘观测,到期时间则在建仓时已经确定。循环在开盘先处理此前排队的退出,再观察当天已经结束的收益,不用当天收盘决定当天开盘。
账户只持有一份仓位,不叠加买入,正残差也不产生卖空指令。持仓期间残差缺失不能捏造恢复;最长持有时钟仍提供本夹具的边界。真实停牌或开盘受阻还需要另写待退出及估值规则。本例提供可执行的有限正开盘,非法执行价被明确拒绝,不能用不合法数值完成现金桥。
手算恢复退出的完整路径
市场共有四十条收益,负0.01和正0.01交替。股票最初等于市场的1.5倍,在索引二十至二十四额外增加负0.02,在二十五至二十九额外增加正0.03。每期模型始终滞后训练;过去扰动进入后续训练窗后,alpha和beta会变化,不能把整段残差都简单当作固定负0.02。
索引二十的alpha为零,beta为二分之三,当前残差为负五十分之一。索引二十四的五期残差和为负二百五十分之二十三,即负0.092,严格跨过负0.06。下一开盘二十五以10买四十股,含一单位费用支出401,从初始一千剩余现金599。
索引二十六收盘的五期和为五百分之九,即0.018,产生恢复退出请求。开盘二十七以10.5卖四十股,扣一单位费用净收419。最终现金和权益都是1018,持仓零,累计费用二。现金桥是一千减401加419,价格收益二十再减两笔佣金。这里的价格获利只验证指定路径,没有推导出真实历史优势。
例子断言系数、残差、触发行、买入行和卖出行的精确内容,不能只检查“后来涨了”。即使末现金碰巧相同,任一订单提前或延后一期也可能改变策略机制。输出保留行索引,让收盘决策到后续开盘的关系能够被直接审查。
反例检验不同失效原因
共同市场下跌控制里,市场连续五期下跌,而股票始终严格等于市场的1.5倍。残差仍为零,不产生任何订单,现金保持一千。这解释了为什么价格下降不自动等于残差反转信号:差异来自解释模型,而不是给另一个案例换了止盈价。
持续负扰动控制仍在开盘二十五进入,但残差没有及时恢复,因此由最长持有时钟在开盘三十五以9.5卖出。四十股账户扣两笔费用后结束于978,持仓零。这个亏损反例检验的是独立的期限规则,不能用恢复成功案例的一个卖价修改来替代。
常数市场控制产生不可识别方差,没有有效五期入场。只运行前二十六行时,所得账本必须与完整运行的相同前缀逐行一致。把索引三十的股票收益改为极大未来值,也不能改变至二十五的所有指标。这些断言分别检查模型可识别性与未来信息边界,不与现金核算混为一次“测试通过”。
运行完整夹具并形成复核证据
下载完整示例,使用Python 3.12或更新版本执行python R592.py。脚本只依赖标准库,输入为精确合成收益分数与独立合成开盘。输出首个拟合、触发、入场、恢复退出、最长持有控制以及最终账户,不联网、不调用历史行情服务、不连接券商。
真实数据接入之前,先选择若干日期独立重算系数,审查训练窗成员,核对下一开盘对齐。更换基准、收益口径或复权版本应冻结为新实验。合成账户通过只能支持声明的算术与顺序正确,不能证明历史可交易超额收益、风险中性或CoTrading已经支持这套完整流程。
模型证据与账户证据分别导出
审阅表应分开系数训练窗、当前残差、五期和、待执行动作和最终订单。二十四收盘已经请求进入,但库存仍零;二十五开盘才成为四十股。二十六恢复也早于二十七卖出。这样可以区分模型变化与订单时间错误,真实资料接入后应先比较第一条不同收益和训练窗,不是先调阈值追回想要的交易。
常数市场不能识别beta时,把残差设零会把未知误成“完全由市场解释”;保留未知意味着没有足够模型证据,两种状态必须在导出表里可见。更换市场指数也可能改变残差符号,即使股票自身收益完全不变,因此指数身份与版本属于策略输入。若后来引入行业解释变量或多个因子,应另写可识别性、样本长度和多变量拟合验收,不能从当前一元回归通过推出新模型已经得到同等验证。每个模型版本与其账户运行分别冻结,才便于解释首个信号差异。
常见问题
策略是否卖空市场基准?
没有。市场只出现在回归公式,账户只交易正股票持仓与现金,因此经济暴露仍是只多头。
最长持有退出为什么仍会亏损?
残差偏弱可能持续。十个间隔限制本夹具的持有时间,并不保证到期价格有利,也不保证扣费后为正。