• 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的列存引擎

  • 相关阅读:
    File 类和 IO 流
    二叉树的中序遍历
    阿里十年测试带你走进APP测试的世界
    Linux虚拟机局域网IP配置
    PYQT制作动态时钟
    黑客必备一款API泄露的利用工具
    net转java学习笔记-sqlserver的问题记录
    大数据周会-本周学习内容总结017
    阿里巴巴面试题- - -Java体系最新面试题(3)
    拼团小程序制作技巧大揭秘:零基础也能轻松掌握
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126852598