分享

HDF5的增量更新与datatables显示可转债列表

 AI量化实验室 2023-10-12 发布于北京

原创文章第180篇,专注“个人成长与财富自由、世界运作的逻辑,AI量化投资"。

今天的任务之一,要完成hdf5的增量更新

01  HDF5的子集操作

大家如果熟悉我们之前的思路,知道我们后端使用mongo来存储金融数据。其实很多小私募投资公司就是这么做的。日频的数据,其实用mysql都行,而mongo的门槛最低。

有了mongo为何还需要hdf5?

mongo用于数据持久化,而hdf5用于支撑回测。尤其是针对全市场的海量选股,选基的场景,需要把全市场数据下载到本地,然后再进行因子计算,需要消耗无谓的时间。因此把数据在hdf5里做好预计算,就像机器学习的数据集一样,不需要频繁的更新。可以把因子计算好后,载入内存,以供回测或者模型训练之用。

hdf5单次写入dataframe特别简单,还要解决“增量更新”,“meta信息”两个点。

hdf5是美国超算中心开发的用于存储科学数据的自描述文件格式,与简单的二进制格式文件存储的最大区别是hdf5带有meta数据,这些元数据给出了数据的特征信息。hdf5有广泛的应用,matlab的.mat文件就是以hdf5作为保存文件的默认格式。另外hdf5支持子集分片和部分IO,就是说可以像数据库一样进行查询,返回部分数据,不需要像csv一样,把数据整体读到内存才能访问。

hdf5写入的时间,需要指定format=table,默认是fix,fix只能整体读写,优点是快,而table格式是可以支持查询子集,更加灵活。

df.to_hdf('test.h5', 'test', format='table')
print(df)
sub = pd.read_hdf('test.h5', 'test', where="index>='20190319'")
print(sub)

全市场hdf5的数据集用table格式,可以增量更新,而合成一个all大数据集后,使用fix提升加载速度。

当然从回测的角度而言,日频数据的重建代价也不算特别大,就算每天更新一次,交给定时任务也能很好的完成。

02 基于jquery的table

我们计算好每天的因子指标,需要使用一个表格把它结构化地呈现出来。需要支持按某几个维度进行排序,同时还能支持检索,分页等等。

一个简单的交易如下,这个适合于可转债列表,ETF列表,股票列表,指数列表等等,多因子多维度排序,呈现数据。


后端代码如下,支持前端ajax请求:

@api.get('bonds')
def get_bonds(request):
items = mongo_utils.get_db()['bonds_rank'].find({}, {'_id': 0, 'delist_date': 0}).sort('order_by',
direction=pymongo.ASCENDING)
items = list(items)
df = pd.DataFrame(items)
df.rename(columns={'pb': '正股PB', 'close': '现价', 'code': '代码',
'chg_price':'转股价',
'转股溢价':'转股溢价率',
'double_low':'双低',
'order_by':'综合排序',
'stk_code': '正股代码', 'bond_short_name': '转债名称'},
inplace=True)

df = df[['代码', '转债名称', '现价', '正股代码', '正股PB','转股价','转股价值','转股溢价率','双低','综合排序']]
data = {}
items = df.to_dict(orient='split')
datas = [items['columns']]
datas.extend(items['data'])
data['data'] = datas
return data

前端代码如下:

<script src="{% static 'DataTables-1.13.1/js/jquery.dataTables.min.js' %}"></script>
<script>
$(document).ready(function () {
$('#bonds').DataTable({
ajax: '/api/bonds',
});
});
</script>

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多