选择在模拟盘中表现好的因子投资

仿真

仿真参数

分为数据库选择, 和后处理两部分

  • Delay: 当天(在当天closed前根据当天数据交易), 或+1天(早上交易, 根据昨天的数据)
  • Test Period: 把仿真的5年时间分出一部分作为test, PnL图上orange的部分
  • Universe(股票范围): Top3000指日平均 volume 最大的3000支

  • Decay: 自带的一个linear decay(前n天), 是在最后的normalized weight上进行decay
  • pasteurized: ? 只考虑universe以内的alpha?
  • Nan Handling: 操作不可控? OFF的话, 有Nan的值会被平仓(全部卖出)
  • Unit Handling: 单位不匹配时报warning
  • truncation: 设置maximum weight上限: 建议设置0.05~0.1 (entailing 5-10%)之间
  • neutralize(标准化): 让mean(alpha)=0,
    • 时间(ts_neutralize)上做neutralize避免长期趋势. (多空中性化).
    • 同期(group_neutralize)的做避免不同类型股票的不公平比较.

仿真交易流程

  • 输入为 Matrix, 按照时间顺序交易
  • 仿真交易规则:
    • 每天用恒定的账面规模(book size)交易,
      • book size 为$20 million. 有$10 million现金, 投资上限为$20million.
    • alpha apply到每只股票上得到alpha value
    • L1 归一化, 得到每只股票的weight
      • 不同neutralize组的booksize是分别计算的? 比如有两个sector, 每个sector scale到 0.5/abs(sector_sum)?
    • 每天在每只股票上投资 weight*booksize
    • 计算PnL

数据

Matrix, Vector, Group 三种

  • Matrix : 天数 x 股票的2d array. 普通的alpha可以用
  • Vector: 每天每只股票可能有0-n个数值, 比如新闻. 需要用vector_operator处理
  • Group: 每只股票一个group_id. 用于group_operator的group参数

测试结果

术语

  • PnL(profit and loss): daily_PnL = sum(size of position * daily_return)
    • 每个股票的 daily_return= (today’s close / yesterday’s close) – 1.0
  • Returns: Return = annualized PnL / Half of Book Size
  • Drowndown: PnL最大的一次下降, 用half of booksize归一化为百分比
  • Long/Short(做多, 做空): 在这里就指买入/卖出
    • Long/short Count: 做多/做空 股票的数量
  • Volume(成交量) : 一段时间的交易数量
  • Margin(边缘收益): Margin=PnL/TotalDollarsTraded
    • 一段时间内每个dollor的收益, 和可能会用到的手续费有关.
  • cap(市值)
  • Call/Put(看涨/看跌)

通过指标

指标 要求 公式 优化方向
Sharpe(夏普率, related metric, information ratio, IR) Delay-0: Sharpe > 2
Delay-1: Sharpe > 1.58
Sharpe=mean(PnL)/stdev(PnL)*sqrt(252)

*sqrt(252) 年化
 
Sub-universe Sharpe 建议 subuniverse_sharpe > 0.7*sharpe subuniverse_sharpe >= 0.75 * sqrt(subuniverse_size / alpha_universe_size) * alpha_sharpe

不在sub-universe 的股票赋NaN, 自动加上market neutralization, 并乘上scale?

让alpha少受公司规模, 流动性的影响
避免使用1-rank(cap), rank(-assets)
volume*close 不在一个水平的stock,
IS Ladder Sharpe(阶梯测试) FAIL_THRESHOLD=Sharpe
PASS_THRESHOLD
时间段越长越会降低
从近两年, 3年 -…-> 10年测试
如果通过FAIL_THRESHOLD只是进入下一阶段测试,
如果通过PASS_THRESHOLD则可以立即通过
控制drawback
Turnover(换手率) 1% < Turnover < 70%
建议 Turnover < 25%
avg(daily trading volume/Booksize) 减少turnover:
1. 增加滤波(decay, ts_mean)
2. 用trade_when设置交易条件
3. 用hump operator
Fitness(健康度)
评价alpha优劣的指标
Delay-0: fitness > 1.3
Delay-1: fitness > 1
Fitness = Sharpe*sqrt(abs(Returns)/Max(Turnover,0.125)) 降低turnover
Margin 建议 margin > 4bps
USA 5
EUR 10
ASI 15
avg(PnL/total traded dollars) 降低turnover
提高return
Weight test 1. 在长时间内, non-zero weight的股票数不能太少
2. 某一个股票的weight不能占比太大
max(weight) < 10%
随股票范围变动
  - truncation: 设置maximum weight上限: 建议设置0.05~0.1 (entailing 5-10%)之间
- 调整weight 分布: rank
- 解决coverage不够的问题:1. 用ts_backfill填补一些更新频率不够的 2. 用group_count检测当天的覆盖率
Self Correlation 和现有alpha不相关:
< 0.7 PnL correlation
, 或优化现有alpha:
Sharpe > 110% * correlated Sharpe
   
Out-of-sample(OS) 提交后在真实市场测试    

操作

  • 数据接口: https://platform.worldquantbrain.com/data
    • datafield是变量名
    • dataset是数据集
  • 支持运算: https://platform.worldquantbrain.com/learn/operators
  • 代码语法:
    • 只用给出的运算符
    • 每行用 ; 结尾 常用的operator
  • 填空(ts_backfill, group_backfill): 把数据里的nan用有效值补上
    • group_backfill 是在d天, group里取所有的有效值, 做winsorized mean
  • 统计
    • mean(group_mean,)
      • group_sum
      • group_count : 统计valid value. 和 group_sum(is_nan ) 一样吗?
    • std_dev(group_std_dev)
    • ir(ts_ir): 信噪比, mean/std
    • kurt(ts_kurtosis):
    • max (ts_max_diff)
  • 调整分布
    • neutralize(normalize, group_neutralize,ts_av_diff): 让数据 mean=0
    • zscore(zscore, group_zscore, ts_zsore): 让数据 mean=0, var=1. 假设数据是高斯分布的情况下标准化.
    • rank(rank, group_rank, ts_rank): 不改变单调性, 把数据调整成0-1之间的均匀分布
    • quantile(quantile, ts_quantile) 把数据调整成某个分布
      • 会先做一个rank把数据调整到0-1, 再做线性变换到 (1/n)-(1-1/n), 然后再用三种分布调整
      • 支持均匀分布, gaussian分布和Cauchy分布
        • 把输入调整成return, 可以用来做随机采样?
    • normalize(scale, group_normalize): 相当于L1 normalize
    • 缩尾: 中间部分数据不变, 用来处理长尾分布.
      • tail : 手动设置lower, upper bound
      • winsorize: 离群数据的截断的范围由std确定
    • scale(group_scale, ts_scale): 让数据在0-1之间. 线性scale
    • 线性分段函数改变数据分布: 比如a<0.1? (1.1-a):(a>0.8? 1.8-a:1) , 可以构造任何分布.
    • 非线性的改变数据分布(power, -inverse, log(x+1),arctan)
  • 计算相关关系
    • ts_regression(y,x): 用一个数据线性拟合另一个数据. 调节rettype 获得对应参数
      • error_term($\epsilon$ ,rettype=0): 相当于用x数据做y的baseline_wander (y信号是主信号)
        • $\epsilon = y-(\alpha + \beta x)=(y-\bar y)-\beta(x-\bar x)$
      • interception($\alpha$, rettype=1):
        • $\alpha=\bar y-\beta \bar x$
      • slope($\beta$ , rettype=2): 得到数据x关于数据y的系数
        • $\beta=\frac{\sum(x-\bar x)(y-\bar y)}{\sum(x-\bar x)^2}$ , 是$y=\beta \cdot x+ \epsilon$ 做最小二乘法的解, 也是 y 在x方向的投影系数. 这个所谓的斜率是y关于x的斜率, 不是拟合之后的结果的斜率, 体现的是相关性而不是信号本身 . 和ts_corr, ts_covariance某种程度上可以相互替换
          • ts_corr 是$\frac{\sum(x-\bar x)(y-\bar y)}{\sqrt(\sum(x-\bar x)^2\sum(y-\bar y)^2)}$
          • ts_covariance 相当于 $\sum xy - (\sum x)(\sum y)$ $\sum(x-\bar x)(y-\bar y)$
        • 可以用这个信号作为一个阈值
        • 得到的 slope * x 可以用做把y对多个x做分解, 得到的分解量. 和rettype=3 类似.
        • 让 x 是ts_step(1) , 得到y关于时间的斜率.
      • std(rettype=8): 和$\beta$ 相关的error term?
        • 和rettype2配合, 计算ir
      • y-estimate(rettype=3): 相当于用x数据线性构建信号, 调节出一个和y 距离最近的参数. (x信号是主信号)
        • ts_regression(y,x)*x
      • $R^2=1-\frac{SSE}{SST}$ (决定系数, rettype=6): 表示线性模型的有用程度.(比直接取均值好的程度.). (反应了x对y的预测能力.)
        • SSE是模型预测值与实际值 $y_i$ 的平方和. SST是均值与实际值 $y_i$ 的平方和. 这两个越接近, 即$R^2$ 越小, 说明模型和直接取均值效果差不多.
    • regression_proj 和 vector_proj 的关系: vector_proj是没有中心化的, $\frac{\sum xy}{\sum x^2}\cdot x$
    • regression/vector_proj 和 regression/vector_neut的关系: neut 是 y - proj(y)
  • 分组
    • floor: 用整数量化成n个区间.
    • bucket: 把0-1的值平均分为n个区间.
      • floor(rank(cap)*4.99)bucket(rank(cap),range="0.1,1,0.2") 是差不多的效果.
  • 控制
    • hump: 根据数据变动, 只有两种action(不动, 移动hump threshold)
      • 对周期比较长的数据(比如基本面数据)可以这样做

参考资料

[1] https://support.worldquantbrain.com/hc/en-us/community/posts/28643095649943–新人科普-一文助你成为BRAIN兼职研究顾问

[2] https://support.worldquantbrain.com/hc/en-us/community/posts/19273239621399–Alpha灵感启示录-合集-持续更新收录中

[3] https://support.worldquantbrain.com/hc/en-us/community/posts/22863075241623–学习资料-BRAIN平台自学路径图推荐