4、交易策略智能体:趋势跟踪智能体、均值回归智能体、套利智能体的设计与实现
好,咱们今天来聊聊交易策略智能体。这部分内容,说白了就是给多智能体系统装上「大脑」——每个智能体得有自己的交易逻辑,知道什么时候该买,什么时候该卖。
我个人习惯把策略智能体分成三大类:趋势跟踪、均值回归、套利。这三种策略的逻辑完全不同,甚至可以说是「互斥」的。你想想看,趋势跟踪在追涨杀跌,均值回归在抄底逃顶,套利在吃价差——它们对同一段行情的判断可能截然相反。但正是这种多样性,才让多智能体协同有了意义。
4.1 趋势跟踪智能体
趋势跟踪,说白了就是「顺势而为」。它的核心假设是:趋势一旦形成,就会持续一段时间。我在项目中遇到过很多次,新手总想抄底摸顶,结果被趋势甩下车。嗯,这里要注意——趋势跟踪不是预测顶底,而是跟随趋势。
4.1.1 核心逻辑
趋势跟踪智能体的决策逻辑很简单:
- 当价格突破某个阈值时,认为趋势启动,开仓
- 当价格反向突破另一个阈值时,认为趋势结束,平仓
常用的技术指标包括:
- 移动平均线(MA):金叉死叉判断趋势方向
- MACD:DIF线与DEA线的交叉信号
- 布林带(Bollinger Bands):价格突破上轨/下轨作为信号
- ADX:衡量趋势强度,ADX > 25 才认为有趋势
4.1.2 代码实现
我习惯用 Python 写策略原型。下面是一个基于双均线交叉的趋势跟踪智能体:
class TrendFollowingAgent:
def __init__(self, fast_period=10, slow_period=30):
self.fast_period = fast_period
self.slow_period = slow_period
self.position = 0 # 0: 空仓, 1: 多头, -1: 空头
def on_data(self, price_series):
# 计算快慢均线
fast_ma = price_series.rolling(self.fast_period).mean()
slow_ma = price_series.rolling(self.slow_period).mean()
# 获取最新值
current_fast = fast_ma.iloc[-1]
current_slow = slow_ma.iloc[-1]
prev_fast = fast_ma.iloc[-2]
prev_slow = slow_ma.iloc[-2]
# 金叉:快线上穿慢线
if prev_fast <= prev_slow and current_fast > current_slow:
self.position = 1
return {'action': 'BUY', 'reason': 'golden_cross'}
# 死叉:快线下穿慢线
elif prev_fast >= prev_slow and current_fast < current_slow:
self.position = -1
return {'action': 'SELL', 'reason': 'death_cross'}
return {'action': 'HOLD', 'reason': 'no_signal'}
4.2 均值回归智能体
均值回归的逻辑和趋势跟踪正好相反。它认为:价格偏离均值太远时,最终会回归。说白了就是「涨多了会跌,跌多了会涨」。
你想想看,为什么会有均值回归?因为市场参与者的情绪会过度反应。恐慌时卖过头,贪婪时买过头——这些极端情绪总会消退。
4.2.1 核心逻辑
均值回归智能体的决策逻辑:
- 当价格低于均值一定标准差时,认为超卖,买入
- 当价格高于均值一定标准差时,认为超买,卖出
常用的指标:
- 布林带:价格触及下轨买入,触及上轨卖出
- RSI:RSI < 30 超卖,RSI > 70 超买
- Z-Score:计算价格偏离均值的标准差倍数
4.2.2 代码实现
class MeanReversionAgent:
def __init__(self, window=20, entry_z=2.0, exit_z=0.5):
self.window = window
self.entry_z = entry_z # 开仓阈值
self.exit_z = exit_z # 平仓阈值
self.position = 0
def on_data(self, price_series):
# 计算均值和标准差
mean = price_series.rolling(self.window).mean()
std = price_series.rolling(self.window).std()
current_price = price_series.iloc[-1]
current_mean = mean.iloc[-1]
current_std = std.iloc[-1]
# 计算Z-Score
z_score = (current_price - current_mean) / current_std
# 开仓逻辑
if self.position == 0:
if z_score < -self.entry_z:
self.position = 1
return {'action': 'BUY', 'reason': 'oversold'}
elif z_score > self.entry_z:
self.position = -1
return {'action': 'SELL', 'reason': 'overbought'}
# 平仓逻辑:回归到均值附近
elif self.position == 1 and z_score > -self.exit_z:
self.position = 0
return {'action': 'SELL', 'reason': 'revert_to_mean'}
elif self.position == -1 and z_score < self.exit_z:
self.position = 0
return {'action': 'BUY', 'reason': 'revert_to_mean'}
return {'action': 'HOLD', 'reason': 'no_signal'}
4.3 套利智能体
套利智能体,说白了就是「吃价差」。它不关心价格涨跌,只关心两个或多个相关资产之间的价差是否合理。
套利的核心是:价差偏离均值时,做多低估资产、做空高估资产,等待价差回归。这其实也是一种均值回归,只不过回归的对象是「价差」而不是「价格」。
4.3.1 核心逻辑
常见的套利模式:
- 跨期套利:同一品种不同合约月份之间的价差
- 跨品种套利:相关性高的两个品种(如螺纹钢和热卷)
- 期现套利:期货价格与现货价格之间的基差
套利智能体的决策流程:
- 计算价差:Spread = Price_A - Price_B × 系数
- 计算价差的均值和标准差:判断当前价差是否偏离
- 开仓:价差偏离超过阈值时,做多价差或做空价差
- 平仓:价差回归到均值附近时平仓
4.3.2 代码实现
class ArbitrageAgent:
def __init__(self, window=60, entry_z=2.0, hedge_ratio=1.0):
self.window = window
self.entry_z = entry_z
self.hedge_ratio = hedge_ratio # 对冲比例
self.position = 0 # 1: 做多价差, -1: 做空价差
def on_data(self, price_a_series, price_b_series):
# 计算价差
spread = price_a_series - self.hedge_ratio * price_b_series
# 计算价差的均值和标准差
mean = spread.rolling(self.window).mean()
std = spread.rolling(self.window).std()
current_spread = spread.iloc[-1]
current_mean = mean.iloc[-1]
current_std = std.iloc[-1]
z_score = (current_spread - current_mean) / current_std
# 开仓逻辑
if self.position == 0:
if z_score < -self.entry_z:
self.position = 1
return {
'action': 'BUY_SPREAD',
'leg1': ('BUY', 'asset_a'),
'leg2': ('SELL', 'asset_b'),
'reason': 'spread_too_low'
}
elif z_score > self.entry_z:
self.position = -1
return {
'action': 'SELL_SPREAD',
'leg1': ('SELL', 'asset_a'),
'leg2': ('BUY', 'asset_b'),
'reason': 'spread_too_high'
}
# 平仓逻辑
elif self.position == 1 and z_score > -0.5:
self.position = 0
return {'action': 'CLOSE_SPREAD', 'reason': 'spread_reverted'}
elif self.position == -1 and z_score < 0.5:
self.position = 0
return {'action': 'CLOSE_SPREAD', 'reason': 'spread_reverted'}
return {'action': 'HOLD', 'reason': 'no_signal'}
- 流动性风险:价差偏离时,可能其中一个品种流动性不足,无法成交
- 执行风险:两个腿的成交时间差可能导致滑点
- 价差持续偏离:比如2015年股指期货贴水,价差几个月不回归
4.4 三种策略的对比与协同
这三种策略,各有各的适用场景。我整理了一个对比表:
| 维度 | 趋势跟踪 | 均值回归 | 套利 |
|---|---|---|---|
| 适用行情 | 趋势行情 | 震荡行情 | 价差偏离行情 |
| 持仓周期 | 中长线(天/周) | 短线(小时/天) | 极短线(分钟/小时) |
| 风险来源 | 趋势反转 | 趋势延续 | 价差持续偏离 |
| 胜率 | 较低(30%-40%) | 较高(50%-60%) | 较高(60%-70%) |
| 盈亏比 | 高(3:1以上) | 低(1:1左右) | 中等(1.5:1左右) |
在多智能体系统中,这三种策略可以协同工作:
- 趋势跟踪智能体负责捕捉大行情,赚大钱
- 均值回归智能体负责在震荡市中赚小钱,平滑收益曲线
- 套利智能体负责捕捉价差机会,提供低风险收益
我个人习惯让它们共享一个「市场状态判断器」——当市场处于趋势状态时,提高趋势跟踪的权重;当市场处于震荡状态时,提高均值回归的权重。这样就能实现「自适应」的策略切换。
好了,三种策略智能体的核心逻辑和实现就讲到这里。记住,策略本身没有好坏,关键看你怎么用、用在什么市场环境下。下一节我们会聊到这些智能体之间如何通信、如何协调决策——那才是多智能体系统的精髓所在。