欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 180+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!
引言
在加密货币的量化交易领域,如何构建一个既稳健又高效的交易策略是每个量化交易者追求的目标。今天我们来学习一个结合了 OBV(能量潮指标)、RSI(相对强弱指标)和移动止损的量化交易框架。这个策略在 ETH/USDC 交易对上进行了回测,展示了如何通过 Python 实现一个完整的量化交易系统。
本文将带你深入了解这个策略的核心逻辑,并提供完整的 Python 代码实现,让你能够快速上手并应用到自己的交易系统中。
策略核心思想
这个量化交易框架的独特之处在于它结合了三个关键要素:
- OBV 指标:作为主要的交易信号,通过成交量的累积变化来预测价格走势
- RSI 过滤器:避免在超买超卖区域进场,降低交易风险
-
移动止损:动态调整止损位,既能保护利润又能控制回撤
数据获取
首先,我们使用 CCXT 库从币安交易所获取 ETH/USDC 的历史数据:
import ccxt, pandas as pd, numpy as np
# 设置交易对、时间周期和数据条数
SYMBOL, TF, LIM = 'ETH/USDC', '1h', 1000
# 连接币安交易所
ex = ccxt.binance()
# 获取 OHLCV 数据
ohlcv = ex.fetch_ohlcv(SYMBOL, TF, limit=LIM)
# 转换为 DataFrame 格式
df = pd.DataFrame(ohlcv, columns='ts open high low close volume'.split())
df['time'] = pd.to_datetime(df['ts'], unit='ms')
df.set_index('time', inplace=True)
df[['close','volume']] = df[['close','volume']].astype(float)
指标计算
1. OBV(能量潮)指标
OBV 通过累积成交量来判断买卖压力:
# 计算价格变化
chg = df['close'].diff().fillna(0.0)
# 计算 OBV:价格上涨时加上成交量,下跌时减去成交量
df['obv'] = (np.sign(chg) * df['volume']).fillna(0).cumsum()
# 计算 OBV 的 6 期移动平均线
df['obv_ma'] = df['obv'].rolling(6).mean()
2. 成交量过滤器
为了避免在低成交量期间产生虚假信号,我们设置成交量门槛:
# 计算成交量的 6 期移动平均
df[
'vol_sma'] = df['volume'].rolling(6).mean()
3. RSI 指标
使用 6 期 RSI 来识别超买超卖状态:
# 计算价格变化
delta = df['close'].diff()
# 分离上涨和下跌的价格变化
up, down = delta.clip(lower=0), -delta.clip(upper=0)
# 计算指数移动平均
roll_up = up.ewm(alpha=1/6, adjust=False).mean()
roll_down = down.ewm(alpha=1/6, adjust=False).mean()
# 计算 RSI
rs = roll_up / roll_down.replace(0, np.nan)
df['rsi'] = 100 - (100 / (1 + rs))
# 删除空值
df = df.dropna()
策略实现
核心交易逻辑包括入场信号、过滤条件和出场规则:
# 策略参数设置
TRAIL_PCT, RSI_MIN, RSI_MAX = 0.01, 30, 70 # 移动止损 1%,RSI 区间 30-70
# 初始化变量
pos, stop, peak, entry = 0, None, None, None # 仓位、止损价、峰值、入场价
cum_pnl = 0.0 # 累计盈亏
# 用于记录权益曲线
equity_series = pd.Series(index=df.index, dtype=float)
# 遍历每个交易时段
for i in range(1, len(df)):
c1 = df['close'].iloc[i] # 当前收盘价
# 获取指标值
obv0, obv1 = df['obv'].iloc[i-1], df['obv'].iloc[i]
ma0, ma1 = df['obv_ma'].iloc[i-1], df['obv_ma'].iloc[i]
vol_ok = df['volume'].iloc[i] > df['vol_sma'].iloc[i] # 成交量是否达标
rsi = df['rsi'].iloc[i]
# 判断 OBV 交叉信号
cross_up = (obv0 <= ma0) and (obv1 > ma1) # 向上交叉
cross_dn = (obv0 >= ma0) and (obv1 < ma1) # 向下交叉
# RSI 过滤条件
guard_ok = (RSI_MIN <= rsi <= RSI_MAX)
# 管理移动止损
if pos == 1: # 多头仓位
peak = max(peak, c1) # 更新最高价
stop = max(stop, peak * (1 - TRAIL_PCT)) # 更新止损价
if c1 <= stop: # 触发止损
cum_pnl += c1 - entry
pos, stop, peak, entry = 0, None, None, None
elif pos == -1: # 空头仓位
peak = min(peak, c1) # 更新最低价
stop = min(stop, peak * (1 + TRAIL_PCT)) # 更新止损价
if c1 >= stop: # 触发止损
cum_pnl += entry - c1
pos, stop, peak, entry = 0, None, None, None
# 入场信号
if pos == 0 and vol_ok and guard_ok: # 无仓位且满足过滤条件
if cross_up: # 做多信号
pos, entry, peak, stop = 1, c1, c1, c1 * (1 - TRAIL_PCT)
elif cross_dn: # 做空信号
pos, entry, peak, stop = -1, c1, c1, c1 * (1 + TRAIL_PCT)
# 计算当前权益
unreal = (c1 - entry) if pos == 1 else ((entry - c1) if pos == -1 else 0)
equity_series.iloc[i] = cum_pnl + unreal
策略优化建议
- 参数优化:可以通过网格搜索或遗传算法优化 OBV 周期、RSI 阈值等参数
- 多时间框架:结合不同时间周期的信号,提高策略稳定性
- 机器学习增强:使用机器学习模型预测最优参数或信号强度
实战案例
让我们通过一个简化的例子来理解策略的运作:
# 模拟数据示例
import pandas as pd
import numpy as np
# 创建模拟数据
dates = pd.date_range('2025-01-01', periods=20, freq='h')
prices = [100, 102, 101, 103, 105, 104, 106, 108, 107, 109,
108, 107, 106, 105, 104, 106, 108, 110, 109, 111]
volumes = [1000, 1200, 900, 1500, 1800, 1100, 2000, 2200, 1900, 2100,
1600, 1400, 1300, 1200, 1100, 1500, 1800, 2000, 1700, 2100]
df_example = pd.DataFrame({
'close': prices,
'volume': volumes
}, index=dates)
# 计算 OBV
chg = df_example['close'].diff().fillna(0.0)
df_example['obv'] = (np.sign(chg) * df_example['volume']).fillna(0).cumsum()
df_example['obv_ma'] = df_example['obv'].rolling(3).mean()
print("价格、成交量和 OBV 示例:")
print(df_example[['close', 'volume', 'obv', 'obv_ma']].head(10))
总结
本文介绍了一个结合 OBV、RSI 和移动止损的量化交易策略。这个框架的优势在于:
- 多重过滤机制:通过成交量门槛和 RSI 区间过滤,减少虚假信号
- 动态风控:移动止损既能保护利润,又能给予持仓足够的空间
虽然回测结果显示了策略的潜力,但在实际应用中还需要考虑交易费用、滑点等因素。建议读者在实盘交易前进行充分的回测和模拟交易,并根据自己的风险偏好调整参数。
量化交易是一个需要不断学习和优化的过程,希望本文能为你的 Python 量化交易之路提供有价值的参考。
参考文章
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。财经数据与量化投研知识社区
核心权益如下:
- 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
- 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
- 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
- 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!