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

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章