@BurdenBear
2018-09-01T02:55:50.000000Z
字数 14613
阅读 669
国金因子
大鱼因子开发体系是一套完整的针对量化因子模型进行开发研究并投入生产的体系,主要包含三大部分:
生产任务调度器基于生产-消费者模式设计,调度器中主要有以下组件:
因子代码的存放源头,负责获取所有因子ID和代码,注意要保证因子ID的唯一性。
已支持的代码源有:
因子计算的具体执行者,根据输入的因子和时间范围进行因子计算
因子存储负责获取自身存储因子在一段时间范围内的完整度,以及在接受到因子计算器返回的结果后,对因子存储中的数据进行全量或增量的更新。
已支持的因子存储有:
任务调度者负责管理任务的发布和状态更新,各组件对任务状态变化事件订阅以及任务的存储。未来还会支持任务的持久化和恢复。
提供截至当前的包含因子计算所需的完整基础数据的交易日索引,因子存储依据该索引来检查所有因子是否更新到最新。
负责收集任务的执行情况及错误信息,并及时反馈给系统管理员(通过邮件等方式)。
负责在因子写入因子存储前按照对应关系映射成其他的因子名。
该服务使用golang开发,以上角色都定义了抽象接口以及接入方式,可以进行拓展开发,支持跨平台部署。更详细的API文档请见:
管理页面运行在调度器所在机器,默认绑定http://127.0.0.1:19328。
通过管理页面可以查看调度器的配置以及最近任务的运行情况。
GlobalConfig是dyupdater全局配置,主要是一些计算相关的参数。 配置的位置在整个配置文件中的base项。 可配置选项有:
cal-start-date # 计算开始时间,可以通过环境变量CAL_START_DATE指定,默认20100101
max-cal-duration # 最长计算区间长度,以秒为单位,计算任务会按时间被切分,最长不超过该值。可以通过环境变量MAX_CAL_DURATION指定,默认5*365*24*60*60=5年
min-cal-duration # 最短计算区间长度,以秒为单位,计算任务会填补到至少有该值得长度,可以通过环境变量MIN_CAL_DURATION指定,默认30*24*60*60=1月
配置示例:
base:
cal-start-date: 20140101
max-cal-duration: 157680000 # 5年
min-cal-duration: 2592000 # 1月
实际的计算任务会读取计算区间起点往前回溯至少一年的数据,以确保计算区间内算出的因子值均为有效值。
CronService 是定时任务模块,负责根据配置定时运行检查因子任务,
每一个因子检查的任务的配置包含以下几个选项:
rule: 字符,定义了运行任务的时间规则,见 https://crontab.guru
start: 检查任务的日期范围的开始日期,格式形如"20060102"
startDelta: 检查任务的日期范围的开始日期距离当前时间的秒数
end: 检查任务的日期范围的结束日期,格式形如"20060102"
endDelta: 检查任务的日期范围的结束日期距离当前时间的秒数
如果end和endDelta都为0的话,默认检查日期范围截止到昨天。
定时任务的配置例子如下(yaml格式):
cron:
enabled: true
tasks:
# 定时任务everyday,将在每周一至周五的5:00 ~ 8:59分每30分钟运行一次,检查范围为上周到昨天截止
# crontab的规则定义可以参考 https://crontab.guru
everyday:
# At every 30th minute past every hour from 5 through 8 on every day-of-week from Monday through Friday.
rule: "0 */30 5-8 * * 1-5"
# start time from now , in seconds, 604800 = 7*24*60*60 = 7days.
startDelta: 604800
# 定时任务everyweekends,将在每个周日每隔8小时运行一次,检查范围为从20100101开始到昨天截止
everyweekends:
# past every 8th hour on Sunday.
rule: "0 0 */8 * * 0"
# start time in format "20060102"
start: 20100101
CeleryService
Celery是python的分布式任务队列模块 CeleryService的配置对应于配置文件中的celery一项 celery配置项是一个字典,每一个字典项对应一个celery实例的配置,key对应 celery实例的名字,value对应celery实例的信息。 每一个celery实例可以包含的配置项有:
host #字符串,celery flower的host地址,默认localhost:5555
backend #字符串,redis的url地址,默认redis://localhost
broker #字符串,broker的url地址,默认amqp://guest:guest@localhost
queues #字符串数组,对应broker的所有queue名字
clean-broker #bool,启动时是否清理broker,默认True
clean-backend #bool,启动时是否要清理backend,默认True
配置示例:
celery:
default:
host: 127.0.0.1:5555
backend: redis://127.0.0.1/0
broker: amqp://guest:guest@127.0.0.1
queues:
- factor
- stores
- oracle
Package sources 定义了FactorSource(因子代码源)接口。
实现了该接口的类可以通过services.RegisterSource方法注册, 注册后即可在配置中通过type字段指定。
已有的实现:
MysqlSource,注册名mysql
FileSystemSource,注册名filesystem
因子代码源的配置的key为sources,值为一个字典,字典key对应因子代码源的名字(用于区分不同的source) 字典的value有以下字段可以配置:
enabled: bool型,表示该因子代码源是否生效,不生效的代码源中的因子不会被检查。
type: 因子代码源类注册的名字
...: 对应因子代码源类的其他可配置项,见该因子代码源类的文档。
FileSystemSource 从文件系统读取因子脚本. 因子脚本支持两种格式:
FileSystemSource的配置项如下:
path: 文件系统路径,支持环境变量展开
regex: 正则表达式,如果该项不为空,只会读取因子ID满足该正则的因子。
MysqlSource 从mysql数据库读取因子. 存放因子的表需要有以下表结构:
| id | name | code |
name为字符,将被作为因子ID,code存放因子的代码,只支持单文件代码的因子。
MysqlSourceConfig的配置项如下:
url: 数据库URL
table: 存放因子的表
因子代码源的配置例子(yaml格式):
sources:
default:
type: mysql
url: root:root@tcp(localhost)/strategymanager
db: strategymanager
table: factor_factor
local:
type: filesystem
path: $HOME/.fxdayu/factors-scripts
regex: ^[A-Z0-9_]*$
Package calculators 定义了FactorCalculator(因子计算器)接口。
实现了该接口的类可以通过services.RegisterCalculator方法注册, 注册后即可在配置中通过type字段指定。
已有的实现:
CeleryCalculator,注册名celery
因子计算器的配置的key为calculators,值为一个字典,字典key对应因子计算器的名字(用于区分不同的calculator) 字典的value有以下字段可以配置:
enabled: bool型,表示该因子计算器是否生效,不生效的计算器中的因子不会接收到计算任务。
type: 因子计算器类注册的名字
...: 对应因子计算器类的其他可配置项,见该因子计算器类的文档。
CeleryCalculator 将因子计算任务发送给celery并监控任务运行。 CeleryCalculator的配置项如下:
celery: 对应celery配置中的某个celery实例的名字,如果配置不正确会报错退出。
task: celery中用于因子计算的任务名(一般无需改动)
因子计算器的配置例子(yaml格式):
celery:
default:
host: 127.0.0.1:5555
backend: redis://127.0.0.1/0
broker: amqp://guest:guest@127.0.0.1
queues:
- factor
- stores
calculators:
default:
type: celery
celery: default # 和celery配置中的celery实例相对应
注意:现在还不支持通过calculator名指定计算任务分配给哪一个计算器,默认会全部分配给名为default的计算器。
Package stores 定义了FactorStore(因子存储)接口。
实现了该接口的类可以通过services.RegisterStore方法注册, 注册后即可在配置中通过type字段指定。
已有的实现:
MongoStore,注册名mongo
CSVStore,注册名csv
OracleStore,注册名oracle
HDF5Store,注册名hdf5
因子存储的配置的key为stores,值为一个字典,字典key对应因子存储的名字(用于区分不同的store) 字典的value有以下字段可以配置:
enabled: bool型,表示该因子存储类是否生效,不生效的因子存储在服务启动后会实例化但不会接收处理对应任务。
type: 因子存储类注册的名字
...: 对应因子存储类的其他可配置项,见该因子存储类的文档。
CSVStore 是将因子数据存为csv文件的因子存储 CSVStore 效率比较低下,不建议使用。
CSVStore 的配置项有:
path: csv文件将存放在该目录下,不存在会自动创建,每一个因子对应一个同名csv文件。
MongoStore 是依托mongodb的因子存储。 MongoStore的配置选项有:
url: 数据库url, 默认: mongodb://localhost:27017 ,可以参考 https://docs.mongodb.com/manual/reference/connection-string/
db: 数据库名,默认: fxdayu_factors
OracleStore 是依托oracle数据库的因子存储。
因子数据将存放在与因子ID同名的表中。
因子数据表有以下格式:
| TDATE | SYMBOLCODE | RAWVALUE | PROCESSEDVALUE | PROCESSEDTYPE |
建表语句如下:
CREATE TABLE "{{.username}}"."{{.tablename}}" (
"TDATE" NUMBER(14) NOT NULL ,
"SYMBOLCODE" VARCHAR2(12) NOT NUll,
"RAWVALUE" Number ,
"PROCESSEDVALUE" Number ,
"PROCESSEDTYPE" VARCHAR2(1)
)`)
OracleStore的配置选项有:
url: 数据库url, url格式为:{username}/{password}@{host}:{port}/{sid}?{params},如:hr/hr@localhost:1521/xe?as=sysdba
transaction: 是否每次写入都以事务的方式进行,建议开启,默认开启。
HDF5Store 是将因子数据存为hdf5文件的因子存储 由于golang没有很好的操作hdf5文件的库,这部分的任务通过celery发送给python完成 hdf5文件存放的目录为: ~/.fxdayu/data/dyfactors, windows上为:C:\Users\%username%.fxdayu\data\dyfactors HDF5Store 的配置项有:
celery: celery实例名,任务会被发送到该celery实例,需要在celery配置中有对应的项。
因子存储的配置例子(yaml格式):
stores:
mongo:
type: mongo
enabled: true
url: mongodb://127.0.0.1
db: fxdayu_factors
local:
type: csv
enabled: false
path: $HOME/.fxdayu/factors/
oracle:
type: oracle
enabled: true
url: FXDAYU/FXDAYU@localhost:1521/xe
hdf5:
type: hdf5
celery: default # 需要在celery中配置对应名字的celery实例
Package mappers 定义了FactorNameMapper(因子名映射)接口。
实现了该接口的类可以通过services.RegisterStore方法注册, 注册后即可在配置中通过type字段指定。
已有的实现:
CSVMapper,注册名csv
因子名映射的配置的key为mapper
,值为单个字典,字典的value有以下字段可以配置:
enabled: bool型,表示该因子存储类是否生效,不生效的因子存储在服务启动后会实例化但不会接收处理对应任务。
type: 因子名映射类的注册名
...: 对应因子名映射类的其他可配置项,见该因子名映射类的文档。
CSVMapper 从CSV文件中读取因子名映射表,如某因子名出现在表中,则对其进行映射,否则则保持原因子名。
CSV映射表格式如下:
| source | store |
source列表示映射前的因子名,store列表示映射后的因子名。
CSVMapper的配置项如下:
file: 对应CSV映射表文件的位置。
stores: array of string, 表示哪些要对哪些stores启用映射,如果不指定,则默认对所有的stores都启用映射。
mapper:
type: csv # 对应CSVMapper类
stores: oracle # 只对oracle数据源开启因子名映射
file: ./mapping.csv # csv映射表文件的位置
base:
cal-start-date: 20140101 #计算从2014年01月01号开始
celery:
# 定义了名为default的celery实例
default:
host: 127.0.0.1:5555
backend: redis://127.0.0.1/0
broker: amqp://guest:guest@127.0.0.1
queues:
- factor
- stores
- oracle
sources:
# 使用本地文件系统作为因子代码源,文件夹位置为:./uqer复现合格
uqer:
type: filesystem
path: ./uqer复现合格
calculators:
default:
type: celery
celery: default # 使用名为default的celery实例,和之前的celery实例定义相对应。
stores:
# 定义名为default的mongodb因子存储,默认开启生效。
default:
type: mongo
url: mongodb://127.0.0.1
db: fxdayu_factors
# local:
# type: csv
# path: ./data
# 定义名为hdf5的hdf5因子存储,默认开启生效。
hdf5:
type: hdf5
celery: default # 使用名为default的celery实例,和之前的celery实例定义相对应。
oracle:
type: oracle
url: FXDAYU/FXDAYU@192.168.0.102:1520/xe
indexer:
# 使用wind数据库中的交易日索引
type: wind
server: 192.168.0.102
db: dbo
uid: SA
pwd: FXDAYU
mapper:
type: csv
stores: oracle # 只对oracle数据源开启因子名映射
file: ./mapping.csv
cron:
enabled: true
tasks:
# This cron means to check factor data in the last week every 30 minutes during 05:00 ~ 09:00 at every workday.
# You can test a cron rule at https://crontab.guru
everyday:
# At every 30th minute past every hour from 5 through 8 on every day-of-week from Monday through Saturday.
rule: "0 */30 5-8 * * 1-6"
# start time from now , in seconds, 604800 = 7*24*60*60 = 7days.
startDelta: 604800
# This cron means to check all factor data from 20100101 every 8 hour at every weekends.
everyweekends:
# past every 8th hour on Sunday.
rule: "0 0 */8 * * 0"
# start time in format "20060102"
start: 20100101
# test:
# #每隔5秒运行,用于测试
# rule: "*/5 * * * * *"
# start: 20120101
该服务为单个可执行文件dyupdater.exe
运行方式,在dyupdater.exe所在目录打开cmd, 输入:
$ ./dyupdater -h
Usage of dyupdater:
run Run the dyupdater with web UI, run tasks which is in cron settings or sending by web UI.
check Run checking and updating for once without web UI.
$ ./dyupdater run -h
Usage of dyupdater run:
-l, --logfile string Set the updater's logfile path. (default "dyupdater.log")
-L, --accessLogFile string Set the dashbord's access logfile path. (default "gin.log")
-c, --config string Using the given config file.
-d, --debug Run at debug mode.
-H, --host string Dashboard's host. (default "127.0.0.1")
-p, --port int Dashboard's port. (default 19328)
-C, --check Whether to do a initial checking after run.
$ ./dyupdater check -h
Usage of dyupdater check:
-l, --logfile string Set the logfile path. (default "./dyupdater.log")
-c, --config string Using the given config file.
-d, --debug Run at debug mode.
-s, --start int The check's start date in format "20060102", default will be cal-start-date in configation.
-e, --end int The check's end date in format "20060102", 0 means up to today.
推荐使用NSSM将dyupdater run --check
命令打包成windows服务启动,windows服务能保证dyupdater持续运行,如遇到dyupdater出错退出,程序会自动重启且自动重新检查因子发布计算任务,以保证因子的更新(每次重启后,管理页面中只能看到该次启动后发布的任务)。
打开浏览器访问 http://localhost:19328 如果出现管理界面则表示正在正常运行。
dyupdater服务异常表现在对应的windows服务连续失败退出,这种可能发生在配置中需要连接的某数据库不能正常访问,此时需要查看日志看是哪个数据库服务出现了异常。恢复该数据库服务后就程序就可以恢复正常运行。
针对使用nssm安装的情况,以服务安装为dyupdater为例:
nssm edit dyupdater
nssm start dyupdater
nssm stop dyupdater
nssm restart dyupdater
nssm status dyupdater
该部分服务主要用到了由8个部分组成,使用了python的celery分布式任务后端框架,结构如下图:
fc-flower服务为celery的拓展模块,负责提供通过http请求发布celery任务以及worker和task的监控功能。
如发现dyupdater服务中计算任务的发布出现问题,则需要检查或重启该服务。
打开 http://localhost:5555 可以查看各celery的workers的运行情况。
CELERY_BROKER_URL=amqp://guest:guest@localhost:5672 # celery broker URL,指向rabbitmq
CELERY_RESULT_BACKEND=redis://localhost:6379 # celery backend URL,指向redis
FACTOR_CONDA_ENV # conda环境名,默认base
nssm edit fc-flower
nssm start fc-flower
nssm stop fc-flower
nssm restart fc-flower
nssm status fc-flower
fc-worker属于celery worker,负责接收处理因子计算相关的任务,如果观察到因子计算任务不能正常进行,则需要检查或重启该服务。
CELERY_BROKER_URL=amqp://guest:guest@localhost:5672 # celery broker URL,指向rabbitmq
CELERY_RESULT_BACKEND=redis://localhost:6379 # celery backend URL,指向redis
FACTOR_CONDA_ENV # conda环境名,默认base
CELERYD_CONCURRENCY=2 # 任务并行数,需和fc-manager中保持一致。
CELERYD_TASK_TIME_LIMIT # 任务执行时间限制,秒为单位,需和fc-manager中保持一致。
nssm edit fc-worker
nssm start fc-worker
nssm stop fc-worker
nssm restart fc-worker
nssm status fc-worker
fc-manager是实际执行因子计算的服务,fc-worker最终会将计算任务转发该服务,然后该服务将计算结果返回。fc-manager和fc-worker配对部署且应设置相同的并行数。如果因子计算经常超时或者一直处于等待中,则需要检查或重启该服务。
FACTOR_CONDA_ENV # conda环境名,默认base
CELERYD_CONCURRENCY=2 # 任务并行数,需和fc-worker中保持一致。
CELERYD_TASK_TIME_LIMIT # 任务执行时间限制,秒为单位,需和fc-worker中保持一致。
FXDAYU_ROOT=${HOME}/.fxdayu # 因子计算所需global_dv存放在${FXDAYU_ROOT}/data/factor_calculator位置下。需和fc-updater中保持一致。
nssm edit fc-manager
nssm start fc-manager
nssm stop fc-manager
nssm restart fc-manager
nssm status fc-manager
fc-updater负责每日更新global_dv,如果发现计算任务出现类似以下的错误:
Cal end_date XXX is beyond dataview's end_date XXX
则说明global_dv未能及时更新,此时需要检查或重启updater乃至更上游的数据服务。
FACTOR_CONDA_ENV # conda环境名,默认base
FXDAYU_ROOT=${HOME}/.fxdayu # 因子计算所需global_dv存放在${FXDAYU_ROOT}/data/factor_calculator位置下。需和fc-manager中保持一致。
nssm edit fc-updater
nssm start fc-updater
nssm stop fc-updater
nssm restart fc-updater
nssm status fc-updater
fc-oracle负责接收和oracle因子存储的写入数据任务,因子数据写入oracle的操作实际发生在该服务中,如果其他组件工作正常而写入oracle发生异常,则需要检查或重启该服务,同时等待下一次计算任务发布或直接重启计算任务发布服务dyupdater。
CELERY_BROKER_URL=amqp://guest:guest@localhost:5672 # celery broker URL,指向rabbitmq
CELERY_RESULT_BACKEND=redis://localhost:6379 # celery backend URL,指向redis
CELERYD_CONCURRENCY=2 # 任务并行数
CELERYD_TASK_TIME_LIMIT # 任务执行时间限制,秒为单位
FACTOR_CONDA_ENV # conda环境名,默认base
FXDAYU_ROOT=${HOME}/.fxdayu # 因子hdf5文件存放在${FXDAYU_ROOT}/data/dyfactors位置下。
ORACLE_URL=FXDAYU/FXDAYU@localhost:1521/EE # oracle数据库地址
nssm edit fc-oracle
nssm start fc-oracle
nssm stop fc-oracle
nssm restart fc-oracle
nssm status fc-oracle
fc-stores负责接收hdf5因子源的检查、读取和更新任务,对hdf5文件的操作实际放生在该服务中,如果其他组件工作正常而写入hdf5发生异常,则需要检查或重启该服务,同时等待下一次计算任务发布或直接重启计算任务发布服务dyupdater。
CELERY_BROKER_URL=amqp://guest:guest@localhost:5672 # celery broker URL,指向rabbitmq
CELERY_RESULT_BACKEND=redis://localhost:6379 # celery backend URL,指向redis
CELERYD_CONCURRENCY=2 # 任务并行数
CELERYD_TASK_TIME_LIMIT # 任务执行时间限制,秒为单位
FACTOR_CONDA_ENV # conda环境名,默认base
FXDAYU_ROOT=${HOME}/.fxdayu # 因子hdf5文件存放在${FXDAYU_ROOT}/data/dyfactors位置下。
nssm edit fc-stores
nssm start fc-stores
nssm stop fc-stores
nssm restart fc-stores
nssm status fc-stores
redis以windows服务的方式安装,意外退出会自动重启,在cmd
中使用以下命令可以查看其运行状态:
sc query redis
可以通过redis客户端软件如RedisDesktopManager连接 redis://localhost:6379 来查看redis中的数据详情。
sc start redis
sc stop redis
sc query redis
rabbitmq以windows服务的方式安装,意外退出会自动重启,在cmd
中使用以下命令可以查看其运行状态:
sc query rabbitmq
在安装服务的机器上打开 http://localhost:15672 进入rabbitmq自带的管理页面,账号和密码均为默认的guest
。
sc start rabbitmq
sc stop rabbitmq
sc query rabbitmq
国金服务器上个项目代码位置、日志位置:
C:\Users\bigfish01\Documents\GolangProjects\src\fxdayu.com\dyupdater\
C:\Users\bigfish01\Documents\Python Scripts\factor-scripts\dyupdater.exe
C:\Users\bigfish01\Documents\Python Scripts\factor-scripts\dyupdater-service.log
C:\Users\bigfish01\Documents\Python Scripts\factor-api-server\factor-api-server
C:\Users\bigfish01\Documents\Python Scripts\factor-api-server\logs
C:\Program Files\Redis
C:\Program Files\Redis\Logs
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.6
C:\Users\bigfish01\AppData\Roaming\RabbitMQ
路径: C:\Users\bigfish01\Documents\Python Scripts\factor-scripts\factor-scripts\
如需新增因子脚本存储的路径,参见dyupdater
中FileSystemSource
因子源配置一节。
路径: C:\Users\bigfish01\.fxdayu\data\dyfactors
参见fc-stores
中的配置一节。
以上除日志以外位置的更改通常都需要修改服务中对应的配置,不建议修改和移动这些位置。