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.
108 lines
3.7 KiB
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
|
|
|