0、算子评级

一、7月29尝试算子
1、group_rank(ts_rank(eps / cap, 180), subindustry)

2、group_rank(ts_rank(cashflow_op / cap, 120), subindustry)

group_rank(ts_rank(cashflow_op / cap, 120), subindustry) decay :2 Sharpe:1.74
group_rank(ts_rank(cashflow_op / cap, 60), subindustry) decay :5 Sharpe:1.81 industry
group_rank(ts_rank(cashflow_op / cap, 60), subindustry) decay :4 Sharpe:1.83 industry

二、7月30尝试算子
大家好,最近刚开始在BRAIN上认真做alpha研究,踩了不少坑,也有一些收获,写出来跟大家交流一下。 起因 说来有点偶然。刚上平台的时候啥也不懂,就去Learn页面翻文档。在"Alpha Examples for Beginners"里看到一个叫"Earnings Yield Momentum"的例子,用的是分析师盈利预测数据做时序排名再按行业分组。 我直接抄过来跑了一下,sharpe不到1,还行但也谈不上多好。然后我就开始琢磨,这个字段到底靠不靠谱? 第一个坑:数据覆盖率 我当时不知道怎么看一个字段的数据覆盖情况。后来在文档里找到可以通过long count和short count来判断------简单说就是用rank()包一下这个字段,看有多少股票被分到了多头和空头。 跑了一下发现分析师预测类数据在TOP3000里大概只覆盖三分之一的股票,也就是说大部分股票根本没有这类数据。这对信号的稳定性肯定有影响。 想了想,有没有什么基本面指标覆盖率更高、又能反映类似"盈利质量"的意思? 翻了一圈字段列表,最后选了一个覆盖率超过90%的基本面现金流类字段。理由也简单:现金流比利润指标更难造假,而且是实打实的钱进钱出。 改进思路(不贴具体表达式了,说方法论) 第一步:构建基础信号 用现金流类指标除以规模指标做标准化,再rank。逻辑就是找现金流质量高的股票。结果:sharpe不到1,有信号但弱,turnover也偏高。 第二步:加入时间维度 光看当前值太粗糙了,我想看"这个指标是不是在变好"。于是用ts_rank做时序百分位排名。这一步提升比较明显,sharpe翻倍了。关键insight是:比起"现在好不好","正在变好"的信息量更大。 第三步:同行比较 直接rank是拿所有行业一起比,但不同行业的特征差别太大。换成group_rank按细分行业分组后又有明显提升。这里我踩过一个坑:用sector级别分组效果远不如subindustry,越细的分组越能消除系统性偏差。 第四步:加入对冲成分 这一步是意外发现的。在价值因子的基础上减去一个短期价格动量的反转信号,效果特别好。逻辑想通了:做多"基本面在改善但近期被低估的",做空"基本面在恶化但近期被高估的",两个信号天然互补。这一步之后sharpe和fitness都有质的飞跃。 第五步:参数微调 调整decay参数让仓位平滑过渡。这里有个小技巧:fitness公式里turnover在分母位置,所以在不损失sharpe的前提下降低turnover能直接提升fitness,算是"免费的午餐"。
参照这个核心思想,写出Fast Expression表达式
# 第一步:构建基础信号(现金流/市值)
base_signal = cashflow_op / cap;
# 第二步:加入时间维度,捕捉"正在变好"
ts_improved = ts_rank(base_signal, 60);
# 第三步:同行比较,细分行业分组
grouped_signal = group_rank(ts_improved, subindustry);
# 第四步:加入对冲成分(做多基本面改善,做空短期高估)
hedge = -ts_rank(returns, 10);
# 第五步:组合信号
final_signal = grouped_signal + hedge;
# 输出最终Alpha
final_signal
参数: decay :8 subindustry

参数: decay :10 subindustry

参数: decay :13 subindustry

参数: decay :12 industry

参数: decay :14 sector
