RSI 量化策略实战指南:基于 iTick 外汇贵金属股票报价API的 Python 实现
RSI 指标量化策略实战指南:基于 ITick 外汇、贵金属、股票报价 API 的 Python 实现,包含完整策略开发、回测与优化步骤。
PreviousiTick 外汇股票报价 API 服务与 DeepSeek-R1 大模型深度融合:构建智能量化投资新生态Next双均线量化策略实战指南:基于 iTick 外汇API、股票API报价源的 Python 实现
Last updated
RSI 指标量化策略实战指南:基于 ITick 外汇、贵金属、股票报价 API 的 Python 实现,包含完整策略开发、回测与优化步骤。
Last updated
"""
**iTick**:是一家数据代理机构,为金融科技公司和开发者提供可靠的数据源APIs,涵盖外汇API、股票API、加密货币API、指数API等,帮助构建创新的交易和分析工具,目前有免费的套餐可以使用基本可以满足个人量化开发者需求
https://github.com/itick-org
https://itick.org
"""
pip install itrade # iTick数据接口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)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 dfdef 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 dfdef 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# 执行回测
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()