仿真流程
API功能
- 登陆:
https://api.worldquantbrain.com/authentication - 获得数据字段:
https://api.worldquantbrain.com/data-fields? - 发起仿真测试:
https://api.worldquantbrain.com/simulations - 查询结果, 打标签:
https://api.worldquantbrain.com/alphas/{alpha_id}
批量仿真流程
- 开启异步session
- 尝试登陆
- 生成仿真数据, 把仿真数据存入csv文件, 计算任务数量
- 批量开启仿真回测, 处理可能出现的任何异常(登陆超时,发送过快,回测被拒绝)
- 发起请求
- 发起回测成功(response中包含
Location) -> 获得回测状态(得到simulation id) - 🔄 不断请求回测状态
- 回测状态变为结束(response中
Retry-After=0, status=[COMPLETE,WARNING]) -> 获得结果(得到alpha id)
几种网络问题处理
用工具函数统一的封装get, patch, post请求.
- time-out: cancel 任务
- 退出登陆(401): 重新登陆 + 重试
- 超出发送限制(429): sleep + 重试
- Gateway time-out(504): sleep + 重试
- 未知错误: 结束
问题
- 理论上可以不去监测每个请求的发送情况. simulation id在回测结束后不会改变不会销毁. 所以, 批量发送请求拿到simulation id后, 可以后续再查看simulation的运行结果.
- 本身
sess.get请求的过程等待只能由异步解决, 但是在这个项目里, 好像也没必要? - 平台限制了回测请求的并发数, 但是获取数据好像并没有限制.
- 我经常对
template.py元编程, python在用importlib加载模块时, 会自动加载同名的缓存. 所以要记得手动reload. 否则会发现修改无效 😮💨
数据测试
利用平台的统计平均正结果(longCount) 和平均负结果(shortCount) 的功能
测试数据分布
- 平台支持统计
{datafield} < {a}的平均股票数(longCount) - 用Minifloat 的想法, 先选择 指数 的切分点, 然后把中间部分用 有效数 等分

| sign(符号位) | exponent(指数) | significand(有效数) | |||||
|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
- 拿BF8举例, 先选择 指数 的切分点, 然后把中间部分用 有效数 等分
- exponent部分(4位, 2^{-6}-2^7)为, $0110b=6$ -> $2^{6-7}=\frac{1}{2}$
- significand部分(3位, 0/8-7/8 )为, $110b=6$ -> $1+\frac{6}{8}$
- 最后事例的数字为 $(1+\frac{6}{8})*\frac{1}{2}$
- 第一轮选用base10的指数点做切分, 统计每个区间内的股票数
- 第二轮选 5%-95% 的分位点区间, 再进行等分.
测试数据覆盖率
- 用
({datafield} != {a})? 1: -1的正负统计平均 zeros(shortCount), non-zeros(longCount), nan(剩下的) 值
测试数据更新频率
- 用
ts_std_dev({data_fields},{d}) != 0 ? 1 : 0统计数据在周期d天内是否更新. - d 选择一些常用的更新频率: 天, 星期, 月, 季度, 年等
代码
参考资料
[1] https://support.worldquantbrain.com/hc/en-us/community/posts/11807866133911–BRAIN-TIPS-6-ways-to-quickly-evaluate-a-new-dataset