qteasy中的数据类型
数据类型是qteasy的一个核心概念,它代表一个交易策略中所使用的信息,例如历史交易数据、宏观经济数据等。
信息并不等同于数据,在过去的版本中,qteasy将数据类型直接定义为DataSource数据表中的数据列,
但这样的定义方式并不妥当:因为信息与数据是不同的。原因包括:
某些数据本身并没有足够的意义,需要与其他数据结合才能产生足够的信息
有些数据包含多重信息,可以从不同的角度取提取,因此尽管很多情况下数据本身就包含了足够的信息
信息的定义也是动态的,同样的数据经过不同的方式可以有不同的解读
因此,将信息与数据等同起来是草率的,因为从逻辑上来说,数据仅仅是信息的载体而不是信息本身。
在qteasy新的定义中,数据类型就是我们希望从庞杂的数据中提取的各种信息,有些信息可以直接从数据表中读取,例如:
股票的开盘价,可以直接从股票价格表中读取
但是有些数据必须通过不同表中不同的数据通过组合来读取,例如:
股票的复权价格,必须读取股票的价格,然后读取股票价格复权因子,并通过计算得到
有些时候从同一列数据中可以读取出不同的信息,例如:
昨收价格和每日涨幅是不同的信息,但都可以从同一个股票价格表中提取
因此,qteasy将数据类型重新进行了定义,并将其定义为我们需要的信息,提供简单易用的API,方便用户从数据表中
快速提取所需信息,同时,允许用户创建自定义数据类型,以方便地提取自己感兴趣的信息。
另外,数据类型提供的API还将允许用户很容易地将提取的信息生成为图表、进行对比、比较以及统计分析
数据类型的定义应该通过一个类来实现,因而用户自定义可以较容易实现。同时,qteasy应该提供相当完善的内置数据类型以减少用户自定义工作量,且覆盖尽可能多的数据表确保下载的数据能够物尽其用。
从逻辑上讲,一个数据类型的定义需要包含以下关键要素:
数据来源:该信息来自于那些数据表中的哪些数据字段?
数据获取方式:如何提取该信息?
鉴于大量的内置数据类型需要被定义,那么这些数据类型的定义必须是简单地,参数化的,所幸数据类型类并不也不会太复杂,应该容易实现参数化定义。
用法和输出 首先是数据类型的用法和输出,看起来应统一为两个API:
API1:
data_type.get(start, end, frequency):获取该类型与个股无关的,区间内的单频数据,输出为类似Series 的数据。
API2:
data_type.get(shares, start, end, frequency):
获取该类型与给定个股有关的区间内单频数据。
也许还有第三个API:
data_type.get(shares, start, end, frequency, **kwargs)
以上API应该完全统一,不管是内置还是自定义类型都可返回相同格式的数据。
数据类型的类型 其次应该研究的是数据类型的类型,有多少种不同类型的数据类型?当然,这里的类型取决于从数据表中获取数据的方式和产出,如股价数据和成份数据的获取方式就不同,前者直接用数据标签从表中读取,而后者需从表中筛选后再通过行列变换得到。当然,还有可能更多的方式,如通过多表查询如复权价格或多数据计算得到。 这里只是说,明显不同的数据类型都有各自的特点,一个类就必须分别处理。
如果不考虑多数据计算类的数据类型的话(因为多数据计算可以在策略中实现,但双数据计算型的特殊型:复权价格又应含在内),数据类型的类型也许有下面几种:
以下属性被称为数据的获取类型(acquisition_type)这些类型的数据可以输出symbolised或者un-symbolised数据,且 这些数据都支持输出时间段数据(Periods)以及时间戳数据(TimeStamp):
在指定数据类型时,这种数据类型可以支持的输出类型是在数据类型定义中就确定了的,无法更改
- ‘basics’:
基本数据型。这些数据与时间无关,原则上不属于历史数据,仅作为信息调用。 这种类型的数据只需要一个表名和列名作为kwargs读取参数
- ‘direct’:
直读数据型。也就是根据区间频段直接从数据表内直接读取的数据,如价格或指标 这种类型的数据类型只需要从一个表名和列名中读取数据即可,因此读取参数只有一个表名和列名
- ‘adjustment’:
数据修正型。从一张表中直读数据A,另一张表直读数据B,并用B修正后输出,如复权价格 这种类型的数据需要从两张表中读取数据,因此读取参数有两个表名和列名
- ‘relations’:
数据关联型。从两张表中读取数据A与B,并输出它们之间的某种关系,如eq/ne/gt/or/nor等等
- ‘operation’:
数据计算型。从两张表中读取数据A与B,并输出他们之间的计算结果,如+/-/*//
- ‘event_status’:
事件状态型。从表中查询事件的发生日期并在事件影响区间内填充不同状态的,如停牌,改名等
- ‘event_multi_stat’:
多事件状态型。从表中查询多个事件的发生日期并在事件影响区间内填充多个不同的状态,如管理层名单等
- ‘event_signal’:
事件信号型。从表中查询事件的发生日期并在事件发生时产生信号的,如涨跌停,上板上榜,分红配股等
- ‘composition’:
成份查询型。从成份表中筛选出来数据并行列转换 另外还应该有一些特殊类型,由特殊的过程实现
- ‘compound’:
单时刻复合类型。查找一个时间点上可用的多种数据并组合输出,如个股某时刻的财务报表
Output Type
- ‘symbolised’:
以时间段为单位的symbolised数据,这种数据结构类似一个DataFrame,行为时间段,列为股票代码
- ‘un-symbolised’:
以时间段为单位的un-symbolised数据,这种数据结构类似于一个Series,行为时间段,只包含单列数据
数据类型类的定义 类型的定义为了简单,应该是参数化的,只要参数定了,读取方式和读取目标表就确定了
类的唯一一个可被外部调用的方法只有一个,这个方法根据不同的读取方式调用不同的方法,从目标表中读取数据,并清洗后输出。
甚至,不同的数据特点都可以定义在类型中,如open可以在最新的cycle中使用,而close则不可以
为了可扩展性,类中也可以定义一个空白函数,用于特殊情况下由用户重写后自定义数据读取方式
qteasy内置数据类型有非常多,为了方便这些类的创建,这里创建一个数据类型映射表,将所有的数据类型与其关键参数映射起来, 这样就可以通过一个简单的函数调用来创建一个数据类型类了。
1, DATA_TYPE_MAP:
DATA_TYPE_MAP: 定义数据类型与数据表之间的对应关系,以查询每种数据可以再哪一张表里查到 每种数据类型都有一个唯一的ID,且每种数据类型都只有一个唯一的存储位置
Data table mapping中各列的含义如下: htype_name(key): 数据类型名称(主键)
freq(key): 数据的可用频率(主键) min - 分钟数据 d - 日数据 w - 周数据 m - 月数据 q - 季度数据
asset_type(key): 数据对应的金融资产类型: E - 股票 IDX - 指数 FT - 期货 FD - 基金 OPT - 期权 THS - 同花顺指数 SW - 申万行业指数
description: 历史数据的详细描述,可以用于列搜索
acquisition_type: 数据的获取方式
table_name: 历史数据所在的表的名称
column: 历史数据在表中的列名称
“””