【量化交易策略01】RSI策略的回测实现

(1)导入所需的库
首次运行前需在Jupyter Notebook中安装并配置Tushare Pro。
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
ts.set_token('your token')
pro = ts.pro_api()
(2)获取历史价格数据
我们将从Tushare Pro中获取股票的历史收盘价数据。
df = pro.daily(ts_code='000001.SZ', start_date='20200101', end_date='20231231')
# 数据预处理
df = df[['trade_date', 'close']]
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df = df.sort_index()
df.head()
(3)计算RSI指标
def calculate_RSI(prices, window=14):
    """
    计算RSI指标
    prices: 收盘价序列
    window: RSI计算窗口期,通常为14天
    """
    delta = prices.diff(1)
    gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
    RS = gain / loss
    RSI = 100 - (100 / (1 + RS))
    return RSI

# 计算RSI
df['RSI'] = calculate_RSI(df['close'], window=14)
df.head()

(4)生成交易信号

# 设置超买和超卖阈值
rsi_oversold = 30
rsi_overbought = 70
# 生成交易信号
df['Buy_Signal'] = (df['RSI'] < rsi_oversold).astype(int)
df['Sell_Signal'] = (df['RSI'] > rsi_overbought).astype(int)
# 生成持仓信号
df['Position'] = df['Buy_Signal'] - df['Sell_Signal']
df['Position'] = df['Position'].shift(1).fillna(0)
df.head()
(5)计算策略收益率
根据持仓信号计算策略的每日收益率和累积收益率。
# 计算每日收益率
df['Returns'] = df['close'].pct_change()
# 计算策略收益率
df['Strategy_Returns'] = df['Returns'] * df['Position']
# 计算累积收益率
df['Cumulative_Strategy_Returns'] = (1 + df['Strategy_Returns']).cumprod() - 1
df['Cumulative_Market_Returns'] = (1 + df['Returns']).cumprod() - 1
df.head()
(6)绩效评估
计算策略的总体收益率、最大回撤、夏普比率等。
# 计算策略的总收益率
total_return = df['Cumulative_Strategy_Returns'].iloc[-1]
# 计算最大回撤
rolling_max = (1 + df['Strategy_Returns']).cumprod().cummax()
drawdown = (1 + df['Strategy_Returns']).cumprod() / rolling_max - 1
max_drawdown = drawdown.min()
# 计算夏普比率
sharpe_ratio = df['Strategy_Returns'].mean() / df['Strategy_Returns'].std() * np.sqrt(252)

print(f"策略的总收益率: {total_return * 100:.2f}%")
print(f"最大回撤: {max_drawdown * 100:.2f}%")
print(f"夏普比率: {sharpe_ratio:.2f}")
(7)可视化结果
# 可视化策略表现
plt.figure(figsize=(10, 6))
plt.plot(df['Cumulative_Strategy_Returns'], label='Strategy Returns')
plt.plot(df['Cumulative_Market_Returns'], label='Market Returns')
plt.title('Cumulative Returns of RSI Strategy vs Market')
plt.xlabel('Date')
plt.ylabel('Cumulative Returns')
plt.legend()
plt.show()

这是通过矢量化方法实现的一个RSI策略,主要思路如下:

(1)策略信号:当RSI低于阈值(如30)时,认为市场超卖,可能出现反弹机会,则买入。当RSI高于阈值(如70)时,认为市场超买,可能出现回调机会,则卖出。

(2)回测步骤:首先,数据准备:获取历史价格数据并计算RSI指标。其次,策略执行:根据买入和卖出信号执行交易,记录每次交易的盈亏情况。最后,绩效评估:计算策略的总体收益率、最大回撤、夏普比率等。

(3)回测类型:基于JUPYTER NOTEBOOK 来写一个向量化 面向过程 一步步实现的 回测代码,数据来源是tushare pro,可以免费注册。

注意:矢量化回测优点是速度快,但不足缺少基于事件驱动回测的细节把控能力。这是快速检验自己想法的重要 方法,如果矢量化回测都不行,那么得三思而后行。

(供大家在技术方面参考,不具有投资建议!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值