因子研究:期货单因子入门
1.1 构建一个简单的期货因子流程
因为主要模板都是基于股票多因子框架构建的,所以这里和AI助手对话要求生成一个新的模板
可以发现大致整体可以分为四个模块,因子代码 ==> 数据区间 ==> 期货数据定义 ==> 输出分析
因子的构建模块主要采用Python的方式,整体还是非常清晰的
class FuturesMomentum20Factor(Factor):
def calculate(self, factors):
# 使用主力连续合约的日频收盘价(或主力聚合价)
close = factors['close']
# 20日简单动量:当前价格相对20日前的涨跌幅
# (P_t / P_{t-20} - 1),不使用未来数据
past_close = DELAY(close, 20)
# 避免除零/无效值
safe_past_close = IF(past_close == 0, 1e-6, past_close)
raw_momentum = close / safe_past_close - 1
# 可选:做截面标准化,便于不同合约之间比较
# 这里使用SCALE将截面缩放到[-1, 1]
# factor_value = SCALE(raw_momentum)
factor_value = raw_momentum
return factor_value
顺便也可以发现AI助手比较贴心的考虑了数据问题。
1.2 遇到的主要问题
- 计算的数据并不好debug,不能看到计算的中间过程和结果数据;
- 不太了解如何自定义主力合约选取,主力合约的代码是什么(例如一些行情软件可能是 RB999等);
后续:
对于问题2,问了下AI助手,它给了类似以下的解决方案:
symbols = mom20_rank.index.get_level_values('symbol')
# 根据自身行情库实际主连合约命名调整以下列表
black_prefixes = ['rb', 'hc', 'i', 'j', 'jm', 'sf', 'sm', 'zc']
def is_black(sym):
# 统一小写,兼容不同命名风格
s = str(sym).lower()
return any(s.startswith(p) for p in black_prefixes)
mask = symbols.to_series().apply(is_black)