选择在模拟盘中表现好的因子投资
仿真
仿真参数
分为数据库选择, 和后处理两部分
- 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 > 2Delay-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.3Delay-1: fitness > 1 |
Fitness = Sharpe*sqrt(abs(Returns)/Max(Turnover,0.125)) |
降低turnover |
| Margin | 建议 margin > 4bpsUSA 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_sumgroup_count: 统计valid value. 和 group_sum(is_nan ) 一样吗?
- std_dev(
group_std_dev) - ir(
ts_ir): 信噪比, mean/std - kurt(
ts_kurtosis): - max (
ts_max_diff)
- mean(
- 调整分布
- 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 boundwinsorize: 离群数据的截断的范围由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)
- neutralize(
- 计算相关关系
- 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关于时间的斜率.
- $\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某种程度上可以相互替换
- 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$ 越小, 说明模型和直接取均值效果差不多.
- error_term($\epsilon$ ,rettype=0):
- regression_proj 和 vector_proj 的关系: vector_proj是没有中心化的, $\frac{\sum xy}{\sum x^2}\cdot x$
- regression/vector_proj 和 regression/vector_neut的关系: neut 是 y - proj(y)
- ts_regression(y,x): 用一个数据线性拟合另一个数据. 调节rettype 获得对应参数
- 分组
- floor: 用整数量化成n个区间.
- bucket: 把0-1的值平均分为n个区间.
floor(rank(cap)*4.99)和bucket(rank(cap),range="0.1,1,0.2")是差不多的效果.
- 控制
- hump: 根据数据变动, 只有两种action(不动, 移动hump threshold)
- 对周期比较长的数据(比如基本面数据)可以这样做
- 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平台自学路径图推荐