环境准备好了以后,还需要确定我们准备使用什么方式存储数据。WonderTrader实盘环境下只支持:自有文件存储。而回测环境下,还支持直接从csv
读取数据(仅限于历史K线数据)。
历史K线数据文件,采用zstd
压缩后存放。高频历史数据,包括tick
数据,股票level2
的委托明细、成交明细、委托队列,也采用压缩存放的方式。A股全市场一天的level2
数据,压缩以后也就是大概2G不到的样子,对于硬盘来说是相当友好的。 实时数据文件,因为需要实时读写,所以不压缩数据结构,并采用mmap的方式映射到内存中,直接对文件进行读写,提高读写效率。
很多用户通过各种渠道获取到的历史数据,供应商为了便于用户直接查看数据,一般都会提供csv
格式的。但是csv
文件格式的数据,占用空间非常大,而且直接从csv
文件读取数据的开销也是非常大的。 WonderTrader的回测框架为了尽量减少这种不必要的开销,在处理csv
文件时,第一次会直接从csv
文件读取,将读取的数据转成WonderTrader内部数据结构之后,会将数据转储为WonderTrader自有的压缩存放格式。这样下次在使用该数据的时候,读取压缩存放的数据以后,直接解压就可以得到结构化的历史数据,这样就可以直接进行访问了。
datahelper模块位于wtpy.apps
子模块下,采用工厂模式进行封装,最大限度的降低了使用难度,将各种API
的差异全部封装起来,用户在使用的时候只需要调用工厂创建即可,而不用担心因为每个数据源API
不同而导致的各种问题。
datahelper模块目前已封装的数据源包括tushare、baostock、RQData。
tushare
是知名度较高的免费数据源,数据比较全,使用的人也很多。但是tushare
有些数据需要积分才能下载,下载速度也较慢baostock
是一个免费、开源的证券数据平台,无需注册,并且下载速度也非常快,可以拿到5分钟线数据RQData
是米筐开发的一个基于Python
的金融数据工具包,是一个收费数据源,数据很全,数据质量也很高。对于一些有1分钟线甚至更高频数据的需求,免费的数据源就无法提供了,RQData
可能也是一个不错的选择。datahelper模块主要帮助用户进行历史数据的下载,以及一些基础数据的获取。主要包括3种接口:
对于财务数据,WonderTrader暂时没有从平台层面做标准化的工作。一方面财务数据相对静态,可以相对容易的从不同的渠道拿到。另一方面只有股票才需要财务数据,而现在最流行的选股框架还是多因子框架。相对WonderTrader而言,多因子框架几乎是另一个维度的,所以WonderTrader暂时就不涉及财务数据这块了。
数据辅助模块各个接口的详细定义如下:
class BaseDataHelper:
def __init__(self):
self.isAuthed = False
pass
def __check__(self):
if not self.isAuthed:
raise Exception("This module has not authorized yet!")
def auth(self, **kwargs):
'''
模块认证
'''
pass
def dmpCodeListToFile(self, filename:str, hasIndex:bool=True, hasStock:bool=True):
'''
将代码列表导出到文件\n
@filename 要输出的文件名,json格式\n
@hasIndex 是否包含指数\n
@hasStock 是否包含股票\n
'''
pass
def dmpAdjFactorsToFile(self, codes:list, filename:str):
'''
将除权因子导出到文件\n
@codes 股票列表,格式如["SSE.600000","SZSE.000001"]\n
@filename 要输出的文件名,json格式
'''
pass
def dmpBarsToFile(self, folder:str, codes:list, start_date:datetime=None, end_date:datetime=None, period:str="day"):
'''
将K线导出到指定的目录下的csv文件,文件名格式如SSE.600000_d.csv\n
@folder 要输出的文件夹\n
@codes 股票列表,格式如["SSE.600000","SZSE.000001"]\n
@start_date 开始日期,datetime类型,传None则自动设置为1990-01-01\n
@end_date 结束日期,datetime类型,传None则自动设置为当前日期\n
@period K线周期,支持day、min1、min5\n
'''
pass
def dmpAdjFactorsToDB(self, dbHelper:DBHelper, codes:list):
'''
将除权因子导出到数据库\n
@codes 股票列表,格式如["SSE.600000","SZSE.000001"]\n
@dbHelper 数据库辅助模块
'''
pass
def dmpBarsToDB(self, dbHelper:DBHelper, codes:list, start_date:datetime=None, end_date:datetime=None, period:str="day"):
'''
将K线导出到数据库\n
@dbHelper 数据库辅助模块\n
@codes 股票列表,格式如["SSE.600000","SZSE.000001"]\n
@start_date 开始日期,datetime类型,传None则自动设置为1990-01-01\n
@end_date 结束日期,datetime类型,传None则自动设置为当前日期\n
@period K线周期,支持day、min1、min5\n
'''
pass
点击复制错误复制成功
本文将以tushare
数据源为例,演示一下数据辅助模块的基本用法。
首先,创建tushare
对应的数据辅助模块:
from **wtpy**.apps.datahelper import DHFactory as DHF
hlper = DHF.createHelper("tushare")
点击复制错误复制成功
创建好了以后,对tushare
进行认证:
hlper.auth(**{"token":"your token of tushare","use_pro":True})
点击复制错误复制成功
值得一提的是,上面的代码中没有一个参数use_pro
,该参数不是tushare
认证需要的,而是用于控制tushare
调用的接口的,如果use_pro
为True
,那么就调用tushare
的pro_bar
接口读取历史K线数据,否则就调用老版本的接口get_k_data
读取历史K线数据。之所以这样,是因为pro_bar
接口获取分钟数据的时候需要积分的,但是老的接口是不需要积分的。
# 将代码列表下载到文件中
hlper.dmpCodeListToFile(filename = 'codes.json', hasStock = True, hasIndex = True)
# 将除权因子下载到文件中
hlper.dmpAdjFactorsToFile(codes=['SSE.600000','SZSE.000001'], filename="./adjfactors.json")
# 将K线下载到指定目录
hlper.dmpBarsToFile("./", codes = ['SSE.600000','SZSE.000001'], period="day")
点击复制错误复制成功
代码列表下载截图