社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 实现量化交易:OBV + RSI 策略实战

数据科学实战 • 11 月前 • 610 次点击  

欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 180+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!

引言

在加密货币的量化交易领域,如何构建一个既稳健又高效的交易策略是每个量化交易者追求的目标。今天我们来学习一个结合了 OBV(能量潮指标)、RSI(相对强弱指标)和移动止损的量化交易框架。这个策略在 ETH/USDC 交易对上进行了回测,展示了如何通过 Python 实现一个完整的量化交易系统。

本文将带你深入了解这个策略的核心逻辑,并提供完整的 Python 代码实现,让你能够快速上手并应用到自己的交易系统中。

策略核心思想

这个量化交易框架的独特之处在于它结合了三个关键要素:

  1. OBV 指标:作为主要的交易信号,通过成交量的累积变化来预测价格走势
  2. RSI 过滤器:避免在超买超卖区域进场,降低交易风险
  3. 移动止损:动态调整止损位,既能保护利润又能控制回撤

数据获取

首先,我们使用 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.013070  # 移动止损 1%,RSI 区间 30-70

# 初始化变量
pos, stop, peak, entry = 0NoneNoneNone  # 仓位、止损价、峰值、入场价
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 = 0NoneNoneNone
            
    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 = 0NoneNoneNone
    
    # 入场信号
    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

策略优化建议

  1. 参数优化:可以通过网格搜索或遗传算法优化 OBV 周期、RSI 阈值等参数
  2. 动态止损:根据市场波动性动态调整止损百分比
  3. 多时间框架:结合不同时间周期的信号,提高策略稳定性
  4. 机器学习增强:使用机器学习模型预测最优参数或信号强度

实战案例

让我们通过一个简化的例子来理解策略的运作:

# 模拟数据示例
import pandas as pd
import numpy as np

# 创建模拟数据
dates = pd.date_range('2025-01-01', periods=20, freq='h')
prices = [100102101103105104106108107109
          108107106105104106108110109111]
volumes = [100012009001500180011002000220019002100,
           1600140013001200110015001800200017002100]

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 和移动止损的量化交易策略。这个框架的优势在于:

  1. 多重过滤机制:通过成交量门槛和 RSI 区间过滤,减少虚假信号
  2. 动态风控:移动止损既能保护利润,又能给予持仓足够的空间
  3. 简单有效:策略逻辑清晰,易于理解和实现

虽然回测结果显示了策略的潜力,但在实际应用中还需要考虑交易费用、滑点等因素。建议读者在实盘交易前进行充分的回测和模拟交易,并根据自己的风险偏好调整参数。

量化交易是一个需要不断学习和优化的过程,希望本文能为你的 Python 量化交易之路提供有价值的参考。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

核心权益如下:

  1. 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
  2. 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
  3. 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
  4. 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
  5. 定期更新高频财经数据
  6. 参与年度不少于 10 次专属直播与录播课程
  7. 与核心开发者直接交流,解决实际问题
  8. 获取专业微信群交流机会和课程折扣

星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

《Python编程:从入门到实践(第3版)》是一本广受欢迎的 Python 入门经典教材,由经验丰富的程序员 Eric Matthes 编写。该书采用循序渐进的教学方式,从基础语法讲解到实战项目开发,内容编排合理,实例丰富,语言通俗易懂。全书配有大量练习题和完整项目实战,包括数据可视化、网络爬虫、Web 应用开发等,让读者在实践中掌握编程技巧。第3版还增加了 f-string、海龟绘图等最新的 Python 特性内容。这本书不仅适合零基础读者入门学习,也非常适合想系统掌握 Python 的编程爱好者以及数据分析、人工智能等领域的学习者。它不仅教授编程知识,更注重培养读者的编程思维,是一本非常值得投资的 Python 学习指南。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/187240