main
parent
6833059711
commit
771b35563e
@ -0,0 +1,30 @@ |
||||
group_neutralize(ts_rank(volume,20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(turnover,20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_delta(close,1),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_mean(volume,5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_std_dev(turnover,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_corr(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_sum(volume,5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_delay(volume,5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_zscore(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_av_diff(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(divide(volume,ts_mean(volume,20)),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(subtract(turnover,ts_mean(turnover,20)),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(multiply(volume,turnover),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_delta(turnover,5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_product(divide(volume,ts_delay(volume,1)),5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_scale(volume,20),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(sign(ts_delta(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(greater(volume,ts_delay(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_count_nans(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_covariance(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(if_else(volume>ts_mean(volume,20),1,-1),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_arg_max(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_arg_min(turnover,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_backfill(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(signed_power(volume,0.5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_decay_linear(volume,5),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_quantile(volume,10),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(add(volume,turnover),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(abs(ts_delta(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
group_neutralize(ts_rank(ts_regression(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
@ -0,0 +1,29 @@ |
||||
ts_zscore(add(ts_mean(volume, 20), ts_mean(turnover, 20)), 60) |
||||
ts_rank(divide(ts_delta(price, 5), price), 120) |
||||
group_zscore(ts_std_dev(volume, 30), sector) |
||||
ts_scale(ts_corr(volume, turnover, 60), 90) |
||||
ts_av_diff(ts_mean(price, 10), 20) |
||||
ts_quantile(ts_delta(volume, 10), 60) |
||||
ts_arg_max(ts_mean(turnover, 5), 30) |
||||
ts_arg_min(ts_std_dev(price, 10), 20) |
||||
ts_backfill(ts_delta(price, 1), 5, 1) |
||||
ts_count_nans(ts_mean(volume, 5), 10) |
||||
ts_covariance(volume, turnover, 30) |
||||
ts_decay_linear(ts_mean(price, 5), 10) |
||||
ts_delay(ts_zscore(volume, 20), 5) |
||||
ts_product(ts_mean(turnover, 5), 10) |
||||
ts_regression(price, volume, 30, 0, 0) |
||||
ts_std_dev(ts_delta(price, 5), 20) |
||||
ts_sum(ts_mean(volume, 5), 10) |
||||
ts_zscore(ts_mean(turnover, 10), 30) |
||||
group_neutralize(ts_rank(volume, 60), industry) |
||||
group_scale(ts_mean(price, 5), sector) |
||||
group_rank(ts_std_dev(turnover, 10), industry) |
||||
ts_rank(ts_delta(ts_mean(volume, 5), 5), 30) |
||||
ts_av_diff(ts_mean(price, 10), 20) |
||||
ts_quantile(ts_delta(turnover, 5), 60) |
||||
ts_arg_max(ts_mean(volume, 5), 20) |
||||
ts_arg_min(ts_std_dev(turnover, 5), 10) |
||||
ts_backfill(ts_delta(price, 1), 3, 1) |
||||
ts_count_nans(ts_mean(turnover, 5), 10) |
||||
ts_covariance(price, volume, 30) |
||||
@ -0,0 +1,36 @@ |
||||
group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector) |
||||
group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector) |
||||
group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector) |
||||
group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector) |
||||
|
||||
add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)) |
||||
add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)) |
||||
subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) |
||||
|
||||
ts_rank(ts_mean(market_breadth, 60), 60) |
||||
ts_rank(ts_mean(vix, 60), 60) |
||||
add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)) |
||||
ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) |
||||
|
||||
if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1) |
||||
if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1) |
||||
|
||||
multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)) |
||||
multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))) |
||||
|
||||
ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60) |
||||
ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60) |
||||
|
||||
multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)) |
||||
multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)) |
||||
|
||||
group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector) |
||||
group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector) |
||||
|
||||
subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)) |
||||
|
||||
ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20) |
||||
|
||||
winsorize(ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20), 4) |
||||
|
||||
scale(winsorize(ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20), 4)) |
||||
@ -0,0 +1,404 @@ |
||||
# -*- coding: utf-8 -*- |
||||
import os |
||||
import random |
||||
import sys |
||||
import openai |
||||
import httpx |
||||
import csv |
||||
from datetime import datetime |
||||
import jieba |
||||
import time |
||||
|
||||
sys.path.append(os.path.join(os.path.abspath(__file__).split('AlphaGenerator')[0] + 'AlphaGenerator')) |
||||
PROJECT_PATH = os.path.join(os.path.abspath(__file__).split('AlphaGenerator')[0] + 'AlphaGenerator') |
||||
|
||||
PREPARE_PROMPT = os.path.join(PROJECT_PATH, 'prepare_prompt') |
||||
KEYS_TEXT = os.path.join(PREPARE_PROMPT, 'keys_text.txt') |
||||
|
||||
USE_AI = 1 |
||||
|
||||
TEMPERATURE = 0.1 |
||||
|
||||
RANDOM_DATA_SETS_COUNT = 100 |
||||
|
||||
SILICONFLOW_API_KEY = "sk-pvdiisdowmuwkrpnxsrlhxaovicqibmlljwrwwvbbdjaitdl" |
||||
SILICONFLOW_BASE_URL = "https://api.siliconflow.cn/v1" |
||||
MODELS = [ |
||||
'Pro/deepseek-ai/DeepSeek-V3.1-Terminus', |
||||
'deepseek-ai/DeepSeek-V3.2-Exp', |
||||
'Qwen/Qwen3-VL-235B-A22B-Instruct', |
||||
# 'MiniMaxAI/MiniMax-M2', |
||||
# 'zai-org/GLM-4.6', |
||||
# 'inclusionAI/Ring-flash-2.0', |
||||
# 'zai-org/GLM-4.6', |
||||
# 'inclusionAI/Ling-flash-2.0', |
||||
# 'inclusionAI/Ring-flash-2.0', |
||||
] |
||||
|
||||
|
||||
def process_text(text): |
||||
filter_list = ['\n', '\t', '\r', '\b', '\f', '\v', ':', '的', '或', '10', '天', '了', '可', '是', '该', ',', ' ', '、', '让', '和', '集', |
||||
'/', '日', '在', '(', '_', '-', ')', '(', '上', '距', '与', '比', '下', '及', ')', '...', ';', '%', '&', '+', ',', '.', |
||||
':', ';', '<', '=', '>', '?', '[', ']', '|', '—', '。' |
||||
] |
||||
|
||||
text_list = jieba.lcut(text) |
||||
results = [] |
||||
for tl in text_list: |
||||
should_include = True |
||||
for fl in filter_list: |
||||
if fl == tl: |
||||
should_include = False |
||||
break |
||||
if should_include: |
||||
results.append(tl.lower()) |
||||
|
||||
results = [item for item in results if item != '"' and len(item) > 2] |
||||
|
||||
if results: |
||||
return list(set(results)) |
||||
else: |
||||
return None |
||||
|
||||
|
||||
def keysTextLoader(): |
||||
if not os.path.exists(KEYS_TEXT): |
||||
print(f"文件不存在: {KEYS_TEXT}") |
||||
exit(1) |
||||
with open(KEYS_TEXT, 'r', encoding='utf-8') as f: |
||||
text_list = [line.strip() for line in f if line.strip()] |
||||
if not text_list: |
||||
print('关键词文本无数据, 程序退出') |
||||
exit(1) |
||||
|
||||
result_str = process_text(';'.join(text_list)) |
||||
|
||||
print(f'\n关键词文本处理结果: {result_str}\n') |
||||
|
||||
return result_str |
||||
|
||||
|
||||
def txtFileLoader(file_path): |
||||
if not os.path.exists(file_path): |
||||
print(f"文件不存在: {file_path}") |
||||
exit(1) |
||||
with open(file_path, 'r', encoding='utf-8') as f: |
||||
return [line.strip() for line in f if line.strip()] |
||||
|
||||
|
||||
def csvFileLoader(file_path, keys_text): |
||||
if not os.path.exists(file_path): |
||||
print(f"文件不存在: {file_path}") |
||||
exit(1) |
||||
|
||||
data_dict = {} # 使用字典来存储,以id为键 |
||||
|
||||
with open(file_path, 'r', encoding='utf-8') as f: |
||||
reader = csv.reader(f) |
||||
for row in reader: |
||||
for key in keys_text: |
||||
if key in row[11] or key in row[12]: |
||||
item_id = row[0] |
||||
# 如果id不存在,或者想要保留第一个出现的记录 |
||||
if item_id not in data_dict: |
||||
data_dict[item_id] = { |
||||
'id': int(row[0]), |
||||
'data_set_name': f"可以使用:{row[1]}", |
||||
'description': f"不可使用,仅供参考:{row[2]}" |
||||
} |
||||
|
||||
# 将字典的值转换为列表 |
||||
return list(data_dict.values()) |
||||
|
||||
|
||||
def extend_data_sets(file_path, original_data_sets): |
||||
result = original_data_sets.copy() |
||||
|
||||
if not os.path.exists(file_path): |
||||
print(f"文件不存在: {file_path}") |
||||
return result |
||||
|
||||
all_data_sets = [] |
||||
with open(file_path, 'r', encoding='utf-8') as f: |
||||
reader = csv.reader(f) |
||||
for row in reader: |
||||
all_data_sets.append({ |
||||
'id': int(row[0]), |
||||
'data_set_name': f"可以使用:{row[1]}", |
||||
'description': f"不可使用,仅供参考:{row[2]}", |
||||
}) |
||||
|
||||
if RANDOM_DATA_SETS_COUNT and RANDOM_DATA_SETS_COUNT > 0: |
||||
total_count = len(original_data_sets) + RANDOM_DATA_SETS_COUNT |
||||
|
||||
# 找出所有可用的数据集(不在原始数据中的) |
||||
available_datasets = [] |
||||
|
||||
# 先获取原始数据集的所有ID |
||||
original_ids = [] |
||||
for item in original_data_sets: |
||||
original_ids.append(item['id']) |
||||
|
||||
# 找出不在原始数据中的数据集 |
||||
for dataset in all_data_sets: |
||||
exists = False |
||||
for oid in original_ids: |
||||
if dataset['id'] == oid: |
||||
exists = True |
||||
break |
||||
if not exists: |
||||
available_datasets.append(dataset) |
||||
|
||||
# 计算最多能添加多少个 |
||||
max_can_add = len(available_datasets) |
||||
need_to_add = RANDOM_DATA_SETS_COUNT |
||||
|
||||
if need_to_add > max_can_add: |
||||
print(f"警告:要求添加{need_to_add}个,但只有{max_can_add}个可用") |
||||
need_to_add = max_can_add |
||||
|
||||
# 随机选择需要数量的数据集 |
||||
random_selected = random.sample(available_datasets, need_to_add) |
||||
|
||||
# 添加到结果 |
||||
result.extend(random_selected) |
||||
|
||||
final_result = [] |
||||
for item in result: |
||||
final_result.append({ |
||||
'data_set_name': item['data_set_name'], |
||||
'description': item['description'] |
||||
}) |
||||
|
||||
return final_result |
||||
|
||||
|
||||
def promptLoader(alpha_prompt_path): |
||||
if not os.path.exists(alpha_prompt_path): |
||||
print("alpha_prompt.txt文件不存在") |
||||
exit(1) |
||||
with open(alpha_prompt_path, 'r', encoding='utf-8') as f: |
||||
prompt = f.read().strip() |
||||
if not prompt: |
||||
print("alpha_prompt.txt是空的") |
||||
exit(1) |
||||
return prompt.replace('\n\n', '\n') |
||||
|
||||
|
||||
def operatorLoader(operator_prompt_path): |
||||
if not os.path.exists(operator_prompt_path): |
||||
print("operator.txt文件不存在") |
||||
exit(1) |
||||
with open(operator_prompt_path, 'r', encoding='utf-8') as f: |
||||
operator_lines = [line.strip() for line in f.readlines() if line.strip()] |
||||
if not operator_lines: |
||||
print("operator.txt是空的") |
||||
exit(1) |
||||
return "\n".join(operator_lines) |
||||
|
||||
def mistakesNoteBookLoader(mistakes_notebook_path): |
||||
if not os.path.exists(mistakes_notebook_path): |
||||
print("mistakes_notebook.txt文件不存在") |
||||
return '' |
||||
with open(mistakes_notebook_path, 'r', encoding='utf-8') as f: |
||||
mistakes_notebook_lines = [line.strip() for line in f.readlines() if line.strip()] |
||||
if not mistakes_notebook_lines: |
||||
print("mistakes_notebook.txt是空的") |
||||
exit(1) |
||||
return "\n".join(mistakes_notebook_lines) |
||||
|
||||
def create_result_folder(): |
||||
folder_name = "generated_alpha" |
||||
if not os.path.exists(folder_name): |
||||
os.makedirs(folder_name) |
||||
|
||||
now = datetime.now() |
||||
year_folder = os.path.join(folder_name, str(now.year)) |
||||
month_folder = os.path.join(year_folder, f"{now.month:02d}") |
||||
day_folder = os.path.join(month_folder, f"{now.day:02d}") |
||||
|
||||
if not os.path.exists(year_folder): |
||||
os.makedirs(year_folder) |
||||
if not os.path.exists(month_folder): |
||||
os.makedirs(month_folder) |
||||
if not os.path.exists(day_folder): |
||||
os.makedirs(day_folder) |
||||
|
||||
return day_folder |
||||
|
||||
|
||||
def call_siliconflow(prompt, model): |
||||
try: |
||||
client = openai.OpenAI( |
||||
api_key=SILICONFLOW_API_KEY, |
||||
base_url=SILICONFLOW_BASE_URL |
||||
) |
||||
|
||||
response = client.chat.completions.create( |
||||
model=model, |
||||
messages=[ |
||||
{"role": "system", "content": "你是一个专业的量化投资专家,擅长编写Alpha因子。"}, |
||||
{"role": "user", "content": prompt} |
||||
], |
||||
temperature=TEMPERATURE |
||||
) |
||||
|
||||
return response.choices[0].message.content |
||||
|
||||
except openai.AuthenticationError: |
||||
print("API密钥错误") |
||||
except openai.RateLimitError: |
||||
print("调用频率限制") |
||||
except openai.APIError as e: |
||||
print(f"API错误: {e}") |
||||
except Exception as e: |
||||
print(f"其他错误: {e}") |
||||
exit(1) |
||||
|
||||
|
||||
def save_result(result, folder, model_name): |
||||
now = datetime.now() |
||||
time_filename = now.strftime("%H%M%S") |
||||
|
||||
filename = f"{model_name}_{time_filename}.txt" |
||||
filepath = os.path.join(folder, filename) |
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f: |
||||
f.write(result) |
||||
|
||||
print(f"结果保存到: {filepath}") |
||||
|
||||
|
||||
def get_user_info(): |
||||
headers = {"Authorization": f"Bearer {SILICONFLOW_API_KEY}"} |
||||
url = "https://api.siliconflow.cn/v1/user/info" |
||||
response = httpx.get(url, headers=headers) |
||||
data = response.json()['data'] |
||||
balance = data['totalBalance'] |
||||
print(f"余额: {balance}") |
||||
return float(balance) |
||||
|
||||
|
||||
def manual_prompt(prompt): |
||||
manual_prompt_path = os.path.join(PROJECT_PATH, "manual_prompt") |
||||
|
||||
if not os.path.exists(manual_prompt_path): |
||||
os.makedirs(manual_prompt_path) |
||||
|
||||
now = datetime.now() |
||||
year_folder = os.path.join(manual_prompt_path, str(now.year)) |
||||
month_folder = os.path.join(year_folder, f"{now.month:02d}") |
||||
day_folder = os.path.join(month_folder, f"{now.day:02d}") |
||||
|
||||
if not os.path.exists(year_folder): |
||||
os.makedirs(year_folder) |
||||
if not os.path.exists(month_folder): |
||||
os.makedirs(month_folder) |
||||
if not os.path.exists(day_folder): |
||||
os.makedirs(day_folder) |
||||
|
||||
# 文件名后添加保存时间 |
||||
filename = f"manual_prompt_{now.strftime('%Y%m%d%H%M%S')}.txt" |
||||
filepath = os.path.join(day_folder, filename) |
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f: |
||||
f.write(prompt) |
||||
|
||||
print(f"手动提示词保存到: {filepath}") |
||||
|
||||
|
||||
def call_ai(prompt, model): |
||||
balance = get_user_info() |
||||
|
||||
folder = create_result_folder() |
||||
|
||||
print(f"正在调用AI...{model}") |
||||
result = call_siliconflow(prompt, model) |
||||
|
||||
if result: |
||||
print(f"AI回复: {result[:200]}...") |
||||
model_name = model.replace("/", "_") |
||||
save_result(result, folder, model_name) |
||||
used_balance = balance - get_user_info() |
||||
print(f'本次调用 api 使用额度 {used_balance}') |
||||
else: |
||||
print("AI调用失败") |
||||
|
||||
|
||||
def prepare_prompt(data_sets): |
||||
prompt = '' |
||||
|
||||
# 读取基础提示词 |
||||
alpha_prompt_path = os.path.join(PREPARE_PROMPT, "alpha_prompt.txt") |
||||
prompt += promptLoader(alpha_prompt_path) |
||||
|
||||
# 读取操作符 |
||||
prompt += "\n\n以下是我的账号有权限使用的操作符, 请严格按照操作符, 进行生成,组合因子\n\n" |
||||
prompt += "========================= 操作符开始 =======================================\n" |
||||
prompt += "注意: Operator: 后面的是操作符(是可以使用的),\nDescription: 此字段后面的是操作符对应的描述或使用说明(禁止使用, 仅供参考), Description字段后面的内容是使用说明, 不是操作符\n" |
||||
prompt += "特别注意!!!! 必须按照操作符字段Operator的使用说明生成 alpha" |
||||
operator_prompt_path = os.path.join(PREPARE_PROMPT, "operator.txt") |
||||
operator = operatorLoader(operator_prompt_path) |
||||
prompt += operator |
||||
prompt += "\n========================= 操作符结束 =======================================\n\n" |
||||
|
||||
prompt += "========================= 数据字段开始 =======================================\n" |
||||
prompt += "注意: data_set_name: 后面的是数据字段(可以使用), description: 此字段后面的是数据字段对应的描述或使用说明(不能使用), description_cn字段后面的内容是中文使用说明(不能使用)\n\n" |
||||
for data_set in data_sets: |
||||
prompt += str(data_set) + '\n' |
||||
|
||||
prompt += "========================= 数据字段结束 =======================================\n\n" |
||||
|
||||
prompt += "以上数据字段和操作符, 按照Description说明组合, 但是每一个 alpha 组合的使用的数据字段和操作符不要过于集中, 在符合语法的情况下, 多尝试不同的组合\n\n" |
||||
|
||||
mistakes_note_book_path = os.path.join(PREPARE_PROMPT, "mistakes_notebook.txt") |
||||
mistakesNoteBook = mistakesNoteBookLoader(mistakes_note_book_path) |
||||
if mistakesNoteBook: |
||||
prompt += mistakesNoteBook |
||||
|
||||
return prompt |
||||
|
||||
|
||||
def main(): |
||||
# 将金融逻辑, 分割成标签 |
||||
keys_text = keysTextLoader() |
||||
|
||||
# 分割好的标签, 搜索对应的数据集, 返回匹配到的结果 |
||||
data_sets_path = os.path.join(PREPARE_PROMPT, "all_data_combined.csv") |
||||
result_data_sets = csvFileLoader(data_sets_path, keys_text) |
||||
|
||||
if not result_data_sets: |
||||
print(f'搜索数据集为空, 程序退出') |
||||
exit(1) |
||||
|
||||
# 扩展数据集 |
||||
mistakes_notebook_path = os.path.join(PREPARE_PROMPT, "all_data_combined.csv") |
||||
if RANDOM_DATA_SETS_COUNT: |
||||
print('=' * 100) |
||||
print(f'扩展前 {len(result_data_sets)} 条数据') |
||||
result_data_sets = extend_data_sets(mistakes_notebook_path, result_data_sets) |
||||
print(f'扩展后 {len(result_data_sets)} 条数据') |
||||
print('=' * 100) |
||||
|
||||
print(f'从数据集中提取了 {len(result_data_sets)} 条数据') |
||||
if len(result_data_sets) > 500: |
||||
data_sets = random.sample(result_data_sets, 10) |
||||
else: |
||||
data_sets = result_data_sets |
||||
|
||||
# 组合提示词 |
||||
prompt = prepare_prompt(data_sets) |
||||
|
||||
# # 如果需要手动在页面段模型, 使用提示词, 打开这个, 将生成的提示词存到本地 |
||||
manual_prompt(prompt) |
||||
|
||||
if USE_AI: |
||||
for model in MODELS: |
||||
# 如果需要使用模型, 打开这个 |
||||
call_ai(prompt, model) |
||||
|
||||
time.sleep(5) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
main() |
||||
@ -0,0 +1,350 @@ |
||||
Liquidity Stratification Pricing Factor |
||||
Hypothesis |
||||
During periods of liquidity tightening or market stress, investors' preference for asset liquidity increases sharply, leading to an intensified phenomenon of liquidity stratification. High-liquidity stocks experience relatively smaller declines due to a "liquidity premium," while low-liquidity stocks are sold off significantly due to a "liquidity discount." When market stress eases and the liquidity environment shifts towards easing, previously overly discounted low-liquidity stocks often exhibit stronger mean reversion and generate more substantial rebounds. Conversely, in the initial phase of a shift from loose to tight market liquidity, high-liquidity stocks may demonstrate stronger defensive characteristics. |
||||
Implementation Plan |
||||
Construct a comprehensive liquidity measurement indicator incorporating trading volume, turnover rate, bid-ask spread, and the Amihud illiquidity ratio. Use a time-series market regime identification operator (e.g., based on thresholds for market breadth, monetary conditions index, or volatility index VIX) to determine the prevailing "liquidity regime" of the market. During phases identified as a transition from "tight" to "easy," apply positive weights to the portfolio of stocks with the worst prior liquidity (bottom 20% based on the composite indicator). In the initial phase of liquidity "tightening," apply positive weights to the portfolio of stocks with the best liquidity (top 20%). Utilize cross-sectional ranking and group assignment to construct the investment portfolio. |
||||
Alpha Factor Optimization Suggestions |
||||
Pure liquidity metrics can be strongly influenced by firm market capitalization and industry attributes. A two-step neutralization process is recommended: First, perform liquidity ranking within industries to eliminate differences in industry trading characteristics. Second, after factor construction, control for exposure to the size factor. Furthermore, introducing the "duration of liquidity shock" as a weighting parameter could help refine the strategy. Stocks that have endured liquidity pressure for a longer period could be assigned higher weights during the reversal phase to more precisely capture the rebound momentum following suppression. |
||||
*=========================================================================================* |
||||
输出格式: |
||||
输出必须是且仅是纯文本。 |
||||
每一行是一个完整、独立、语法正确的WebSim表达式。 |
||||
严禁任何形式的解释、编号、标点包裹(如引号)、Markdown格式或额外文本。 |
||||
===================== !!! 重点(输出方式) !!! ===================== |
||||
现在,请严格遵守以上所有规则,开始生成可立即在WebSim中运行的复合因子表达式。 |
||||
不要自行假设, 你需要用到的操作符 和 数据集, 必须从我提供给你的里面查找, 并严格按照里面的使用方法进行组合 |
||||
**输出格式**(一行一个表达式, 每个表达式中间需要添加一个空行, 只要表达式本身, 不需要赋值, 不要解释, 不需要序号, 也不要输出多余的东西): |
||||
表达式 |
||||
表达式 |
||||
表达式 |
||||
... |
||||
表达式 |
||||
================================================================= |
||||
重申:请确保所有表达式都使用WorldQuant WebSim平台函数,不要使用pandas、numpy或其他Python库函数。输出必须是一行有效的WQ表达式。 |
||||
以下是我的账号有权限使用的操作符, 请严格按照操作符, 以及我提供的数据集, 进行生成,组合 30 个alpha: |
||||
不要自行假设, 你需要用到的操作符 和 数据集, 必须从我提供给你的里面查找, 并严格按照里面的使用方法进行组合 |
||||
================================================================= |
||||
ts_product ts_zscore ts_mean ts_scale add sign subtract ts_delta ts_rank greater ts_av_diff ts_quantile ts_count_nans ts_covariance |
||||
ts_arg_min divide ts_corr multiply if_else ts_sum ts_delay group_zscore ts_arg_max ts_std_de ts_backfill |
||||
以上这些操作符不能传入事件类型的数据集, 只能传入时间序列数据集, 不能传入事件数据,不能传入事件数据,不能传入事件数据 |
||||
|
||||
以下是我的账号有权限使用的操作符, 请严格按照操作符, 进行生成,组合因子 |
||||
|
||||
========================= 操作符开始 ======================================= |
||||
注意: Operator: 后面的是操作符(是可以使用的), |
||||
Description: 此字段后面的是操作符对应的描述或使用说明(禁止使用, 仅供参考), Description字段后面的内容是使用说明, 不是操作符 |
||||
特别注意!!!! 必须按照操作符字段Operator的使用说明生成 alphaOperator: abs(x) |
||||
Description: Absolute value of x |
||||
Operator: add(x, y, filter = false) |
||||
Description: Add all inputs (at least 2 inputs required). If filter = true, filter all input NaN to 0 before adding |
||||
Operator: densify(x) |
||||
Description: Converts a grouping field of many buckets into lesser number of only available buckets so as to make working with grouping fields computationally efficient |
||||
Operator: divide(x, y) |
||||
Description: x / y |
||||
Operator: inverse(x) |
||||
Description: 1 / x |
||||
Operator: log(x) |
||||
Description: Natural logarithm. For example: Log(high/low) uses natural logarithm of high/low ratio as stock weights. |
||||
Operator: max(x, y, ..) |
||||
Description: Maximum value of all inputs. At least 2 inputs are required |
||||
Operator: min(x, y ..) |
||||
Description: Minimum value of all inputs. At least 2 inputs are required |
||||
Operator: multiply(x ,y, ... , filter=false) |
||||
Description: Multiply all inputs. At least 2 inputs are required. Filter sets the NaN values to 1 |
||||
Operator: power(x, y) |
||||
Description: x ^ y |
||||
Operator: reverse(x) |
||||
Description: - x |
||||
Operator: sign(x) |
||||
Description: if input > 0, return 1; if input < 0, return -1; if input = 0, return 0; if input = NaN, return NaN; |
||||
Operator: signed_power(x, y) |
||||
Description: x raised to the power of y such that final result preserves sign of x |
||||
Operator: sqrt(x) |
||||
Description: Square root of x |
||||
Operator: subtract(x, y, filter=false) |
||||
Description: x-y. If filter = true, filter all input NaN to 0 before subtracting |
||||
Operator: and(input1, input2) |
||||
Description: Logical AND operator, returns true if both operands are true and returns false otherwise |
||||
Operator: if_else(input1, input2, input 3) |
||||
Description: If input1 is true then return input2 else return input3. |
||||
Operator: input1 < input2 |
||||
Description: If input1 < input2 return true, else return false |
||||
Operator: input1 <= input2 |
||||
Description: Returns true if input1 <= input2, return false otherwise |
||||
Operator: input1 == input2 |
||||
Description: Returns true if both inputs are same and returns false otherwise |
||||
Operator: input1 > input2 |
||||
Description: Logic comparison operators to compares two inputs |
||||
Operator: input1 >= input2 |
||||
Description: Returns true if input1 >= input2, return false otherwise |
||||
Operator: input1!= input2 |
||||
Description: Returns true if both inputs are NOT the same and returns false otherwise |
||||
Operator: is_nan(input) |
||||
Description: If (input == NaN) return 1 else return 0 |
||||
Operator: not(x) |
||||
Description: Returns the logical negation of x. If x is true (1), it returns false (0), and if input is false (0), it returns true (1). |
||||
Operator: or(input1, input2) |
||||
Description: Logical OR operator returns true if either or both inputs are true and returns false otherwise |
||||
Operator: days_from_last_change(x) |
||||
Description: Amount of days since last change of x |
||||
Operator: hump(x, hump = 0.01) |
||||
Description: Limits amount and magnitude of changes in input (thus reducing turnover) |
||||
Operator: kth_element(x, d, k) |
||||
Description: Returns K-th value of input by looking through lookback days. This operator can be used to backfill missing data if k=1 |
||||
Operator: last_diff_value(x, d) |
||||
Description: Returns last x value not equal to current x value from last d days |
||||
Operator: ts_arg_max(x, d) |
||||
Description: Returns the relative index of the max value in the time series for the past d days. If the current day has the max value for the past d days, it returns 0. If previous day has the max value for the past d days, it returns 1 |
||||
Operator: ts_arg_min(x, d) |
||||
Description: Returns the relative index of the min value in the time series for the past d days; If the current day has the min value for the past d days, it returns 0; If previous day has the min value for the past d days, it returns 1. |
||||
Operator: ts_av_diff(x, d) |
||||
Description: Returns x - tsmean(x, d), but deals with NaNs carefully. That is NaNs are ignored during mean computation |
||||
Operator: ts_backfill(x,lookback = d, k=1, ignore="NAN") |
||||
Description: Backfill is the process of replacing the NAN or 0 values by a meaningful value (i.e., a first non-NaN value) |
||||
Operator: ts_corr(x, y, d) |
||||
Description: Returns correlation of x and y for the past d days |
||||
Operator: ts_count_nans(x ,d) |
||||
Description: Returns the number of NaN values in x for the past d days |
||||
Operator: ts_covariance(y, x, d) |
||||
Description: Returns covariance of y and x for the past d days |
||||
Operator: ts_decay_linear(x, d, dense = false) |
||||
Description: Returns the linear decay on x for the past d days. Dense parameter=false means operator works in sparse mode and we treat NaN as 0. In dense mode we do not. |
||||
Operator: ts_delay(x, d) |
||||
Description: Returns x value d days ago |
||||
Operator: ts_delta(x, d) |
||||
Description: Returns x - ts_delay(x, d) |
||||
Operator: ts_mean(x, d) |
||||
Description: Returns average value of x for the past d days. |
||||
Operator: ts_product(x, d) |
||||
Description: Returns product of x for the past d days |
||||
Operator: ts_quantile(x,d, driver="gaussian" ) |
||||
Description: It calculates ts_rank and apply to its value an inverse cumulative density function from driver distribution. Possible values of driver (optional ) are "gaussian", "uniform", "cauchy" distribution where "gaussian" is the default. |
||||
Operator: ts_rank(x, d, constant = 0) |
||||
Description: Rank the values of x for each instrument over the past d days, then return the rank of the current value + constant. If not specified, by default, constant = 0. |
||||
Operator: ts_regression(y, x, d, lag = 0, rettype = 0) |
||||
Description: Returns various parameters related to regression function |
||||
Operator: ts_scale(x, d, constant = 0) |
||||
Description: Returns (x - ts_min(x, d)) / (ts_max(x, d) - ts_min(x, d)) + constant. This operator is similar to scale down operator but acts in time series space |
||||
Operator: ts_std_dev(x, d) |
||||
Description: Returns standard deviation of x for the past d days |
||||
Operator: ts_step(1) |
||||
Description: Returns days' counter |
||||
Operator: ts_sum(x, d) |
||||
Description: Sum values of x for the past d days. |
||||
Operator: ts_zscore(x, d) |
||||
Description: Z-score is a numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean: (x - tsmean(x,d)) / tsstddev(x,d). This operator may help reduce outliers and drawdown. |
||||
Operator: normalize(x, useStd = false, limit = 0.0) |
||||
Description: Calculates the mean value of all valid alpha values for a certain date, then subtracts that mean from each element |
||||
Operator: quantile(x, driver = gaussian, sigma = 1.0) |
||||
Description: Rank the raw vector, shift the ranked Alpha vector, apply distribution (gaussian, cauchy, uniform). If driver is uniform, it simply subtract each Alpha value with the mean of all Alpha values in the Alpha vector |
||||
Operator: rank(x, rate=2) |
||||
Description: Ranks the input among all the instruments and returns an equally distributed number between 0.0 and 1.0. For precise sort, use the rate as 0 |
||||
Operator: scale(x, scale=1, longscale=1, shortscale=1) |
||||
Description: Scales input to booksize. We can also scale the long positions and short positions to separate scales by mentioning additional parameters to the operator |
||||
Operator: winsorize(x, std=4) |
||||
Description: Winsorizes x to make sure that all values in x are between the lower and upper limits, which are specified as multiple of std. |
||||
Operator: zscore(x) |
||||
Description: Z-score is a numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean |
||||
Operator: vec_avg(x) |
||||
Description: Taking mean of the vector field x |
||||
Operator: vec_sum(x) |
||||
Description: Sum of vector field x |
||||
Operator: bucket(rank(x), range="0, 1, 0.1" or buckets = "2,5,6,7,10") |
||||
Description: Convert float values into indexes for user-specified buckets. Bucket is useful for creating group values, which can be passed to GROUP as input |
||||
Operator: trade_when(x, y, z) |
||||
Description: Used in order to change Alpha values only under a specified condition and to hold Alpha values in other cases. It also allows to close Alpha positions (assign NaN values) under a specified condition |
||||
Operator: group_backfill(x, group, d, std = 4.0) |
||||
Description: If a certain value for a certain date and instrument is NaN, from the set of same group instruments, calculate winsorized mean of all non-NaN values over last d days |
||||
Operator: group_mean(x, weight, group) |
||||
Description: All elements in group equals to the mean |
||||
Operator: group_neutralize(x, group) |
||||
Description: Neutralizes Alpha against groups. These groups can be subindustry, industry, sector, country or a constant |
||||
Operator: group_rank(x, group) |
||||
Description: Each elements in a group is assigned the corresponding rank in this group |
||||
Operator: group_scale(x, group) |
||||
Description: Normalizes the values in a group to be between 0 and 1. (x - groupmin) / (groupmax - groupmin) |
||||
Operator: group_zscore(x, group) |
||||
Description: Calculates group Z-score - numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean. zscore = (data - mean) / stddev of x for each instrument within its group. |
||||
========================= 操作符结束 ======================================= |
||||
|
||||
========================= 数据字段开始 ======================================= |
||||
注意: data_set_name: 后面的是数据字段(可以使用), description: 此字段后面的是数据字段对应的描述或使用说明(不能使用), description_cn字段后面的内容是中文使用说明(不能使用) |
||||
|
||||
{'data_set_name': '可以使用:call_breakeven_10', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 10 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_1080', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 1080 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_120', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 120 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_150', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 150 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_180', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 180 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_20', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 20 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_270', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 270 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_30', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 30 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:call_breakeven_60', 'description': "不可使用,仅供参考:Price at which a stock's call options with expiration 60 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:option_breakeven_30', 'description': "不可使用,仅供参考:Price at which a stock's options with expiration 30 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:option_breakeven_360', 'description': "不可使用,仅供参考:Price at which a stock's options with expiration 360 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:option_breakeven_720', 'description': "不可使用,仅供参考:Price at which a stock's options with expiration 720 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:put_breakeven_1080', 'description': "不可使用,仅供参考:Price at which a stock's put options with expiration 1080 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:put_breakeven_120', 'description': "不可使用,仅供参考:Price at which a stock's put options with expiration 120 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:put_breakeven_150', 'description': "不可使用,仅供参考:Price at which a stock's put options with expiration 150 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:put_breakeven_180', 'description': "不可使用,仅供参考:Price at which a stock's put options with expiration 180 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:put_breakeven_720', 'description': "不可使用,仅供参考:Price at which a stock's put options with expiration 720 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:fnd6_capxv', 'description': '不可使用,仅供参考:Capital Expend Property, Plant and Equipment Schd V'} |
||||
{'data_set_name': '可以使用:fnd6_ciother', 'description': '不可使用,仅供参考:Comp. Inc. - Other Adj.'} |
||||
{'data_set_name': '可以使用:fnd6_newa2v1300_oiadp', 'description': '不可使用,仅供参考:Operating Income After Depreciation'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_gdwliaq', 'description': '不可使用,仅供参考:Impairment of Goodwill After-tax'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_spcedq', 'description': '不可使用,仅供参考:S&P Core Earnings EPS Diluted'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_ciotherq', 'description': '不可使用,仅供参考:Comp Inc - Other Adj'} |
||||
{'data_set_name': '可以使用:fnd6_oiadps', 'description': '不可使用,仅供参考:Operating Income after Depreciation'} |
||||
{'data_set_name': '可以使用:fnd6_txtubpospinc', 'description': '不可使用,仅供参考:Increase - Prior Tax Positions'} |
||||
{'data_set_name': '可以使用:sales_ps', 'description': '不可使用,仅供参考:Sales per Share (Quarterly)'} |
||||
{'data_set_name': '可以使用:multi_factor_acceleration_score_derivative', 'description': '不可使用,仅供参考:Change in the acceleration of multi-factor score compared to previous period.'} |
||||
{'data_set_name': '可以使用:anl4_netdebt_flag', 'description': '不可使用,仅供参考:Net debt - forecast type (revision/new/...)'} |
||||
{'data_set_name': '可以使用:min_reported_eps_guidance', 'description': '不可使用,仅供参考:Reported Earnings Per Share - Minimum guidance value for the annual period'} |
||||
{'data_set_name': '可以使用:pv13_h2_min2_1k_sector', 'description': '不可使用,仅供参考:Grouping fields for top 1000'} |
||||
{'data_set_name': '可以使用:pv13_h_min22_1000_sector', 'description': '不可使用,仅供参考:Grouping fields for top 1000'} |
||||
{'data_set_name': '可以使用:pv13_h_min24_500_sector', 'description': '不可使用,仅供参考:Grouping fields for top 500'} |
||||
{'data_set_name': '可以使用:pv13_h_min2_focused_sector', 'description': '不可使用,仅供参考:Grouping fields for top 200'} |
||||
{'data_set_name': '可以使用:pv13_h_min52_1k_sector', 'description': '不可使用,仅供参考:Grouping fields for top 1000'} |
||||
{'data_set_name': '可以使用:news_max_up_amt', 'description': '不可使用,仅供参考:The after the news high minus the price at the time of the news'} |
||||
{'data_set_name': '可以使用:nws18_sse', 'description': '不可使用,仅供参考:Sentiment of phrases impacting the company'} |
||||
{'data_set_name': '可以使用:fn_def_tax_assets_liab_net_q', 'description': '不可使用,仅供参考:Amount, after allocation of valuation allowances and deferred tax liability, of deferred tax asset attributable to deductible differences and carryforwards, without jurisdictional netting.'} |
||||
{'data_set_name': '可以使用:fn_def_tax_liab_a', 'description': '不可使用,仅供参考:Amount, after deferred tax asset, of deferred tax liability attributable to taxable differences without jurisdictional netting.'} |
||||
{'data_set_name': '可以使用:fn_op_lease_min_pay_due_in_2y_a', 'description': '不可使用,仅供参考:Amount of required minimum rental payments for operating leases having an initial or remaining non-cancelable lease term in excess of 1 year due in the 2nd fiscal year following the latest fiscal year. Excludes interim and annual periods when interim periods are reported on a rolling approach, from latest balance sheet date.'} |
||||
{'data_set_name': '可以使用:fn_treasury_stock_shares_a', 'description': '不可使用,仅供参考:Number of common and preferred shares that were previously issued and that were repurchased by the issuing entity and held in treasury on the financial statement date. This stock has no voting rights and receives no dividends.'} |
||||
{'data_set_name': '可以使用:fnd6_newa1v1300_capx', 'description': '不可使用,仅供参考:Capital Expenditures'} |
||||
{'data_set_name': '可以使用:anl4_ptp_median', 'description': '不可使用,仅供参考:Pretax income - median of estimations'} |
||||
{'data_set_name': '可以使用:fn_business_acq_ppne_a', 'description': '不可使用,仅供参考:Business Combination, Assumed Property, Plant and Equipment'} |
||||
{'data_set_name': '可以使用:fnd6_txdfo', 'description': '不可使用,仅供参考:Deferred Taxes - Foreign'} |
||||
{'data_set_name': '可以使用:fnd6_lul3', 'description': '不可使用,仅供参考:Liabilities Level 3 (Unobservable)'} |
||||
{'data_set_name': '可以使用:fn_def_tax_assets_net_a', 'description': '不可使用,仅供参考:Deferred Tax Assets Net Of Valuation Allowance'} |
||||
{'data_set_name': '可以使用:fn_prepaid_expense_q', 'description': '不可使用,仅供参考:Carrying amount for an unclassified balance sheet date of expenditures made in advance of when the economic benefit of the cost will be realized, and which will be expensed in future periods with the passage of time or when a triggering event occurs. For a classified balance sheet, represents the noncurrent portion of prepaid expenses (the current portion has a separate concept).'} |
||||
{'data_set_name': '可以使用:nws12_afterhsz_maxdnamt', 'description': '不可使用,仅供参考:The price at the time of the news minus the after the news low'} |
||||
{'data_set_name': '可以使用:nws12_prez_maxup', 'description': '不可使用,仅供参考:Percent change from the price at the time of the news to the after the news high'} |
||||
{'data_set_name': '可以使用:goodwill_min_guidance_qtr', 'description': '不可使用,仅供参考:Minimum guidance value for Total Goodwill'} |
||||
{'data_set_name': '可以使用:anl4_fsdtlestmtbscv104_item', 'description': '不可使用,仅供参考:Financial item'} |
||||
{'data_set_name': '可以使用:fn_comp_fair_value_assumptions_weighted_avg_vol_rate_q', 'description': '不可使用,仅供参考:Weighted average expected volatility rate of share-based compensation awards.'} |
||||
{'data_set_name': '可以使用:option_breakeven_20', 'description': "不可使用,仅供参考:Price at which a stock's options with expiration 20 days in the future break even based on its recent bid/ask mean."} |
||||
{'data_set_name': '可以使用:news_mins_1_pct_dn', 'description': '不可使用,仅供参考:Number of minutes that elapsed before price went down 1 percentage point'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_lnoq', 'description': '不可使用,仅供参考:Liabilities Netting & Other Adjustments'} |
||||
{'data_set_name': '可以使用:cashflow_per_share_estimate_count', 'description': '不可使用,仅供参考:Cash Flow Per Share - number of estimations - delay1'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_ancq', 'description': '不可使用,仅供参考:Non-Current Assets - Total'} |
||||
{'data_set_name': '可以使用:fnd6_cptnewqv1300_nopiq', 'description': '不可使用,仅供参考:Non-Operating Income (Expense) - Total'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_dpactq', 'description': '不可使用,仅供参考:Depreciation, Depletion and Amortization (Accumulated)'} |
||||
{'data_set_name': '可以使用:anl4_dez1safv4_est', 'description': '不可使用,仅供参考:Estimation value'} |
||||
{'data_set_name': '可以使用:fnd6_fiao', 'description': '不可使用,仅供参考:Financing Activities - Other'} |
||||
{'data_set_name': '可以使用:anl4_dei3lqfv110_item', 'description': '不可使用,仅供参考:Financial item'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_cogsq', 'description': '不可使用,仅供参考:Cost of Goods Sold'} |
||||
{'data_set_name': '可以使用:fnd6_lifr', 'description': '不可使用,仅供参考:LIFO Reserve'} |
||||
{'data_set_name': '可以使用:fnd6_cptmfmq_dlttq', 'description': '不可使用,仅供参考:Long-Term Debt - Total'} |
||||
{'data_set_name': '可以使用:dividend_estimate_maximum', 'description': '不可使用,仅供参考:Dividend per share - The highest value among forecasts with a delay of 1 quarter'} |
||||
{'data_set_name': '可以使用:earnings_per_share_standard_deviation', 'description': '不可使用,仅供参考:Earnings per share - standard deviation of estimations'} |
||||
{'data_set_name': '可以使用:anl4_ads1detailafv110_estvalue', 'description': '不可使用,仅供参考:Estimation value'} |
||||
{'data_set_name': '可以使用:est_cashflow_fin', 'description': '不可使用,仅供参考:Cash Flow From Financing - mean of estimations'} |
||||
{'data_set_name': '可以使用:fn_repurchased_shares_value_q', 'description': '不可使用,仅供参考:Shares repurchased and either retired or put into treasury stock, likely as part of a share buyback plan.'} |
||||
{'data_set_name': '可以使用:implied_volatility_mean_30', 'description': '不可使用,仅供参考:At-the-money option-implied volatility mean for 30 days'} |
||||
{'data_set_name': '可以使用:pretax_income_standalone_value', 'description': '不可使用,仅供参考:Pretax Profit - actual value for the quarter'} |
||||
{'data_set_name': '可以使用:rp_css_price', 'description': '不可使用,仅供参考:Composite sentiment score of stock price news'} |
||||
{'data_set_name': '可以使用:earnings_per_share_nongaap_value', 'description': '不可使用,仅供参考:Non-GAAP Earnings Per Share - Actual Value'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_txdiq', 'description': '不可使用,仅供参考:Income Taxes - Deferred'} |
||||
{'data_set_name': '可以使用:max_free_cash_flow_guidance', 'description': '不可使用,仅供参考:The maximum guidance value for Free Cash Flow on an annual basis.'} |
||||
{'data_set_name': '可以使用:fscore_bfl_profitability', 'description': '不可使用,仅供参考:The purpose of this metric is to rank stock based on their ability to generate cash flows.'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_glcedq', 'description': '不可使用,仅供参考:Gain/Loss on Sale (Core Earnings Adjusted) Diluted EPS'} |
||||
{'data_set_name': '可以使用:historical_volatility_10', 'description': '不可使用,仅供参考:Close-to-close Historical volatility over 10 days'} |
||||
{'data_set_name': '可以使用:anl4_epsr_flag', 'description': '不可使用,仅供参考:GAAP Earnings - estimation type (revision/new/...), per share'} |
||||
{'data_set_name': '可以使用:nws12_prez_eodlow', 'description': '不可使用,仅供参考:Lowest price reached between the time of news and the end of the session.'} |
||||
{'data_set_name': '可以使用:anl4_basicdetailrec_bk', 'description': '不可使用,仅供参考:Broker name (int)'} |
||||
{'data_set_name': '可以使用:fnd6_newqv1300_aol2q', 'description': '不可使用,仅供参考:Assets Level 2 (Observable)'} |
||||
{'data_set_name': '可以使用:anl4_fsactualqfv4_actual', 'description': '不可使用,仅供参考:Announced financial data'} |
||||
{'data_set_name': '可以使用:nws18_qcm', 'description': '不可使用,仅供参考:News sentiment of relevant news with high confidence'} |
||||
{'data_set_name': '可以使用:pv13_new_1l_scibr', 'description': '不可使用,仅供参考:grouping fields'} |
||||
{'data_set_name': '可以使用:anl4_fsactualafv4_actual', 'description': '不可使用,仅供参考:Announced financial data'} |
||||
{'data_set_name': '可以使用:nws12_mainz_prevwap', 'description': '不可使用,仅供参考:Pre session volume weighted average price'} |
||||
{'data_set_name': '可以使用:fnd6_recd', 'description': '不可使用,仅供参考:Receivables - Estimated Doubtful'} |
||||
{'data_set_name': '可以使用:anl4_ads1detailqfv110_bk', 'description': '不可使用,仅供参考:Broker name (int)'} |
||||
{'data_set_name': '可以使用:fnd6_newa1v1300_aociother', 'description': '不可使用,仅供参考:Accum Other Comp Inc - Other Adjustments'} |
||||
{'data_set_name': '可以使用:est_rd_expense', 'description': '不可使用,仅供参考:Research and Development Expense - mean of estimations'} |
||||
{'data_set_name': '可以使用:fscore_bfl_quality', 'description': '不可使用,仅供参考:The purpose of this metric is to measure both the sustainability and certainty of earnings.'} |
||||
{'data_set_name': '可以使用:pv13_revere_level', 'description': '不可使用,仅供参考:Level of the sector within the hierarchy'} |
||||
{'data_set_name': '可以使用:anl4_netprofit_median', 'description': '不可使用,仅供参考:Net profit - Median of estimations'} |
||||
{'data_set_name': '可以使用:fnd6_newa1v1300_ano', 'description': '不可使用,仅供参考:Assets Netting & Other Adjustments'} |
||||
{'data_set_name': '可以使用:dividend_estimate_average', 'description': '不可使用,仅供参考:Dividend per share - average of estimations - delay 1'} |
||||
{'data_set_name': '可以使用:relative_valuation_rank_derivative', 'description': '不可使用,仅供参考:Change in ranking for valuation metrics compared to previous period.'} |
||||
{'data_set_name': '可以使用:forward_price_270', 'description': '不可使用,仅供参考:Forward price at 270 days derived from a synthetic long option with payoff similar to long stock + option dynamics. Combination of long ATM call and short ATM put.'} |
||||
{'data_set_name': '可以使用:pv13_h_min20_top3000_sector', 'description': '不可使用,仅供参考:grouping fields'} |
||||
{'data_set_name': '可以使用:nws12_afterhsz_3s', 'description': '不可使用,仅供参考:Number of minutes that elapsed before price went down 3 percentage points'} |
||||
{'data_set_name': '可以使用:research_development_expense', 'description': '不可使用,仅供参考:Research & Development Expense - Actual Value (Annual)'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_invfgq', 'description': '不可使用,仅供参考:Inventory - Finished Goods'} |
||||
{'data_set_name': '可以使用:news_ls', 'description': '不可使用,仅供参考:Whether a long or short position would have been more advantageous: If (EODHigh - Last) > (Last - EODLow) Then LS = 1; If (EODHigh - Last) = (Last - EODLow) Then LS= 0; If (EODHigh - Last) < (Last - EODLow) Then LS = -1.'} |
||||
{'data_set_name': '可以使用:fn_comp_options_out_number_a', 'description': '不可使用,仅供参考:Number of options outstanding, including both vested and non-vested options.'} |
||||
{'data_set_name': '可以使用:fnd6_newa1v1300_ibadj', 'description': '不可使用,仅供参考:Income Before Extraordinary Items - Adjusted for Common Stock Equivalents'} |
||||
{'data_set_name': '可以使用:anl4_cfi_median', 'description': '不可使用,仅供参考:Cash Flow From Investing - median of estimations'} |
||||
{'data_set_name': '可以使用:fn_accum_depr_depletion_and_amortization_ppne_q', 'description': '不可使用,仅供参考:Amount of accumulated depreciation, depletion and amortization for physical assets used in the normal conduct of business to produce goods and services.'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_cimiiq', 'description': '不可使用,仅供参考:Comprehensive Income - Noncontrolling Interest'} |
||||
{'data_set_name': '可以使用:news_open_gap', 'description': '不可使用,仅供参考:(DayOpen - PrevClose) / PrevClose'} |
||||
{'data_set_name': '可以使用:fnd6_eventv110_setepsq', 'description': '不可使用,仅供参考:Settlement (Litigation/Insurance) Basic EPS Effect'} |
||||
{'data_set_name': '可以使用:fnd2_a_ltrmdmrepoplinnext12m', 'description': '不可使用,仅供参考:Amount of long-term debt payable, sinking fund requirements, and other securities issued that are redeemable by holder at fixed or determinable prices and dates maturing in the next fiscal year following the latest fiscal year. Excludes interim and annual periods when interim periods are reported on a rolling approach, from latest balance sheet date.'} |
||||
{'data_set_name': '可以使用:nws12_afterhsz_2s', 'description': '不可使用,仅供参考:Number of minutes that elapsed before price went down 2 percentage points'} |
||||
{'data_set_name': '可以使用:anl4_norec', 'description': '不可使用,仅供参考:The number of brokers with no recommendation'} |
||||
{'data_set_name': '可以使用:implied_volatility_put_1080', 'description': '不可使用,仅供参考:At-the-money option-implied volatility for Put Option for 3 years'} |
||||
{'data_set_name': '可以使用:cash', 'description': '不可使用,仅供参考:Cash'} |
||||
{'data_set_name': '可以使用:earnings_per_share_minimum', 'description': '不可使用,仅供参考:Earnings per share - The lowest estimation'} |
||||
{'data_set_name': '可以使用:fnd6_niadj', 'description': '不可使用,仅供参考:Net Income Adjusted for Common/Ordinary Stock (Capital) Equivalents'} |
||||
{'data_set_name': '可以使用:fnd6_newa2v1300_ppent', 'description': '不可使用,仅供参考:Property, Plant and Equipment - Total (Net)'} |
||||
{'data_set_name': '可以使用:rp_css_revenue', 'description': '不可使用,仅供参考:Composite sentiment score of revenue news'} |
||||
{'data_set_name': '可以使用:fnd6_eventv110_optlifeq', 'description': '不可使用,仅供参考:Life of Options - Assumption (# yrs)'} |
||||
{'data_set_name': '可以使用:anl4_cff_flag', 'description': '不可使用,仅供参考:Cash Flow From Financing Activities - forecast type (revision/new/...)'} |
||||
{'data_set_name': '可以使用:pv13_hierarchy_min51_f4_sector', 'description': '不可使用,仅供参考:grouping fields'} |
||||
{'data_set_name': '可以使用:fnd6_snms', 'description': '不可使用,仅供参考:Segment Name'} |
||||
{'data_set_name': '可以使用:pcr_vol_all', 'description': "不可使用,仅供参考:Ratio of put volume to call volume for all maturities on stock's options."} |
||||
{'data_set_name': '可以使用:anl4_netdebt_high', 'description': '不可使用,仅供参考:Net debt - the highest estimation'} |
||||
{'data_set_name': '可以使用:fn_assets_fair_val_l1_a', 'description': '不可使用,仅供参考:Asset Fair Value, Recurring, Level 1'} |
||||
{'data_set_name': '可以使用:max_book_value_per_share_guidance', 'description': '不可使用,仅供参考:Book value per share - Maximum value among forecasts'} |
||||
{'data_set_name': '可以使用:anl4_cuo1guidaf_minguidance', 'description': '不可使用,仅供参考:Minimum guidance value'} |
||||
{'data_set_name': '可以使用:anl4_qfd1_az_div_median', 'description': '不可使用,仅供参考:Dividend per share - median of estimations'} |
||||
{'data_set_name': '可以使用:fn_oth_comp_grants_weighted_avg_grant_date_fair_value_q', 'description': '不可使用,仅供参考:Quarterly Share-Based Compensation Equity Instruments Other Than Options Nonvested Weighted Average Grant Date Fair Value'} |
||||
{'data_set_name': '可以使用:eps_guidance_value_quarterly', 'description': '不可使用,仅供参考:Earnings Per Share - Basic value'} |
||||
{'data_set_name': '可以使用:min_net_debt_guidance', 'description': '不可使用,仅供参考:The minimum guidance value for Net Debt on an annual basis.'} |
||||
{'data_set_name': '可以使用:nws12_prez_41rta', 'description': '不可使用,仅供参考:Fourteen-day Average True Range'} |
||||
{'data_set_name': '可以使用:fnd6_mrc3', 'description': '不可使用,仅供参考:Rental Commitments - Minimum - 3rd Year'} |
||||
{'data_set_name': '可以使用:fnd6_newqeventv110_pncpd12', 'description': '不可使用,仅供参考:Core Pension Adjustment 12MM Diluted EPS Effect Preliminary'} |
||||
{'data_set_name': '可以使用:anl4_tbve_ft', 'description': '不可使用,仅供参考:Tangible Book Value per Share - forecast type (revision/new/...)'} |
||||
{'data_set_name': '可以使用:fnd6_cibegni', 'description': '不可使用,仅供参考:Comp Inc - Beginning Net Income'} |
||||
{'data_set_name': '可以使用:fnd6_optvolq', 'description': '不可使用,仅供参考:Volatility - Assumption (%)'} |
||||
{'data_set_name': '可以使用:anl4_qfd1_az_div_number', 'description': '不可使用,仅供参考:Dividend per share - number of estimations'} |
||||
========================= 数据字段结束 ======================================= |
||||
|
||||
以上数据字段和操作符, 按照Description说明组合, 但是每一个 alpha 组合的使用的数据字段和操作符不要过于集中, 在符合语法的情况下, 多尝试不同的组合 |
||||
|
||||
你再检查一下, 如果你使用了 |
||||
Operator abs does not support event inputs |
||||
Operator ts_mean does not support event inputs |
||||
Operator ts_scale does not support event inputs |
||||
Operator add does not support event inputs |
||||
Operator sign does not support event inputs |
||||
Operator greater does not support event inputs |
||||
Operator ts_av_diff does not support event inputs |
||||
Operator ts_quantile does not support event inputs |
||||
Operator ts_arg_min does not support event inputs |
||||
Operator divide does not support event inputs |
||||
Operator ts_corr does not support event inputs |
||||
Operator ts_decay_linear does not support event inputs |
||||
Operator ts_sum does not support event inputs |
||||
Operator ts_delay does not support event inputs |
||||
Operator ts_arg_max does not support event inputs |
||||
Operator ts_std_dev does not support event inputs |
||||
Operator ts_regression does not support event inputs |
||||
Operator ts_backfill does not support event inputs |
||||
Operator signed_power does not support event inputs |
||||
Operator ts_product does not support event inputs |
||||
Operator ts_zscore does not support event inputs |
||||
Operator group_rank does not support event inputs |
||||
Operator subtract does not support event inputs |
||||
Operator ts_delta does not support event inputs |
||||
Operator ts_rank does not support event inputs |
||||
Operator ts_count_nans does not support event inputs |
||||
Operator ts_covariance does not support event inputs |
||||
Operator multiply does not support event inputs |
||||
Operator if_else does not support event inputs |
||||
Operator group_neutralize does not support event inputs |
||||
Operator group_zscore does not support event inputs |
||||
Operator winsorize does not support event inputs |
||||
注意, 以上操作符不能使用事件类型的数据集, 以上操作符禁止使用事件类型的数据集!! |
||||
@ -0,0 +1,166 @@ |
||||
ts_rank(divide(ts_delta(price, 5), price), 120) |
||||
|
||||
group_neutralize(ts_rank(multiply(volume,turnover),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_covariance(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(greater(volume,ts_delay(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(divide(volume,ts_mean(volume,20)),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_backfill(ts_delta(price, 1), 5, 1) |
||||
|
||||
ts_std_dev(ts_delta(price, 5), 20) |
||||
|
||||
ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20) |
||||
|
||||
group_neutralize(ts_rank(ts_delay(volume,5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60) |
||||
|
||||
winsorize(ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20), 4) |
||||
|
||||
ts_backfill(ts_delta(price, 1), 3, 1) |
||||
|
||||
ts_arg_min(ts_std_dev(turnover, 5), 10) |
||||
|
||||
multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)) |
||||
|
||||
ts_rank(ts_delta(ts_mean(volume, 5), 5), 30) |
||||
|
||||
group_neutralize(ts_rank(ts_decay_linear(volume,5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_sum(ts_mean(volume, 5), 10) |
||||
|
||||
group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector) |
||||
|
||||
ts_count_nans(ts_mean(volume, 5), 10) |
||||
|
||||
ts_quantile(ts_delta(turnover, 5), 60) |
||||
|
||||
group_neutralize(ts_rank(ts_delta(close,1),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_delay(ts_zscore(volume, 20), 5) |
||||
|
||||
group_neutralize(ts_rank(subtract(turnover,ts_mean(turnover,20)),20),pv13_h_min20_top3000_sector) |
||||
|
||||
if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1) |
||||
|
||||
ts_arg_min(ts_std_dev(price, 10), 20) |
||||
|
||||
group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector) |
||||
|
||||
ts_covariance(price, volume, 30) |
||||
|
||||
group_neutralize(ts_rank(ts_arg_min(turnover,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_product(divide(volume,ts_delay(volume,1)),5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)) |
||||
|
||||
add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)) |
||||
|
||||
group_neutralize(ts_rank(add(volume,turnover),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60) |
||||
|
||||
group_neutralize(ts_rank(ts_zscore(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_sum(volume,5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_rank(ts_std_dev(turnover, 10), industry) |
||||
|
||||
group_neutralize(ts_rank(signed_power(volume,0.5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_rank(ts_mean(market_breadth, 60), 60) |
||||
|
||||
group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector) |
||||
|
||||
add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)) |
||||
|
||||
group_zscore(ts_std_dev(volume, 30), sector) |
||||
|
||||
ts_zscore(ts_mean(turnover, 10), 30) |
||||
|
||||
group_neutralize(ts_rank(volume,20),pv13_h_min20_top3000_sector) |
||||
|
||||
subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)) |
||||
|
||||
group_neutralize(ts_rank(ts_av_diff(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_delta(turnover,5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) |
||||
|
||||
group_neutralize(ts_rank(abs(ts_delta(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector) |
||||
|
||||
ts_av_diff(ts_mean(price, 10), 20) |
||||
|
||||
multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))) |
||||
|
||||
group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector) |
||||
|
||||
group_scale(ts_mean(price, 5), sector) |
||||
|
||||
group_neutralize(ts_rank(ts_backfill(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(if_else(volume>ts_mean(volume,20),1,-1),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_quantile(ts_delta(volume, 10), 60) |
||||
|
||||
add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)) |
||||
|
||||
ts_zscore(add(ts_mean(volume, 20), ts_mean(turnover, 20)), 60) |
||||
|
||||
ts_arg_max(ts_mean(volume, 5), 20) |
||||
|
||||
scale(winsorize(ts_zscore(subtract(group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) < ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.2), 1, 0), 60)), pv13_h_min20_top3000_sector), group_neutralize(multiply(multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1), reverse(ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250))), ts_sum(if_else(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) > ts_quantile(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector)), 250, "gaussian"), 0.8), 1, 0), 60)), pv13_h_min20_top3000_sector)), 20), 4)) |
||||
|
||||
ts_rank(ts_mean(vix, 60), 60) |
||||
|
||||
group_neutralize(ts_rank(volume, 60), industry) |
||||
|
||||
group_neutralize(ts_rank(ts_arg_max(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_arg_max(ts_mean(turnover, 5), 30) |
||||
|
||||
group_neutralize(ts_rank(turnover,20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_corr(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_count_nans(ts_mean(turnover, 5), 10) |
||||
|
||||
group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector) |
||||
|
||||
ts_covariance(volume, turnover, 30) |
||||
|
||||
ts_regression(price, volume, 30, 0, 0) |
||||
|
||||
group_neutralize(ts_rank(ts_regression(volume,turnover,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_count_nans(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_quantile(volume,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
ts_decay_linear(ts_mean(price, 5), 10) |
||||
|
||||
if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) < 0, 1, -1) |
||||
|
||||
ts_scale(ts_corr(volume, turnover, 60), 90) |
||||
|
||||
ts_product(ts_mean(turnover, 5), 10) |
||||
|
||||
group_neutralize(ts_rank(ts_std_dev(turnover,10),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_mean(volume,5),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(sign(ts_delta(volume,1)),20),pv13_h_min20_top3000_sector) |
||||
|
||||
group_neutralize(ts_rank(ts_scale(volume,20),20),pv13_h_min20_top3000_sector) |
||||
|
||||
multiply(if_else(ts_delta(add(ts_rank(ts_mean(market_breadth, 60), 60), ts_rank(ts_mean(vix, 60), 60)), 5) > 0, 1, -1), ts_rank(subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))), 250)) |
||||
|
||||
subtract(add(group_zscore(ts_mean(volume, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(turnover, 20), pv13_h_min20_top3000_sector)), add(group_zscore(ts_mean(bid_ask_spread, 20), pv13_h_min20_top3000_sector), group_zscore(ts_mean(amihud_illiquidity, 20), pv13_h_min20_top3000_sector))) |
||||
|
||||
@ -1,11 +1,12 @@ |
||||
Name |
||||
Supply Chain Financial Resilience Factor |
||||
Liquidity Stratification Pricing Factor |
||||
|
||||
Hypothesis |
||||
Supply chain financial resilience reflects the stability and risk resistance of capital flow between a company and its upstream and downstream partners. During periods of macroeconomic tightening or industry credit events, companies with fragile supply chain financial networks (e.g., over-reliance on a single financing channel, highly concentrated accounts receivable, or abnormally extended payment terms) are more prone to liquidity crises, leading to stock price declines. Conversely, companies with strong supply chain financial resilience (e.g., diversified financing channels, healthy accounts payable structure, stable capital flow synergy with core partners) can better withstand shocks and may even leverage crises to increase market share, potentially resulting in more resilient stock price performance or alpha generation. |
||||
During periods of liquidity tightening or market stress, investors' preference for asset liquidity increases sharply, leading to an intensified phenomenon of liquidity stratification. High-liquidity stocks experience relatively smaller declines due to a "liquidity premium," while low-liquidity stocks are sold off significantly due to a "liquidity discount." When market stress eases and the liquidity environment shifts towards easing, previously overly discounted low-liquidity stocks often exhibit stronger mean reversion and generate more substantial rebounds. Conversely, in the initial phase of a shift from loose to tight market liquidity, high-liquidity stocks may demonstrate stronger defensive characteristics. |
||||
|
||||
Implementation Plan |
||||
Integrate data fields such as accounts receivable concentration (top five customers' share), distribution of accounts payable days, proportion of commercial paper financing, and whether the company is connected to a core enterprise credit circulation platform to construct a "Supply Chain Financial Resilience Score." Use a time-series stability operator (e.g., ts_stddev) to calculate the volatility of this score during the past three periods of widening credit spreads—lower volatility indicates stronger resilience. Employ a cross-sectional bucketing operator to group securities by their industrial chain and compute the percentile rank of the resilience score within each group. Assign positive alpha weights to securities with consistently improving ranks or those stably in the top 30%. |
||||
Construct a comprehensive liquidity measurement indicator incorporating trading volume, turnover rate, bid-ask spread, and the Amihud illiquidity ratio. Use a time-series market regime identification operator (e.g., based on thresholds for market breadth, monetary conditions index, or volatility index VIX) to determine the prevailing "liquidity regime" of the market. During phases identified as a transition from "tight" to "easy," apply positive weights to the portfolio of stocks with the worst prior liquidity (bottom 20% based on the composite indicator). In the initial phase of liquidity "tightening," apply positive weights to the portfolio of stocks with the best liquidity (top 20%). Utilize cross-sectional ranking and group assignment to construct the investment portfolio. |
||||
|
||||
Alpha Factor Optimization Suggestions |
||||
The effectiveness of this factor may be influenced by the overall monetary policy cycle. It is recommended to introduce a macro-state identification operator (e.g., defining "loose" and "tight" states based on treasury term spreads or credit spreads) to dynamically adjust the factor's weight or neutralization method under different states. During tight cycles, the allocation weight of this factor can be amplified; during loose cycles, consider reducing its weight or applying a composite neutralization approach incorporating industry and market cap neutralization to strip out the beta returns driven by systemic liquidity abundance. |
||||
Pure liquidity metrics can be strongly influenced by firm market capitalization and industry attributes. A two-step neutralization process is recommended: First, perform liquidity ranking within industries to eliminate differences in industry trading characteristics. Second, after factor construction, control for exposure to the size factor. Furthermore, introducing the "duration of liquidity shock" as a weighting parameter could help refine the strategy. Stocks that have endured liquidity pressure for a longer period could be assigned higher weights during the reversal phase to more precisely capture the rebound momentum following suppression. |
||||
|
||||
"volume", "turnover", "spread", "illiquidity", "amihud", "bid", "ask", "vix", "liquidity", "tight", "easy", "monetary", "condition", "stress", "market", "breadth", "regime", "duration" |
||||
Loading…
Reference in new issue