跳转到内容

Alpha 模型

Alpha 模型负责根据市场状态生成候选交易信号。它的职责是判断机会何时出现,并返回一个 Insight,而不是管理完整的订单生命周期。

AQE 通过专用生命周期调用 Alpha 模型:

  • start()
  • init(asset)
  • generate_insights(symbol)
aq-engine/src/core/alpha/mod.rs
pub trait AlphaModel {
fn version(&self) -> &str;
fn start(&mut self, ctx: &mut dyn StrategyContext);
fn init(&mut self, ctx: &mut dyn StrategyContext, asset: &Asset);
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult;
}

使用 start() 进行运行时全局配置:

  • 注册指标
  • 设置预热 K 线数量
  • 准备各品种开始初始化之前所需的状态

使用 init() 分别配置各资产:

  • 初始化品种专属变量
  • 读取资产元数据
  • 准备各品种的运行时状态

使用 generate_insights():

  • 读取最新历史数据
  • 检查指标或变量
  • 检查资产元数据
  • 创建并返回新的 Insight

EmaPriceCrossover 是 AQE 中的一个具体 Alpha 模型。它会:

  • 注册 ATR 和 EMA
  • 读取历史数据
  • 检查最新和前一根 K 线
  • 使用资产元数据判断是否允许做空信号
  • 返回包含入场、TP、SL 和 TTL 设置的交易信号
aq-engine/src/core/alpha/ema_price_crossover.rs
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult {
let Some(asset) = self.get_asset(ctx, symbol) else {
return AlphaResult::new(None, false, Some(format!("Asset {} not found", symbol)), self.name().to_string());
};
let history = match self.get_history(ctx, symbol) {
Some(history) if history.height() >= 2 => history,
_ => return AlphaResult::new(None, true, Some("Not enough history".to_string()), self.name().to_string()),
};
// derive signal, tp, sl, entry ...
let mut insight = Insight::new(
side,
symbol.to_string(),
StrategyType::Custom(self.name().to_string()),
ctx.timeframe().clone(),
confidence,
None,
);
insight
.set_limit_price(Some(entry))
.set_take_profit_levels(Some(vec![tp]))
.set_stop_loss(Some(sl))
.set_period_unfilled(Some(ttluf as u32))
.set_period_till_tp(Some(ttlf as u32));
AlphaResult::new(Some(insight), true, None, self.name().to_string())
}

TestEntry 展示了更简单的 Alpha 模型形式:

  • 读取近期价格状态
  • 统计每个品种的活跃交易信号数量
  • 满足条件时发出新的买入或卖出交易信号

如果想从简单实现入手,可以参考它编写自己的策略代码。

Alpha 模型不应变成完整的运行时管理器。大多数情况下,应避免将以下职责放入 Alpha 模型:

  • 最终仓位数量计算
  • 交易提交
  • 平仓逻辑
  • 止损触发检查
  • 交易时段筛选

这些职责更适合放在信号处理器中。

  • aq-engine/src/core/alpha/mod.rs
  • aq-engine/src/core/alpha/ema_price_crossover.rs
  • aq-engine/src/core/alpha/test_entry.rs