一次关于alpha挖掘的思考与实践
说实话,我在7月份就已经注册了世坤平台,但直到现在仍未成为顾问。一方面是因为近几个月工作繁忙,下班后几乎不想再碰任何与研究相关的事情;另一方面,也是最近才真正有空静下心来系统性地探索alpha的构建逻辑,并将整个过程中的想法记录下来。
回顾此前的操作方式,基本停留在“看教程—租云服务器—跑模板脚本”的阶段。这种模式看似高效,实则让我不知不觉陷入了数据挖掘的惯性思维:目标不再是理解市场机制,而是从海量字段和公式中碰运气,找出一个能通过测试的表达式。这让我想起曾经在某处看到的一句话:“一个人连续工作十年,和拥有十年工作经验的人,本质区别在于前者可能从未真正动过脑子。”的确,机械重复的工作终将被更智能的工具取代,唯有经过深入思考并沉淀下来的经验,才能真正转化为可迁移的智慧。
起初我对如何设计alpha毫无头绪,于是翻阅论坛资料,找到了一篇题为《股票收益是球队还是硬币》的帖子。这篇文章引发了我很大的兴趣,其核心观点指出:在中国资本市场中,散户投资者占比较高,而他们的交易行为往往受到情绪驱动,容易产生非理性决策,从而导致价格偏离基本面。
其中提到一种典型的心理偏差——当人们对某个事件了解充分时,倾向于认为未来结果会“回归平衡”。例如掷硬币,虽然每次正反面概率均为50%,但如果连续出现几次正面,人们会误以为下一次更可能是反面,这就是著名的“赌徒谬误”。然而,当人们对事件缺乏了解时(比如对某支球队知之甚少),他们则更依赖历史趋势进行判断——如果该队近期连胜,就预期它还会赢。这两种不同的预测逻辑,恰好反映了人类在不确定性下的认知差异。


基于这一现象,作者尝试将其量化为可计算的因子。第一个建模思路是利用波动率:波动率越高,说明对该资产的认知不确定性越强。作为一个典型的非理性交易者,在面对高不确定性的股票时,往往会追随近期走势。因此,策略应在此类股票上发出做空信号,预期后续由于基本面约束,当前的趋势将发生反转。
r_mean = ts_mean(close/ts_delay(close, 1)-1, 20); r_std = ts_std_dev(close/ts_delay(close, 1)-1, 20); std_mkt_mean = group_mean(r_std, 1, market); r_std < std_mkt_mean ? r_mean : -r_mean
简单来说,若某只股票的波动率低于市场同类水平(即被视为“确定性”资产),则做多,仓位大小由其过去20日平均收益率决定。这个逻辑颇具巧思。原帖中还引入了换手率和隔夜收益两个辅助因子,最终通过三者相乘的方式组合成完整信号。这种结构意味着每个因子都应对整体表现有所贡献,因此验证其有效性的一个方法就是单独测试每一个组成部分。
观察回测曲线可以看出,整体呈现明显的上升趋势,初步表明该alpha具备一定的正向预测能力。不过仍有部分指标未达标。起初我认为这是正常的——毕竟原策略是在特定市场环境下提出的。但随后我注意到文中提到了“日间收益”与“日内收益”的区别,这是两种计算日收益的不同方式:
# 日间收益 close/ts_delay(close, 1) # 日内收益 close/open - 1
受此启发,我将原始公式中的日间收益替换为日内收益:
r_mean = ts_mean(close/open - 1, 20); r_std = ts_std_dev(close/open - 1, 20); std_mkt_mean = group_mean(r_std, 1, market); r_std < std_mkt_mean ? r_mean : -r_mean


结果显示,策略性能有所提升,并且达到了可提交的标准。这时我开始怀疑:既然仅将收益计算方式改为日内就能带来显著改善,那么是否说明主要信号来源其实是这20日均值本身?而波动率条件的作用可能并不关键?为了验证这一点,我进一步测试了仅使用均值因子的情况:
r_mean = ts_mean(close/open - 1, 20); r_mean

令人意外的是,单一因子的表现反而更优。但这已不再符合原始策略的逻辑框架——新信号实际上暗示着“盘中涨幅越大,未来下跌概率越高”,呈现出某种均值回归特征。我不禁开始质疑:这个信号究竟是真实有效的市场规律,还是仅仅因为我恰好踩中了一段有利行情?
这时我想起官网课程中曾有一位讲师(印象中说话带点咖喱口音)在讲解基本面因子时提到:“如果一个因子本身有效,那它通常可以通过与其他合理变量结合来进一步增强。”虽然具体细节记不清了,但这句话给了我启发:真正的有效信号应当具备可扩展性和鲁棒性。
于是,我尝试就地取材,保留原有日内收益均值的同时,引入其波动率进行乘积加权:
r_mean = ts_mean(close/open - 1, 20); r_std = ts_std_dev(close/open - 1, 20); -r_mean * r_std


通过这种方式,试图强化原有信号在高波动环境下的响应强度。这一改动不仅是技术层面的调整,更是对信号本质的一次反思与深化。
从结果来看,整体性能有所提升,但其中一个条件仍未通过。提示信息表明,某项资产在特定日期被赋予了过高的权重。基于这一现象,我进行了如下思考:该信号由两个指标相乘构成,而第一个指标本身并无异常,问题可能出在第二个指标的数值波动过大。因此,若对第二个指标进行平滑处理,使其量级更为稳定,或许可以解决问题。
原始表达式如下:
r_mean = ts_mean(close/open - 1, 20); r_std = ts_std_dev(returns, 30); -r_mean * r_std
经过调整后,该alpha成功通过校验,具备提交条件。
截至目前,我已经构建出两个可提交的有效alpha,并从中归纳出一些初步规律:
- 积极信号可以通过合理方式增强
- 过去涨幅越高,未来预期收益越低
- 波动率有助于强化预测信号
需要说明的是,这些规律源于当前的观察与经验总结,未必完全普适,后续如发现反例将不断修正。此外,所有结论均基于USA TOP3000市场的环境得出,可能存在一定的场景依赖性。
尽管已有一定成果,但我仍不清楚这些规律背后的驱动机制。如果能够理解其深层动因,则有望进一步拓展更多有效的信号构造思路。
结合多个大型语言模型(LLM)的分析意见,我提出了首个假设——“过度反应”理论:
做多信号情境:当一只股票在过去20个交易日中持续盘中下跌,且伴随显著波动,通常对应突发负面消息(例如盈利预警或行业利空)。投资者容易陷入恐慌与悲观情绪,进行非理性抛售,导致股价跌幅超出基本面实际恶化程度。
做空信号情境:相反地,若个股出现连续盘中快速上涨,往往由利好消息或市场炒作推动。此时投资者易受贪婪和FOMO(害怕错过)心理驱使,盲目追高,造成价格远超其内在价值。
该假设表明,当前因子本质上是一个捕捉市场情绪反转的工具,旨在利用过度反应后的价格回归过程。这也让我联想到咖喱老师曾提及的一个参数——setting中的delay设置。回测教程中他通常建议设为1,以避免数据泄露风险。我当时推测,delay=1意味着使用上一期生成的alpha信号进行交易,而delay=0则代表直接使用当日信号即时交易。
若“过度反应”假设成立,则delay=0的策略表现应更差。因为市场参与者无法在第一时间全面接收并消化引发情绪变化的信息,反应存在时间滞后。为了验证这一点,我对比了两个完全相同但delay设置不同的信号:
-ts_mean(close/open - 1, 20); delay = 1
-ts_mean(close/open - 1, 20); delay = 0
结果显示,delay=0的情况下信号质量明显下降,验证了前述推断。初步结论得以支持:该alpha有效性的根源在于投资者的过度反应行为,而引发此类行为的心理因素多样,包括但不限于过度自信、羊群效应以及FOMO等。
在此基础上,我以“过度”为关键词,在相关论坛进一步搜索灵感,试图寻找更多佐证或新思路。
其中第二篇文章提供了有价值的参考,相较第一篇中无法直接复现的复杂公式:
-ts_backfill(zscore(goodwill/sales),65)*(rank(fn_accrued_liab_a)*rank(capex)*rank(dividend/sharesout)+rank(debt_st))
该信号曲线走势平稳,回撤控制良好,最关键的是与其他已知信号的相关性接近于零,说明其逻辑路径具有独立性。由此得出一条重要规律:即便不同信号同源于某种非理性市场行为(如过度反应),它们在量化形式上的体现仍可能截然不同。
今日探索暂告一段落。原本计划尝试将这两个可能源自相似经济动因的信号进行融合优化,但考虑到时间关系,留待下次继续深入研究。


雷达卡


京公网安备 11010802022788号







