当前位置: 首页 > 工具软件 > WonderTrader > 使用案例 >

WonderTrader数据存储方式

公良运锋
2023-12-01

环境准备好了以后,还需要确定我们准备使用什么方式存储数据。WonderTrader实盘环境下只支持:自有文件存储。而回测环境下,还支持直接从csv读取数据(仅限于历史K线数据)。

文件存储

  历史K线数据文件,采用zstd压缩后存放。高频历史数据,包括tick数据,股票level2的委托明细、成交明细、委托队列,也采用压缩存放的方式。A股全市场一天的level2数据,压缩以后也就是大概2G不到的样子,对于硬盘来说是相当友好的。   实时数据文件,因为需要实时读写,所以不压缩数据结构,并采用mmap的方式映射到内存中,直接对文件进行读写,提高读写效率。

csv历史数据

  很多用户通过各种渠道获取到的历史数据,供应商为了便于用户直接查看数据,一般都会提供csv格式的。但是csv文件格式的数据,占用空间非常大,而且直接从csv文件读取数据的开销也是非常大的。   WonderTrader的回测框架为了尽量减少这种不必要的开销,在处理csv文件时,第一次会直接从csv文件读取,将读取的数据转成WonderTrader内部数据结构之后,会将数据转储为WonderTrader自有的压缩存放格式。这样下次在使用该数据的时候,读取压缩存放的数据以后,直接解压就可以得到结构化的历史数据,这样就可以直接进行访问了。

datahelper模块

  datahelper模块位于wtpy.apps子模块下,采用工厂模式进行封装,最大限度的降低了使用难度,将各种API的差异全部封装起来,用户在使用的时候只需要调用工厂创建即可,而不用担心因为每个数据源API不同而导致的各种问题。

数据源

datahelper模块目前已封装的数据源包括tusharebaostockRQData

  • tushare是知名度较高的免费数据源,数据比较全,使用的人也很多。但是tushare有些数据需要积分才能下载,下载速度也较慢
  • baostock是一个免费、开源的证券数据平台,无需注册,并且下载速度也非常快,可以拿到5分钟线数据
  • RQData是米筐开发的一个基于Python的金融数据工具包,是一个收费数据源,数据很全,数据质量也很高。对于一些有1分钟线甚至更高频数据的需求,免费的数据源就无法提供了,RQData可能也是一个不错的选择。

数据接口

datahelper模块主要帮助用户进行历史数据的下载,以及一些基础数据的获取。主要包括3种接口:

  • 获取代码列表
  • 获取除权因子
  • 获取历史K线

  对于财务数据,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_proTrue,那么就调用tusharepro_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")点击复制错误复制成功

代码列表下载截图

 类似资料: