You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
WorldQuant-Brain-Alpha/alpha_strategy.py

108 lines
3.7 KiB

"""Alpha 策略生成模块"""
class AlphaStrategy:
def get_simulation_data(self, datafields, mode=1):
"""根据模式生成策略列表"""
if mode == 1:
return self.generate_basic_strategy(datafields)
elif mode == 2:
return self.generate_multi_factor_strategy(datafields)
else:
print("❌ 无效的策略模式")
return []
def generate_basic_strategy(self, datafields):
"""生成基础策略"""
strategies = []
for field in datafields:
# 1. 日内策略
strategies.extend([
# 日内收益率
"group_rank((close - open)/open, subindustry)",
# 隔夜收益率
"group_rank((open - delay(close, 1))/delay(close, 1), subindustry)",
# 高低价差异
"group_rank((high - low)/open, subindustry)"
])
# 2. 波动率策略
strategies.extend([
# 波动率偏度
f"power(ts_std_dev(abs({field}), 30), 2) - power(ts_std_dev({field}, 30), 2)",
# 波动率动态调整
f"group_rank(std({field}, 20)/mean({field}, 20) * (1/cap), subindustry)"
])
# 3. 成交量策略
if field in ['volume', 'turnover']:
strategies.extend([
# 成交量异常
"group_rank((volume/sharesout - mean(volume/sharesout, 20))/std(volume/sharesout, 20), subindustry)",
# 成交量趋势
"ts_corr(volume/sharesout, abs(returns), 10)"
])
# 4. 市场微观结构
strategies.extend([
# 小单买卖压力
f"group_neutralize(power(rank({field} - group_mean({field}, 1, subindustry)), 3), bucket(rank(cap), range='0,1,0.1'))",
# 流动性压力
f"group_rank(correlation({field}, volume/sharesout, 20), subindustry)"
])
# 5. 条件触发策略
strategies.extend([
# 条件触发
f"trade_when(ts_rank(ts_std_dev(returns, 10), 252) < 0.9, {field}, -1)",
# 市场状态过滤
f"trade_when(volume > mean(volume, 20), {field}, -1)"
])
return strategies
def generate_multi_factor_strategy(self, datafields):
"""生成多因子组合策略"""
strategies = []
n = len(datafields)
for i in range(0, n-1, 2):
field1 = datafields[i]
field2 = datafields[i+1]
# 1. 回归中性化
strategies.extend([
f"regression_neut(vector_neut({field1}, {field2}), abs(ts_mean(returns, 252)/ts_std_dev(returns, 252)))",
# 多重回归
f"regression_neut(regression_neut({field1}, {field2}), ts_std_dev(returns, 30))"
])
# 2. 条件组合
strategies.extend([
# 条件选择
f"if_else(rank({field1}) > 0.5, {field2}, -1 * {field2})",
# 分组组合
f"group_neutralize({field1} * {field2}, bucket(rank(cap), range='0.1,1,0.1'))"
])
# 3. 复杂信号
strategies.extend([
# 信号强度
f"power(rank(group_neutralize(-ts_decay_exp_window(ts_sum(if_else({field1}-group_mean({field1},1,industry)-0.02>0,1,0)*ts_corr({field2},cap,5),3),50),industry)),2)",
# 市场状态
f"trade_when(ts_rank(ts_std_dev(returns,10),252)<0.9, {field1} * {field2}, -1)"
])
return strategies