仿真流程

API功能

  • 登陆: https://api.worldquantbrain.com/authentication
  • 获得数据字段: https://api.worldquantbrain.com/data-fields?
  • 发起仿真测试: https://api.worldquantbrain.com/simulations
  • 查询结果, 打标签: https://api.worldquantbrain.com/alphas/{alpha_id}

批量仿真流程

  1. 开启异步session
  2. 尝试登陆
  3. 生成仿真数据, 把仿真数据存入csv文件, 计算任务数量
  4. 批量开启仿真回测, 处理可能出现的任何异常(登陆超时,发送过快,回测被拒绝)
    1. 发起请求
    2. 发起回测成功(response中包含Location) -> 获得回测状态(得到simulation id)
    3. 🔄 不断请求回测状态
    4. 回测状态变为结束(response中Retry-After=0, status=[COMPLETE,WARNING]) -> 获得结果(得到alpha id)

几种网络问题处理

用工具函数统一的封装get, patch, post请求.

  1. time-out: cancel 任务
  2. 退出登陆(401): 重新登陆 + 重试
  3. 超出发送限制(429): sleep + 重试
  4. Gateway time-out(504): sleep + 重试
  5. 未知错误: 结束

问题

  • 理论上可以不去监测每个请求的发送情况. simulation id在回测结束后不会改变不会销毁. 所以, 批量发送请求拿到simulation id后, 可以后续再查看simulation的运行结果.
  • 本身sess.get 请求的过程等待只能由异步解决, 但是在这个项目里, 好像也没必要?
  • 平台限制了回测请求的并发数, 但是获取数据好像并没有限制.
  • 我经常对template.py元编程, python在用importlib 加载模块时, 会自动加载同名的缓存. 所以要记得手动reload. 否则会发现修改无效 😮‍💨

数据测试

利用平台的统计平均正结果(longCount) 和平均负结果(shortCount) 的功能

测试数据分布

  • 平台支持统计 {datafield} < {a} 的平均股票数(longCount)
  • Minifloat 的想法, 先选择 指数 的切分点, 然后把中间部分用 有效数 等分

Pasted image 20250210190821.png

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