使用dagster的asset物化对可转债基础数据进行多因子计算

目前可转债数据,因子计算,我们只需要可转债价格、可转债转债价即可。

图片

每天下午5:00,自动执行可转债数据入库:

图片

而对应的正股,我们需要更新正股价格,净利润年增长率,PB,PB等指标。

图片

dagster是不错的框架,相比于生长于hadoop时代的airflow,要轻得多,优雅得多。机器学习、数据驱动、定时任务都非常适合这个框架。

有了基础数据,我们还需要对数据做“预计算”。

我们的多因子模型,需要一些衍生指标,比如“pb分位点”,比如“转股溢价率”。在多因子合成时,还需要对衍生指标进行排序,综合排序加权得到最终的得分。

这样的排分若不经过“预计算”,是无法做到“实时查询”的。这就是“OLAP”与OTLP的区别。OTLP更强调业务逻辑、事务,每次动作或数据呈现数据量不大,比如数据的增、删、改多是针对单条数据,甚至还有缓存。查询也是按条件、分页呈现有限条。OLAP的场景则不同,它可能需要从全量、多库、多表、高维数据中得到某个结果。

像文本的全文检索,其实就是对全量文本做了“倒排索引”和“N级缓存”。说白了,用空间换时间。大数据领域的思路基本差不多,预计算,分层计算等。

我这里的做法如下,把720支转债的相关因子,下载到“本地“,做好延伸因子计算,然后存储到hdf5文件里。这里使用了dagster的asset。

图片

@asset(description='转债因子数据合成一个dataframe')
def merge_cb_all():
    if not os.path.exists(DATA_DIR_HDF5_CB_DATA.resolve()):
        get_dagster_logger().error('转债因子数据未合成')
        return

    datas = []
    with pd.HDFStore(DATA_DIR_HDF5_CB_DATA.resolve()) as s:
        for k in s.keys():
            datas.append(s[k])
    all_df = pd.concat(datas)
    all_df.sort_index(inplace=True, ascending=True)
    print(all_df)

    with pd.HDFStore(DATA_DIR_HDF5_CB_ALL.resolve()) as s:
        s['all'] = all_df
    get_dagster_logger().info('转债因子数据合成成功!')

asset的测试比op和job要简单,直接调用dagster的”物化“函数。

if __name__ == '__main__':
    from dagster import materialize

    materialize([merge_cb_all])

全市场转债数据30M左右,还好。

图片

这个all文件可以用于全市场转债策略多因子回测,还可以把当天或者历史上某一天按多因子选债的结果呈现出来。

我们把all里的dataframe读取出来,取某一天的所有数据,然后对因子进行综合排序,给出综合rank得分。

dagster这一次改进,op进化为asset看似复杂,实则精妙。

转债列表,可以依赖正股列表,正股列表在更新数据时可以复用。正股列表更新后,更新转债列表,自动缓存。在排序后可以合成大宽表等等。

其实asset就是一个job,不需要op以及graph或者job,它的运行概念叫”物化“。这在大数据和人工智能领域,这种数据驱动型的应用里特别合适,大量的中间计算可以被复用,省时省事。而且让我们有意识地对中间计算结果进行复用

图片

图片

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/104165
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注