|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 目录结构
|
|
|
|
|
```
|
|
|
|
|
.
|
|
|
|
|
├── assets
|
|
|
|
|
│ └── ddb_dump_journal.csv
|
|
|
|
|
├── dolphindb
|
|
|
|
|
│ └── project
|
|
|
|
|
│ ├── modules
|
|
|
|
|
│ └── scripts
|
|
|
|
|
├── ipynb
|
|
|
|
|
│ ├── ddb.ipynb
|
|
|
|
|
│ ├── ddb_pe.ipynb
|
|
|
|
|
│ ├── ddb_pit.ipynb
|
|
|
|
|
│ ├── dos.ipynb
|
|
|
|
|
│ └── mssql.ipynb
|
|
|
|
|
├── README.md
|
|
|
|
|
└── src
|
|
|
|
|
├── DDBBase.py
|
|
|
|
|
├── expr
|
|
|
|
|
│ └── DDBExpression.py
|
|
|
|
|
├── factor
|
|
|
|
|
│ └── DDBFactor.py
|
|
|
|
|
├── __init__.py
|
|
|
|
|
├── loader
|
|
|
|
|
│ ├── DDBBasicInfoLoader.py
|
|
|
|
|
│ ├── DDBDailyLoader.py
|
|
|
|
|
│ ├── DDBHFTLoader.py
|
|
|
|
|
│ ├── DDBLoader.py
|
|
|
|
|
│ ├── DDBPITLoader.py
|
|
|
|
|
│ ├── make_hft.py
|
|
|
|
|
│ └── ProtoBuffEntitys
|
|
|
|
|
├── ReadTickFromDB.py
|
|
|
|
|
├── run.py
|
|
|
|
|
└── script.py
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 目录说明
|
|
|
|
|
|
|
|
|
|
- `assets`
|
|
|
|
|
- 程序运行过程中产生、或者依赖的配置数据
|
|
|
|
|
- `ddb_dump_jounral.csv`记录海通高频数据写入DolphinDB的日志(类似log)
|
|
|
|
|
- `dolphindb`
|
|
|
|
|
- DolphinDB的客户端Workspace,主要用来放置dos文件
|
|
|
|
|
- 目录结构是DolphinDB的官方Java客户端设定的,因此略显臃肿
|
|
|
|
|
- `ipynb`
|
|
|
|
|
- jupyter notebook的存放目录
|
|
|
|
|
- 包含开发DolphinDB相关功能的草稿和SQL-Server相关功能的草稿
|
|
|
|
|
- `src`
|
|
|
|
|
- Python源代码目录,是工作的主要目录
|
|
|
|
|
- 大部分源码文件以`DDB`开头,表示与DolphinDB相关,继承和代码复用关系可以进一步优化
|
|
|
|
|
- `DDBBase.py`:
|
|
|
|
|
- `DDB*`的基类,包含了一些常用常量
|
|
|
|
|
- `run.py`:
|
|
|
|
|
- 用于执行具体操作任务的入口脚本
|
|
|
|
|
- TODO:需要支持命令行参数来选择执行功能和配套参数
|
|
|
|
|
- `loader`目录:代码专门用于向DolphinDB写入数据(似乎称为Dumper更合适),目前包括:
|
|
|
|
|
- `DDBLoader.py`:其他Loader类的基础类
|
|
|
|
|
- `DDBHFTLoader.py`:用以导入高频数据(海通高频数据)
|
|
|
|
|
- `DDBDailyLoader.py`:用以导入日频数据(市场日K线数据)
|
|
|
|
|
- `DDBPITLoader.py`:用以导入低频PIT数据,主要是财报数据
|
|
|
|
|
- `loader/ProtoBuffEntitys`目录:
|
|
|
|
|
- 用以解析海通高频数据中,protobuf字节流的Python辅助代码
|
|
|
|
|
- `factor`目录:用于生成因子
|
|
|
|
|
- `DDBFactor.py`:目前只有生成日频因子
|
|
|
|
|
- `expr`目录:用于支持基于DDB的各种表达式操作
|
|
|
|
|
- `DDBExpression.py`:提供了基本的操作表达式,目前包括:
|
|
|
|
|
- 通过Function View,读取DolphinDB的分布式存储表:
|
|
|
|
|
- 在任意时间点上,获取所有公司某张财报、指定财报期的最新可见快照
|
|
|
|
|
- 在任意时间点上,获取所有公司某张财报中某科目、指定财报期的最新可见快照
|
|
|
|
|
- 通过一般Function,对内存表进行操作:
|
|
|
|
|
- 流量表累计数值转单季值
|
|
|
|
|
- 跨年同比指标计算(分母为去年基数取绝对值,函数会同时返回当年值和去年基数,以便进一步调整)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 一分钟K线数据校验
|
|
|
|
|
|
|
|
|
|
### 海通数据vs 旭诺MongoDB数据质量对比
|
|
|
|
|
|
|
|
|
|
MongoDB的数据问题比较严重,主要有以下几个大问题:
|
|
|
|
|
1. MongoDB的日内分钟数据加上了9:25集合竞价的数据,同时剔除了14:57-14:59尾盘集合竞价的数据,所以MongoDB的标准日内分钟是239分钟,但实际上日内分钟不同股票、不同交易日内都有不同程度的分钟丢失,导致股票日内记录数通常小于239,集中在开盘前几分钟(这个问题比较严重,开盘往往对因子计算影响较大),尾盘收盘时刻和日内离散的时刻,采样结果显示,20220121当天4609个股票,仅99只股票有15:00收盘时刻的数据;
|
|
|
|
|
2. 早年的数据,甚至有整个交易日所有股票无数据的情况,例如2018、2019年,近年来少一些;
|
|
|
|
|
3. 有些股票的时间序列上有部分字段的数据缺失,例如只有开盘和收盘价,没有最高最低,或者有价格数据但无成交数据。
|
|
|
|
|
|
|
|
|
|
### 海通分钟数据和旭诺MongoDB映射表
|
|
|
|
|
|
|
|
|
|
| 海通字段 | MongoDB字段 | 映射规则(旭诺→海通) |
|
|
|
|
|
| -------------- | ---------- | ------------ |
|
|
|
|
|
| m\_nDate | nActionDay | Int型→date型 |
|
|
|
|
|
| m\_nTime | nTime | Int型→time型 |
|
|
|
|
|
| m\_nOpen | nOpen | nOpen/10000 |
|
|
|
|
|
| m\_nHigh | nHigh | nHigh/10000 |
|
|
|
|
|
| m\_nLow | nLow | nLow/10000 |
|
|
|
|
|
| m\_nClose | nClose | nClose/10000 |
|
|
|
|
|
| code | szXnCode | copy |
|
|
|
|
|
| m\_iVolume | iVolume | copy |
|
|
|
|
|
| m\_iTurover | iTurnover | copy |
|
|
|
|
|
| m\_nMatchItems | | |
|
|
|
|
|
|
|
|
|
|
另外还要注意以下几点:
|
|
|
|
|
1. 海通数据是前置的,旭诺数据是后置的,即前者14:56的数据反映的是14:56-14:57的成交情况,后者反映的是14:55-14:56的成交情况,所以在映射时要错位映射。
|
|
|
|
|
2. 1的逻辑也导致了海通数据没有11:30和15:00两个时间戳,而旭诺数据有,且旭诺数据将14:56-15:00的数据都包括在了15:00这个时间戳内。不过旭诺数据依然有9:30的时间戳,反映开盘行情。
|
|
|
|
|
|
|
|
|
|
### 海通数据vs天软数据
|
|
|
|
|
|
|
|
|
|
以天软数据为基准,海通数据主要有三点问题:
|
|
|
|
|
|
|
|
|
|
1. 历史上一大段时间缺失了001872 001914 689009三只股票,其中
|
|
|
|
|
- 001872在20181226之前无数据,因为20181226更换了股票代码,之前的股票代码为000022;
|
|
|
|
|
- 001914在20191216之前无数据,因为20191216更换了股票代码,之前的股票代码为000043;
|
|
|
|
|
- 689009在20210402-20210528期间无数据,股票这期间并未更换股票代码或停牌等其他重大事件
|
|
|
|
|
- 对于前两种情况,海通的处理逻辑是,变更前和变更后的代码分开记录变更前后的数据,而天软的处理逻辑是,保留变更前的记录,同时copy一份到变更后,并用变更后的股票代码继续记录变更后的数据,所以导致变更之前的时间戳上天软有变更后代码的数据,但海通没有。对于第三种情况,则属于__数据缺失__。
|
|
|
|
|
2. 海通数据多了很多停牌、未上市或者已退市,但并未做剔除处理的数据,最多的时候单日多出来190只股票。这些未剔除的数据都是当天停牌的,显示为高开低收全天一样,且成交量、成交额、成交笔数全为0(唯一例外是20151123的600568.SH在9:30有成交数据,但当天实际上是停牌的)。由于海通对于停牌等情况的基本处理逻辑是剔除当天行情,整个行情理论上不包含停牌期的时间戳和数据,且在天软里面也完全没有退市、停牌、未上市期间的行情数据,所以这些多出来的股票数据属于__异常__。
|
|
|
|
|
3. 海通的数据相比于天软,剔除了北交所的股票,但多出来了510300.SH, 510050.SH, 510500.SH, 159915.SZ, 159949.SZ 5个etf。
|
|
|
|
|
- 不过目前这三个问题影响不算很大,对于(1),可以在后续处理时将两个股票代码的行情进行拼接,并统一用变更后代码赋值code列,即可保证和天软数据一致;对于(2),由于天软daily是准确的,可以通过天软daily数据进行过滤,或者对日内vol求和进行判断,和为0的属于异常点,计算因子时不予考虑;对于(3),在数据处理时加上股票代码的正则表达式过滤。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Appendix: 海通高频数据录入说明:
|
|
|
|
|
|
|
|
|
|
- Python语言从数据库中读取字节流程序并解码还原示例程序在ReadTickFromDB.py中。
|
|
|
|
|
- 该函数需要pymssql、gzip、google.protobuf(可用pip install protobuf安装)三个外部依赖库需要在运行程序。
|
|
|
|
|
- 成功读取后,每个标的会读出并解析成一个结构体数组的数据结构,可以对于该数据进行进一步操作。
|
|
|
|
|
|