[关闭]
@BurdenBear 2018-12-20T12:12:32.000000Z 字数 17504 阅读 468

大鱼因子开发体系使用手册(部署文档windows版)

国金因子


1.依赖软件

1.1 安装chocolatey

chocolatey致力于windows下成为类似yumapt一类的软件包仓库工具
请安装官网的说明安装
安装此软件后,其他的所有其他依赖都可以使用choco来进行安装,建议直接跳转1.8使用脚本安装所有依赖,如果出现问题再手动安装。

1.2 安装git

git是最常用的代码管理工具之一。
下载地址: https://git-scm.com/

也可以使用 choco install git 命令来安装

1.3 安装anaconda3

anaconda3是集成了许多科学计算相关包和模块管理工具conda的python3集成版本
下载地址: https://www.anaconda.com/download/

也可以使用 choco install anaconda3 命令来安装

1.4 安装visual cpp build tools

此为windows系统上的cpp编译器,许多python模块安装的编译阶段需要用到该编译器
安装命令 choco install visualcppbuildtools

1.5 安装nssm

nssm是一个开源免费工具,用于将.bat程序制作成windows上的服务,可以配置服务自动重启,日志输出,环境变量等。下载后将nssm.exe所在目录加入系统环境变量PATH中即可使用
下载地址: https://nssm.cc/download
使用说明: https://nssm.cc/usage

也可以使用 choco install nssm 命令来安装

1.6 安装Rabbitmq消息队列

负责factor-api-serverdyupdater,发送计算任务信息。如果已有可访问的rabbtimq服务也可以直接配置使用

1.6.1 确定安装的Erlang和Rabbitmq版本

从该页面找到最新适配RabbitmqErlang版本: https://www.rabbitmq.com/which-erlang.html
erlang.PNG-135.4kB

1.6.2 安装Erlang

下载安装1.4.1中确定的相应版本的Erlang
地址:http://www.erlang.org/downloads

1.6.3 安装Rabbitmq

下载安装1.4.1中确定的相应版本的Rabbitmq
地址: https://www.rabbitmq.com/download.html
注意要在安装时勾选安装windows服务
rabbitmq.PNG-13.9kB

也可以使用choco install rabbitmq 命令来安装

1.6.4 (可选)开启rabbitmq管理模块

安装好rabbitmq后,打开cmd,进入rabbitmq安装目录中(C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.8\sbin),运行以下命令:

  1. rabbitmq-plugins enable rabbitmq_management

1.7 安装redis内存数据库

负责factor-api-server和dyupdater,储存计算任务结果。如果已有可访问的redis服务也可以直接配置使用

1.7.1 下载安装redis

github仓库: https://github.com/MicrosoftArchive/redis
安装文件下载地址: https://github.com/MicrosoftArchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.msi
安装时建议勾选将安装目录添加到系统PATH环境变量;如需设置maxmemory,至少设置4G以上。

也可以使用choco install redis-64 命令来安装

1.7.2 修改redis默认配置(非脚本安装必需进行)

进入redis安装目录,找到redis.windows-service.conf文件
默认位置在C:\Program Files\Redis\redis.windows-service.conf
用代码编辑器打开该文件(推荐vscode),搜索notify-keyspace-events
将对应行改成:

  1. notify-keyspace-events "EA"

修改完成后在cmd中运行以下命令重启Redis服务

  1. sc stop redis
  2. sc start redis

1.8 简易安装脚本

  1. @echo off
  2. cd %~dp0
  3. @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  4. choco install -y git
  5. choco install -y anaconda3
  6. choco install -y visualcppbuildtools
  7. choco install -y nssm
  8. choco install -y rabbitmq
  9. REM install redis
  10. set REDIS_MSI_FILE=Redis-x64.msi
  11. if not exist %TEMP%\%REDIS_MSI_FILE% (
  12. echo "Redis-x64.msi 下载中..."
  13. @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;(new-object System.Net.WebClient).DownloadFile('https://github.com/MicrosoftArchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.msi','%TEMP%/%REDIS_MSI_FILE%')"
  14. echo "Redis-x64.msi 下载完成,开始安装..."
  15. ) else (
  16. echo "Redis-x64.msi 已存在,开始安装..."
  17. )
  18. msiexec /passive /i %TEMP%\%REDIS_MSI_FILE%
  19. echo "Redis-x64.msi 安装完成"
  20. set REDIS_HOME=C:\Program Files\Redis
  21. set PATH=%PATH%;%REDIS_HOME%
  22. echo "拷贝Redis配置文件到C:\Program Files\Redis\redis.windows-service.conf(将覆盖之前的配置)"
  23. copy redis.windows-service.conf "C:\Program Files\Redis\redis.windows-service.conf"
  24. echo "重启Redis服务"
  25. redis-server --service-stop
  26. redis-server --service-start
  27. echo "Redis安装完成"
  28. pause

该脚本为幂等,如遇失败可多次重复运行。

2. 安装数据打包服务DataSync

该服务将多个数据源中的数据打包成统一的hdf5格式。

2.1 克隆项目代码

项目地址: http://gitlab.fxdayu.com:8888/xingetouzi/DataSync
在本地打开git命令行,使用以下命令克隆项目代码

  1. 1. git clone http://gitlab.fxdayu.com:8888/xingetouzi/DataSync.git

2.2 切换代码分支

进入工程根目录
使用以下命令切换到guojin分支

  1. 1. git fetch
  2. 2. git checkout guojin

2.3 安装项目

在DataSync目录下打开命令行,输入以下命令

  1. python setup.py install

2.4 配置

配置信息以Excel表格形式存放,可根据需求新增表,但必须严格按照原有格式,否则服务会出现错误。

默认配置文件存放位置为:
\DataSync\config.xlsx
Daily_data sheet 存放的是日线配置信息,lb_data sheet存放的是季度数据配置信息,表格示例如下:

表名 (例)dbo.AINDEXEODPRICES
origin 数据源,目前支持SqlServer/Oracle
db_config 数据库信息配置,包括数据库地址,
fields 需要请求的数据字段,若为空则取表内全品种
S_INFO_WINDCODE 需要请求的证券代码,若为空则取表内全品种
DATE_NAME 日期索引的字段名
start_date 默认开始日期,若本地数据为空,则请求以该日期为起始时间的数据
其它字段 ……

2.5 安装为windows定时任务

1)打开windows任务计划程序
1539055935883.png-5.9kB
2)创建任务
1539056202717.png-128.5kB

3)在DataSync项目下找到run_sync.bat文件,在计划任务下设置以日频率执行该脚本。
1539056540773.png-38.9kB

3.安装jaqs统一数据接口服务jaqsmds

jaqsmds是部署在本地的数据服务,jaqs客户端可与之交互并请求数据。该文档主要介绍其在win10上的安装及部署方法。

在安装和启动前请先确保:
1. 已按照 大鱼因子开发体系使用手册(部署文档windows版).pdf 安装好相应的依赖软件。
2. 已通过 datasync 同步本地数据。

3.1 依赖软件

3.1.1 git

安装参考 大鱼因子开发体系使用手册(部署文档windows版).pdf (1.2)

3.1.2 anaconda3

安装参考 大鱼因子开发体系使用手册(部署文档windows版).pdf (1.3)

3.1.3 visual cpp build tools

安装参考 大鱼因子开发体系使用手册(部署文档windows版).pdf (1.4)

3.1.4 nssm

安装参考 大鱼因子开发体系使用手册(部署文档windows版).pdf (1.5)

3.2 安装流程

安装均通过windows命令行(cmd)完成。安装前请确保 1. 中的依赖软件已全部装好。

3.2.1 创建python虚拟环境

为了不破坏其他项目的依赖包,这里创建一个只供该项目使用的虚拟环境。

conda create -n jaqsmds python=3.6 pymssql python-snappy pip=9.0.1 anaconda

3.2.2 安装Python包

activate jaqsmds
pip install git+http://gitlab.fxdayu.com:8888/xingetouzi/jaqsmds.git

3.2.3 配置和启动

在任意位置新建文件夹:jaqsmds (为了方便建议在用户目录或者除C盘外其他盘符的根目录)
在jaqsmds中创建日志文件夹: logs

其中(3.2.3.1 配置文件)定义了数据服务每个接口要用的数据源,文件格式为json。目前已根据国金环境各数据源配置完毕,请勿随意更改配置文件(3.2.3.2 字段映射表)是一个设定本地的数据服务(server)和数据源的字段映射关系的文件,可以通过配置该表格指定所取数据的字段名。目前服务器上已有一个默认的字段映射关系,当前提供的因子脚本基于该映射关系编写,请勿随意更改已建立的映射关系,否则将因子脚本将不能正常工作。

3.2.3.1 配置文件

jaqsmds目录中创建配置文件 config.json
下面为配置文件模板:

  1. [
  2. {
  3. "type": "local",
  4. "sqlite": {
  5. "file": "D:/hdf5_data/data.sqlite",
  6. "table_map": {
  7. "lb.secIndustry": "[lb.secIndustry]",
  8. "lb.indexWeightRange": "[lb.indexWeightRange]",
  9. "jz.instrumentInfo": "[jz.instrumentInfo]"
  10. }
  11. },
  12. "hdf": {
  13. "index": "/date_flag",
  14. "column": "/symbol_flag",
  15. "exclude": ["trade_date", "symbol"],
  16. "predefine": true,
  17. "views": {
  18. "dyfactors": "C:/Users/bigfish01/.fxdayu/data/dyfactors",
  19. "uqer_factor": "D:/oracle_data/uqer_factor",
  20. "lb.secDailyIndicator": "D:/hdf5_data/dbo.ASHAREEODDERIVATIVEINDICATOR",
  21. "daily": "D:/hdf5_data/dbo.ASHAREEODPRICES",
  22. "lb.secAdjFactor": ["D:/hdf5_data/dbo.ASHAREEODPRICES/S_DQ_ADJFACTOR.hd5"]
  23. },
  24. "view_map":{
  25. "lb.secDailyIndicator": "dbo.ASHAREEODDERIVATIVEINDICATOR",
  26. "daily": "dbo.ASHAREEODPRICES",
  27. "lb.secAdjFactor": "dbo.ASHAREEODPRICES"
  28. }
  29. }
  30. },
  31. {
  32. "type": "mssql",
  33. "connection_params": [],
  34. "predefine": true,
  35. "external": true,
  36. "exclude": ["dbo.ASHAREEODPRICES", "dbo.ASHAREEODDERIVATIVEINDICATOR"],
  37. "db_map": {
  38. "jz.secTradeCal": "dbo.ASHARECALENDAR",
  39. "lb.balanceSheet": "dbo.ASHAREBALANCESHEET",
  40. "lb.cashFlow": "dbo.ASHARECASHFLOW",
  41. "lb.finIndicator": "dbo.ASHAREFINANCIALINDICATOR",
  42. "lb.income": "dbo.ASHAREINCOME",
  43. "lb.indexCons": "dbo.AINDEXMEMBERS",
  44. "lb.profitExpress": "dbo.ASHAREPROFITEXPRESS",
  45. "lb.secDividend": "dbo.ASHAREDIVIDEND",
  46. "lb.secSusp": "dbo.ASHARETRADINGSUSPENSION",
  47. "lb.secRestricted": "dbo.ASHARECOMPRESTRICTED"
  48. }
  49. },
  50. {
  51. "type": "sqlite",
  52. "file": "D:/hdf5_data/data.sqlite",
  53. "table_map": {
  54. "zyyx.conForecastStk": "[ZYYX.CON_FORECAST_STK]",
  55. "zyyx.conRatingStk": "[ZYYX.CON_RATING_STK]"
  56. }
  57. }
  58. ]
3.2.3.2 字段映射表

为解决本地数据库字段名过于复杂,不同表字段不唯一以及与jaqs字段名不匹配的问题,需要一张字段映射表来表示由数据源到服务端的字段映射关系。
在jaqsmds目录下新建Excel文件:name_map.xlsx
文件内容如下图:
image.png-37.7kB

3.2.3.3 启动脚本

jaqsmds目录下创建启动脚本 service.bat

  1. @echo off
  2. set FRONTEND=tcp://0.0.0.0:23000
  3. set BACKEND=tcp://127.0.0.1:23001
  4. set FILE=./config.json
  5. set MAPPER=./name_map.xlsx
  6. call activate jaqsmds
  7. call jaqsmds server

环境变量参数说明

变量名 默认值 含义
FRONTEND tcp://0.0.0.0:23000 服务监听的地址,jaqs客户端可以通过该地址从服务请求数据。该地址不可与其他程序共用,如果在一台服务器上启动2个或以上jaqsmds服务需要分别设置不同的FRONTEND。
BACKEND tcp://127.0.0.1:23001 该地址不可与其他程序共用,如果在一台服务器上启动2个或以上jaqsmds服务需要分别设置不同的BACKEND。
FILE ./config.json 数据源配置文件
MAPPER 字段映射表
3.2.3.4 启动服务

在该目录下双击下service.bat 即可启动服务。服务启动后会弹出命令行窗口输出相关日志,关闭窗口即可关闭服务。

启动服务后可以参照 (3. 测试)进行测试,测试成功再将其注册为windows服务(参考 2.4)

3.2.4 用nssm部署服务

2.3中创建的启动脚本只能单次启动服务,在服务因异常原因退出时无法自动重启服务。使用nssm将其部署为windows服务后可以实现开机启动,自动重启,持续运行等功能。安装完nssm并设置好环境变量后可以在cmd中运行nssm相关的命令。

注意: 运行nssm相关的命令时需要以管理员权限打开cmd

3.2.4.1 注册服务

用管理员权限打开cmd。

nssm install jaqsmds

然后会弹出service installer:
image.png-8.6kB

按下表中的描述逐个设置参数(这里假设2.3中创建的文件夹为D:/jaqsmds):

选项卡 参数 描述 参考值
Application Path 要运行的文件(2.3.2中创建的启动脚本)的绝对路径 D:/jaqsmds/service.bat
Application Startup directory 运行时的工作目录(2.3中创建的文件夹) D:/jaqsmds/
Details Display name 在windows服务中显示的名字 jaqsmds
Log on This account 使用指定用户运行程序 勾选,输入当前登录的用户
Log on Password 用户密码 当前登录用户的密码
Log on Confirm 确认用户密码 当前登录用户的密码
Exit actions Restart 非人为关闭服务时执行的操作 Restart application
I/O Output 标准输出(日志)的文件地址 D:/jaqsmds/logs/output.log
I/O Error 标准错误输出(日志)的文件地址 D:/jaqsmds/logs/output.log
File rotation Rotate files 是否*翻滚日志文件 勾选
File rotation Rotate while service is running 服务正在运行时是否*翻滚日志文件 勾选
File rotation Restrict rotaion to files bigger then () bytes 当前日志文件大于多少字节时*翻滚日志 10000000

*翻滚日志: 当前日志文件达到某一条件时关闭该文件并打开新的文件做为日志文件。

设置完成后点击窗口下方的 Install service 即完成服务注册。

3.2.4.2 启动服务

nssm start jaqsmds

服务启动后会保持一直运行的状态,重启操作系统后服务也会自动启动。

3.2.4.3 停止服务

nssm stop jaqsmds

停止当前运行的jaqsmds服务。

3.2.4.4 删除服务

nssm remove jaqsmds

在弹出的对话框中选是即可删除服务。

3.2.4.5 在服务管理器中管理服务(win10)

打开windows服务管理器:控制面板->管理工具->服务,找到jaqsmds,双击打开其属性。
image.png-33.5kB

这里可以直接控制服务状态,例如:如果不想设为开机启动,可以将启动类型设置为手动或禁用。
服务注册成功后如果不使用命令行,可以通过该窗口启动或停止服务。

3.3 测试

服务启动后可以通过测试脚本测试服务是否能够正常运行。

运行如下python脚本(python环境中需安装最新版 jaqs-fxdayu),当最后输出 Test Complete 并结束时说明服务已经在正常运行。
*注意 脚本第16行的 "remote.data.address" 对应的值应为服务启动时FRONTEND设置的值。 (参考 2.3.3)

  1. # encoding: utf-8
  2. from __future__ import print_function
  3. # import jaqs_fxdayu
  4. # jaqs_fxdayu.patch_all()
  5. from jaqs_fxdayu.data import RemoteDataService
  6. from jaqs_fxdayu.data import DataView
  7. import os
  8. # from config_path import DATA_CONFIG_PATH
  9. daily_path = '../output/tests/test_dataview_d'
  10. quarterly_path = '../output/tests/test_dataview_q'
  11. data_config = data_config = {
  12. "remote.data.address": "tcp://127.0.0.1:23000",
  13. "remote.data.username": "username",
  14. "remote.data.password": "password",
  15. }
  16. def test_write():
  17. ds = RemoteDataService()
  18. ds.init_from_config(data_config)
  19. dv = DataView()
  20. secs = '600030.SH,000063.SZ,000001.SZ'
  21. props = {'start_date': 20160601, 'end_date': 20170601, 'symbol': secs,
  22. 'fields': 'open,close,high,low,volume,pb,net_assets,pcf_ncf',
  23. 'freq': 1}
  24. dv.init_from_config(props, data_api=ds)
  25. dv.prepare_data()
  26. assert dv.data_d.shape == (281, 48)
  27. assert dv.dates.shape == (281, )
  28. # TODO
  29. """
  30. PerformanceWarning:
  31. your performance may suffer as PyTables will pickle object types that it cannot
  32. map directly to c-types [inferred_type->mixed,key->block1_values] [items->[('000001.SZ', 'int_income'), ('000001.SZ', 'less_handling_chrg_comm_exp'), ('000001.SZ', 'net_int_income'), ('000001.SZ', 'oper_exp'), ('000001.SZ', 'symbol'), ('000063.SZ', 'int_income'), ('000063.SZ', 'less_handling_chrg_comm_exp'), ('000063.SZ', 'net_int_income'), ('000063.SZ', 'oper_exp'), ('000063.SZ', 'symbol'), ('600030.SH', 'int_income'), ('600030.SH', 'less_handling_chrg_comm_exp'), ('600030.SH', 'net_int_income'), ('600030.SH', 'oper_exp'), ('600030.SH', 'symbol')]]
  33. """
  34. dv.save_dataview(folder_path=daily_path)
  35. def test_load():
  36. dv = DataView()
  37. dv.load_dataview(folder_path=daily_path)
  38. assert dv.start_date == 20160601 and set(dv.symbol) == set('000001.SZ,600030.SH,000063.SZ'.split(','))
  39. # test get_snapshot
  40. snap1 = dv.get_snapshot(20170504, symbol='600030.SH,000063.SZ', fields='close,pb')
  41. assert snap1.shape == (2, 2)
  42. assert set(snap1.columns.values) == {'close', 'pb'}
  43. assert set(snap1.index.values) == {'600030.SH', '000063.SZ'}
  44. # test get_ts
  45. ts1 = dv.get_ts('close', symbol='600030.SH,000063.SZ', start_date=20170101, end_date=20170302)
  46. assert ts1.shape == (38, 2)
  47. assert set(ts1.columns.values) == {'600030.SH', '000063.SZ'}
  48. assert ts1.index.values[-1] == 20170302
  49. def test_add_field():
  50. dv = DataView()
  51. dv.load_dataview(folder_path=daily_path)
  52. nrows, ncols = dv.data_d.shape
  53. n_securities = len(dv.data_d.columns.levels[0])
  54. ds = RemoteDataService()
  55. ds.init_from_config(data_config)
  56. dv.add_field('total_share', ds)
  57. assert dv.data_d.shape == (nrows, ncols + 1 * n_securities)
  58. def test_add_formula_directly():
  59. ds = RemoteDataService()
  60. ds.init_from_config(data_config)
  61. dv = DataView()
  62. secs = '600030.SH,000063.SZ,000001.SZ'
  63. props = {'start_date': 20160601, 'end_date': 20170601, 'symbol': secs,
  64. 'fields': 'open,close',
  65. 'freq': 1}
  66. dv.init_from_config(props, data_api=ds)
  67. dv.prepare_data()
  68. dv.add_formula("myfactor", 'close / open', is_quarterly=False)
  69. assert dv.data_d.shape == (281, 36)
  70. def test_add_formula():
  71. dv = DataView()
  72. dv.load_dataview(folder_path=daily_path)
  73. nrows, ncols = dv.data_d.shape
  74. n_securities = len(dv.data_d.columns.levels[0])
  75. formula = 'Delta(high - close, 1)'
  76. dv.add_formula('myvar1', formula, is_quarterly=False, add_data=True)
  77. assert dv.data_d.shape == (nrows, ncols + 1 * n_securities)
  78. formula2 = 'myvar1 - close'
  79. dv.add_formula('myvar2', formula2, is_quarterly=False, add_data=True)
  80. assert dv.data_d.shape == (nrows, ncols + 2 * n_securities)
  81. def test_dataview_universe():
  82. ds = RemoteDataService()
  83. ds.init_from_config(data_config)
  84. dv = DataView()
  85. props = {'start_date': 20170227, 'end_date': 20170327, 'universe': '000016.SH',
  86. # 'symbol': 'rb1710.SHF,rb1801.SHF',
  87. 'fields': ('open,high,low,close,vwap,volume,turnover,'
  88. + 'sw1,'
  89. + 'roe,net_assets,'
  90. + 'total_oper_rev,oper_exp,tot_profit,int_income'
  91. ),
  92. 'freq': 1}
  93. dv.init_from_config(props, ds)
  94. dv.prepare_data()
  95. data_bench = dv.data_benchmark.copy()
  96. dv.data_benchmark = data_bench
  97. try:
  98. dv.data_benchmark = data_bench.iloc[3:]
  99. except ValueError:
  100. pass
  101. dv.remove_field('roe,net_assets')
  102. dv.remove_field('close')
  103. # quarterly
  104. def test_q():
  105. ds = RemoteDataService()
  106. ds.init_from_config(data_config)
  107. dv = DataView()
  108. secs = '600030.SH,000063.SZ,000001.SZ'
  109. props = {'start_date': 20160609, 'end_date': 20170601, 'symbol': secs,
  110. 'fields': ('open,close,'
  111. + 'pb,net_assets,'
  112. + 'total_oper_rev,oper_exp,'
  113. + 'cash_paid_invest,'
  114. + 'capital_stk,'
  115. + 'roe'), 'freq': 1}
  116. dv.init_from_config(props, data_api=ds)
  117. dv.prepare_data()
  118. dv.save_dataview(folder_path=quarterly_path)
  119. def test_q_get():
  120. dv = DataView()
  121. dv.load_dataview(folder_path=quarterly_path)
  122. res = dv.get("", 0, 0, 'total_oper_rev')
  123. assert set(res.index.values) == set(dv.dates[dv.dates >= dv.start_date])
  124. def test_q_add_field():
  125. dv = DataView()
  126. dv.load_dataview(folder_path=quarterly_path)
  127. nrows, ncols = dv.data_q.shape
  128. n_securities = len(dv.data_d.columns.levels[0])
  129. ds = RemoteDataService()
  130. ds.init_from_config(data_config)
  131. dv.add_field("debttoassets", ds)
  132. assert dv.data_q.shape == (nrows, ncols + 1 * n_securities)
  133. def test_q_add_formula():
  134. dv = DataView()
  135. folder_path = '../output/prepared/20160609_20170601_freq=1D'
  136. dv.load_dataview(folder_path=quarterly_path)
  137. nrows, ncols = dv.data_d.shape
  138. n_securities = len(dv.data_d.columns.levels[0])
  139. formula = 'total_oper_rev / close'
  140. dv.add_formula('myvar1', formula, is_quarterly=False, add_data=True)
  141. df1 = dv.get_ts('myvar1')
  142. assert not df1.empty
  143. formula2 = 'Delta(oper_exp * myvar1 - open, 3)'
  144. dv.add_formula('myvar2', formula2, is_quarterly=False, add_data=True)
  145. df2 = dv.get_ts('myvar2')
  146. assert not df2.empty
  147. if __name__ == "__main__":
  148. g = globals()
  149. g = {k: v for k, v in g.items() if k.startswith('test_') and callable(v)}
  150. # for test_name, test_func in g.items():
  151. for test_name in ['test_write', 'test_load', 'test_add_field', 'test_add_formula_directly',
  152. 'test_add_formula', 'test_dataview_universe',
  153. 'test_q', 'test_q_get', 'test_q_add_field', 'test_q_add_formula',
  154. ]:
  155. test_func = g[test_name]
  156. print("\n==========\nTesting {:s}...".format(test_name))
  157. test_func()
  158. print("Test Complete.")

4.安装配置因子计算服务。

4.1 克隆项目代码

项目地址: http://gitlab.fxdayu.com:8888/xingetouzi/factor-api-server.git
运行以下命令克隆项目代码

  1. git clone http://gitlab.fxdayu.com:8888/xingetouzi/factor-api-server.git

4.2 安装脚本安装

进入代码根目录下,运行:

  1. install-service.bat

屏幕会有以下输出:

  1. Begin to install the factor calculation service as windows services.
  2. =======================================================================
  3. Do you want to set the parallel number?(Y/N)n
  4. Skip set the parallel number,the default value equals to the cpu number of this computer.
  5. =======================================================================
  6. Use custom window account to run service?(Y/N)y
  7. Use custom window account to run service.
  8. Enter windows account username: ***
  9. Enter windows account password: ***

其中出现两个选项:
- 第一个选项询问是否设置计算并行数,默认为cpu数,目前生产服务器该值设置为3。
- 第二个选项大部分情况是必填项,需要输入运行windows服务的windows用户账户名和密码。

填好这些选项后,安装脚本会自动安装所依赖的python包,然后将各启动脚本安装成windows服务,该脚本可以多次运行,所安装服务的相关配置以最后一次运行为准。

4.3 配置因子计算服务

因子计算服务组件的配置基本上通过环境变量来设置,在使用nssm.bat脚本安装为windows服务时可以为每个服务单独指定环境变量,也可以直接设置修改系统的环境变量来进行统一的设置。
主要需要配置的环境变量和默认值如下:

  1. FACTOR_CONDA_ENV=base #表示运行因子计算服务的conda虚拟python环境名
  2. CELERY_BROKER=amqp://guest:guest@localhost:5672 #指向rabbitmq的服务端口
  3. CELERY_=

4.4 各组件对应的windows服务说明

4.3.1 安装fc-updater

  1. nssm install fc-updater

4.3.2 安装fc-flower

  1. nssm install fc-flower

4.3.3 安装fc-worker

  1. nssm install fc-worker

4.3.4 安装fc-manager

  1. nssm install fc-manager

4.3.5 安装fc-oracle

  1. nssm install fc-oracle

4.3.6 安装fc-stores

  1. nssm install fc-stores

5.安装配置因子更新调度服务dyupdater

5.1 下载dyupdater.exe

dyupdater服务每日检查因子值记录的完整性,并根据找到的缺失发布相关因子计算任务,得到结果后再进行入库。
下载地址: https://github.com/xingetouzi/dyupdater/releases/download/v1.0/dyupdater.exe

5.2 配置dyupdater

配置文件示例:(详细配置请查看使用手册生产模块部分)

  1. base:
  2. cal-start-date: 20140101
  3. celery:
  4. default:
  5. host: localhost:5555
  6. broker: amqp://guest:guest@localhost
  7. backend: redis://localhost
  8. queues:
  9. - factor
  10. - stores
  11. - oracle
  12. sources:
  13. uqer:
  14. type: filesystem
  15. path: ./factor-scripts/uqer复现合格
  16. # regex: (C010021A)
  17. guojin:
  18. type: filesystem
  19. path: ./factor-scripts/国金专用因子
  20. calculators:
  21. default:
  22. type: celery
  23. celery: default
  24. stores:
  25. # default:
  26. # type: mongo
  27. # url: mongodb://192.168.0.102,192.168.0.101
  28. # local:
  29. # type: csv
  30. # path: ./factors
  31. hdf5:
  32. type: hdf5
  33. celery: default
  34. oracle0:
  35. type: oracle
  36. celery: default
  37. url: FXDAYU/FXDAYU@localhost:1521/EE.oracle.docker
  38. indexer:
  39. type: wind
  40. server: XXX.XXX.XXX.XXX
  41. db: NWindDB
  42. uid: bigfish
  43. pwd: bigfish
  44. mapper:
  45. type: csv
  46. stores: oracle0
  47. file: ./mapping.csv
  48. cron:
  49. enabled: true
  50. tasks:
  51. # This cron means to check factor data in the last week every 120 minutes during 01:00 ~ 09:00 at every workday.
  52. # You can test a cron rule at https://crontab.guru
  53. everyday:
  54. # At every 120th minute past every hour from 1 through 9 on every day-of-week from Monday through Friday.
  55. rule: "0 */120 1-8 * * 1-6"
  56. # start time from now , in seconds, 604800 = 7*24*60*60 = 7days.
  57. start: 20140101
  58. # This cron means to check all factor data from 20100101 every 8 hour at every weekends.
  59. everyweekends:
  60. # past every 8th hour on Sunday.
  61. rule: "0 0 */8 * * 0"
  62. # start time in format "20060102"
  63. start: 20140101

其中与服务部署方式相关的配置选项主要是以下,根据实际部署情况填写,一般单机部署使用以下值即可:

  1. ...
  2. celery:
  3. default:
  4. host: localhost:5555 # 指向fc-flower服务端口
  5. broker: amqp://guest:guest@localhost # zhi'xian指向rabbitmq地址
  6. backend: redis://localhost # 指向redis地址
  7. queues:
  8. - factor
  9. - stores
  10. - oracle
  11. ...

5.3 将dyupdater安装为windows服务

  1. nssm install dyupdater
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注