• Arctic用于读写真实的A股数据:转债的正股价


    持续行动1期 45/100,“AI技术应用于量化投资研资”之可转债投资。

    昨天尝试了Arctic,一个基于mongo的高性能量化数据库,使用的感受不错。

    今天要重点做一件事情,转债的数据入Arctic,并与Qlib的数据库对比,全量加载转债的性能,如果更好或者相差无几,那么Qlib框架使用的必要性将会降低。

    01 构建Arctic bond_daily数据库

    Arctic的设计理念就是“pandas in, pandas out”,直接写一个dataframe,读一个dataframe,连index都保留着,自动完成日期字段的序列化和反序列化。

    最常用的lib_type=CHUNK_STORE,按symbol存储。

    from arctic import CHUNK_STORE, Arctic
    
    
    def get_store(db_name):
        a = Arctic('localhost')
        a.initialize_library(db_name, lib_type=CHUNK_STORE)
        lib = a[db_name]
        print(lib)
        return lib
    
    
    def write_df(store, tb, df, chunk_size='M'):
        lib = get_store(store)
        if tb not in lib.list_symbols():
            lib.write(tb,df,chunk_size=chunk_size)
        else:
            lib.update(tb, df, chunk_size=chunk_size)

    然后特征遍历读数据并写入Arctic。

    def update_all_bond_daily(all=False):
        # 获取所有列表,有日期,从最近的日期开始读。
        items = list(get_db()['bond_basic'].find({}, {'ts_code': 1, '_id': 0}))
        if items and len(items) == 0:
            logger.error("读可转债列表为空")
            return
        for i, item in enumerate(items):
            code = item['ts_code']
            logger.debug("{}-{}-{}".format(i, code, i / len(items)))
            # date = get_daily_last_date(code, tb_name='bond_daily')
            date = None
            if all == False:
                date = '20220901'
            logger.debug('从{}开始更新'.format(date))
            df = get_bond_daily(code, date)
            if df is None or len(df) == 0:
                logger.info('取不到数据')
                continue
            # df['_id'] = df['ts_code'] + '_' + df['trade_date']
            df.rename(columns={'trade_date': 'date', 'ts_code': 'code'}, inplace=True)
            df['date'] = df['date'].apply(lambda x: datetime.strptime(x, '%Y%m%d'))
            df.index = df['date']
            del df['date'], df['code']
            print(df.tail())
            write_df('bond_daily', code, df)

    02 转股价

    主要代码是读tushare整理格式,存储在Arctic的bond_stk_chg库中。

    03 正股价

    正股价的逻辑也类似,tushare的复权因子是分开存的,这个可以整合到一起。

    我们所股票价格存储于stock_daily库。

    04 数据整合查询

    把转债数据读出,转股价读出,二者整合。

    df = read_df(symbol)
    df_chg = read_chg_df(symbol)
    all = pd.concat([df,df_chg], axis=1)
    all.fillna(method='ffill',inplace=True)
    all.dropna(inplace=True)

    按需读取正股价:

    start_date, end_date = all.index[0], all.index[-1]
    print(start_date,end_date)
    
    stk_code = '000001.SZ'
    df_stk = read_stk_df(stk_code,start_date, end_date)

    05 表达式引擎

    已经具备把所有交易数据读入内存,而且Arctic缓存特别容易,它就是把整个计算好的dataframe以一个chunk的形式直接保存起来,若有需要还可以使用VersionStore来存取副本。

    与qlib的差别就在于qlib还有一个表达式引擎。

    好在qlib的代码模块化做得很多,我把qlib的的表达式引擎拆份出来,与它的数据存储独立开来。

    没有完全对比完成,但目前看起来,arctic可以用于量化,数据维护,更新与调用比qlib基于Csv的方式要方便很多。

    百万数据直接返回,高性能量化数据库Arctic,基于mongo的列存引擎

  • 相关阅读:
    【Android 系统】recovery字体大小修改
    gma 2.0.2 (2023.10.15) 更新日志
    接口测试时遇到接口加密了该如何处理?
    Layui数据表格中checkbox位置不居中
    Android调用相机与相册的方法
    计算机毕业设计ssm基于SSM框架下水果篮子项目管理系统的设计与实现 c9pjx系统+程序+源码+lw+远程部署
    flutter开发实战-防抖Debounce与节流Throttler实现
    axios 请求拦截器&响应拦截器与router的导航守卫
    Redis 常见问题
    项目一共30个模块,你叫我maven版本一个个手动改?
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126852598