接上一篇:Alphagen学习笔记(1.Qlib因子生成部分)。接下来尝试简化和重写qlib因子生成(更准确说应该是“因子计算”),即:1.替换成本地parquet文件行情数据2.再按表达式计算出因子值。
行情和因子值在各个模块中传递顺序为从左至右:data—>loader—>stock_data。
小白编程还是要多用deepseek。我刚开始采用胡乱试的办法,把以上各个模块扔进对话框,先帮我解释一下代码,然后阐明接下来工作目标是要把mongodb行情数据替换成本地csv文件。但效果不好运行不起来,因为通过deepseek找真正的数据源都没有找出来,最后还是人工找的(见上一篇)。
后面我尝试先同时投喂expression和data或者loader这两个模块代码,再要求简化data/loader并修改,但结果冗余总是很多bug也多。旧bug修好了其他部分又会擅自重写(有时不光要说明改哪里,还要说清楚不能改哪里)。原因应该是data和loader涵盖功能太多和其他部分嵌合很深。最后改为投喂expression和浅层的stock_data部分,并明确要求只替换修改通往上层loader的QlibDataLoader接口,并提供parquet文件DataFrame行情数据格式描述,具体talk如下:
deepseek保留了大部分Stockdata类代码,但增加了一个from_parquet的静态方法。
直接运行会有方法属性有大量细微错误,此外几个地方是否保留或简化,考量如下:
max_backtrack_days/ max_future_days: 是一个准许时间序列读取冗余的设置,因为大量因子计算会用到移动rolling运算,需要保留。(那么max_future_days未来冗余是用来生成验证数据的?)。
保留toch充分利用GPU: 但张量维度结构属性名称位置这些要始终保持一致,因为不像pandas那样有丰富接口随时打印了解内部情况。原代码使用IntEnum枚举来统一和绑定代码属性名称和数据位置。
改成在内部使用了一个feature_position绑定张量位置和feature_name。
n_features\n_days\n_stocks等属性定义需要保持一致,在外部对StockData会频繁使用到。
原代码中专门设计了一个Calend_Provider,我简化成一个cal_index字典实现来日期和index速查。
def make_dataframe() 保留并修改,以方便打印输出和校验。
Expression部分基本保持了原貌,alphagen使用了Torch,但原Qlib中很多复杂二元和窗体操作没有包含。
Deepseek参考了原方案继续使用OpsWrapper实列化。
原def parse_field(),缺少对时间delta和常数的区分,这里添加了一段。
使用的库减少到只需要Maybe、some,none这几个了(也可以复制过来)
代码和测试数据已经打包,感兴趣可以下载试试。
通过网盘分享的文件:handmade_alphagen0711.zip
链接: https://pan.baidu.com/s/1oCCkMtQ5Quh9YJChdxKwOg?pwd=pjtp 提取码: pjtp
有问题欢迎评论留言。
后续可能开展真正的因子生成部分(也就是通过ops tree生成表达式的过程),丰富表达式、提高生成效率有效性等等吧。