回测中的问题
1.1 构建一个只计算主力合约的因子
class MainContractMomentum20(Factor):
def calculate(self, factors):
close = factors['close']
# 全部合约的 20 日动量
mom20 = (close / DELAY(close, 20)) - 1
# 先筛选主力合约,再在主力截面上做 RANK
symbols = mom20.index.get_level_values('symbol')
symbols_series = symbols.to_series()
# 按你的行情库主连命名规则修改这里
# 例:包含 'main' 或以 '9999' 结尾视为主力连续
def is_main(sym):
s = str(sym)#.lower()
if 'DOMINANT' in s:
return True
else:
return False
main_mask = symbols_series.apply(is_main)
# 非主力合约先置为 NaN,只保留主力合约的动量
mom20_main = mom20.where(main_mask.values)
# 只在“主力合约截面”上做 RANK
# mom20_rank = RANK(mom20_main)
# 再做一次 SCALE,保证截面在 [-1,1] 区间,自动跳过 NaN
# result = SCALE(mom20_rank)
return mom20_main
查看了数据的命名格式,实际上这些主力合约都用 XX_DOMINANT.{EXCHANGE} 的方式进行命名,所以实际上只要对这个名字做识别即可。但是看上去目前AI并不能理解这个操作。提示了它很多次,它还是要用 例:包含 'main' 或以 '9999' 结尾视为主力连续 这样的字段来强行修改我的代码。这个是一方面的问题
1.2 关于这个因子的回测
因子流程如上,就采用了最简单的调仓流程,但是这里的结果上看有两个问题。来查看这个看板可以发现
- 这个因子的分层夸张的好,月度胜率100%,这是不可能发生的,特别是对于这样一个简单因子。
- 计算逻辑中很明确这是一个收益率因子,但是在最新数据这里可以看到,因子的值特别大。
由于不是很熟悉数据的debug流程,所以目前在等待反馈中。
1.3 关于AI助手的使用
另外需要吐槽一下,AI助手也不能理解"请帮我查看一下逻辑流程是否存在问题"这样的表述。从结果上看,问出这样的话之后它只会对代码进行一些无意义的修改。而且有两点
- 它修改的代码不需要 accept,意味着我没有任何,工作流就自动执行了。希望和 claude 一样会有 plan 模式以及问询动作让我明白它是不是真的理解了。
- 只能回退到AI助手修改过的代码。意思是如果中间我有上手修改什么内容这一部分是不会被记录的也无法回退。这个很致命,导致整个项目非常容易崩溃。