RSI 量化策略實戰指南:基於 iTick 報價源的 Python 實現 - iTick

一、策略原理

相對強弱指數(Relative Strength Index, RSI)是由 Welles Wilder 提出的經典技術指標,通過計算價格波動的幅度衡量市場超買 / 超賣狀態。RSI 取值範圍 0-100,常用判斷標準:

  • RSI > 70:超買,潛在反轉信號
  • RSI < 30:超賣,潛在反轉信號
  • 結合趨勢線或價格突破增強信號有效性

二、數據準備

本文使用 iTick 金融數據平台提供的高頻數據,支援 A 股、期貨、數字貨幣等多市場。安裝數據介面庫:

      pip install itrade  # iTick數據介入

    

數據獲取示例(以滬深 300 指數期貨為例):

      """"
**iTick**:是一家數據代理機構,為金融科技公司和開發者提供可靠的數據源APIs,涵蓋外匯API、股票API、加密貨幣API、指數API等,#幫助構建創新的交易和分析工具,目前有免費的套餐可以使用基本可以滿足個人量化開發者需求
開源股票數據接口地址
https://github.com/itick-org
申請免費Apikey地址
https://itick.org
"""
from itrade import quote

# 獲取歷史數據
df = quote.get_kline(
    symbol="IF2303",
    start_date="2023-01-01",
    end_date="2024-01-01",
    interval="1min"
)

# 數據預處理
df = df[['datetime', 'open', 'high', 'low', 'close', 'volume']]
df.set_index('datetime', inplace=True)

    

三、策略實現

1. RSI 計算函數

      import pandas as pd
import numpy as np

def calculate_rsi(df, window=14):
    delta = df['close'].diff(1)
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)

    avg_gain = gain.rolling(window=window, min_periods=window).mean()
    avg_loss = loss.rolling(window=window, min_periods=window).mean()

    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    df[f'RSI_{window}'] = rsi
    return df

    

2. 信號生成邏輯

      def generate_signals(df, rsi_window=14):
    df = calculate_rsi(df, rsi_window)

    # 金叉/死叉信號
    df['signal'] = 0
    df.loc[df[f'RSI_{rsi_window}'] > 70, 'signal'] = -1  # 超賣區做空
    df.loc[df[f'RSI_{rsi_window}'] < 30, 'signal'] = 1   # 超買區做多

    # 趨勢過濾(可選)
    df['ma50'] = df['close'].rolling(50).mean()
    df.loc[df['ma50'] < df['ma50'].shift(1), 'signal'] = 0  # 下降趨勢不做多
    df.loc[df['ma50'] > df['ma50'].shift(1), 'signal'] = 0  # 上升趨勢不做空

    return df

    

四、策略回測

1. 基礎回測框架

      def backtest_strategy(df):
    df['position'] = df['signal'].diff()

    # 計算交易收益
    df['returns'] = np.log(df['close'] / df['close'].shift(1))
    df['strategy_returns'] = df['position'] * df['returns']

    # 計算累計收益
    df['cumulative_returns'] = df['strategy_returns'].cumsum()

    # 計算年化收益、夏普比率等指標
    total_days = len(df) / 252
    sharpe_ratio = np.sqrt(252) * (df['strategy_returns'].mean() / df['strategy_returns'].std())

    return df, sharpe_ratio

    

2. 回測結果分析

      # 執行回測
df, sharpe = backtest_strategy(df)

print(f"策略夏普比率: {sharpe:.2f}")
print(f"最大回撤: {max_drawdown(df['cumulative_returns']):.2%}")

# 可視化
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
plt.plot(df.index, df['cumulative_returns'], label='策略收益')
plt.plot(df.index, df['close'].pct_change().cumsum(), label='基準收益')
plt.legend()
plt.show()

    

五、策略優化方向

  • 參數優化:使用 GridSearchCV 尋找最優 RSI 週期和閾值組合
  • 多時間框架:結合日線與小時線信號提高勝率
  • 風險控制:設置動態止損(如 ATR 通道止損)
  • 資金管理:基於波動率調整倉位

六、iTick 數據優勢

  • 全市場覆蓋:支援 A 股、期貨、期權、數字貨幣等多品種
  • 高頻低延遲:提供 Level-2 行情和 Tick 級數據
  • 便捷接入:支援 Python/R/Matlab 多語言介面
  • 歷史數據完整:提供十年以上歷史行情數據

七、注意事项

  • RSI 在趨勢市場中可能出現鈍化,建議結合趨勢指標使用
  • 需定期對策略參數進行再優化
  • 實盤需考慮滑點和流動性風險
  • 建議使用 iTick 的即時數據流進行策略驗證

透過本文的程式碼框架,讀者可以快速實現基於 RSI 的量化策略,並結合 iTick 的專業金融數據進行策略開發與驗證。實際應用中需根據具體市場環境調整參數和風險控制規則。