题目

请阅读研报《国信证券-市场波动率研究:基于相对强弱下单向波动差值应用-151022》其中关于“相对强弱RPS指标”择时策略的一部分内容。
请复现其中利用RPS指标对沪深300进行择时的回测结果:
注意:
1、回测时请交易成本请按照成交额的千分之5计算
2、请计算出RPS指标值
3、请画出利用RPS指标进行回测 账户的资金曲线图
数据:请见沪深300日线行情数据

代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('data.csv', parse_dates=['date'])
data.set_index('date', inplace=True)

# 计算每日涨跌幅
data['Return'] = data['close'].pct_change()

# 计算过去250日的最大涨幅和最小涨幅
data['Max250'] = data['Return'].rolling(window=250).max()
data['Min250'] = data['Return'].rolling(window=250).min()

# 计算RPS_1:当前涨跌幅与250日的最小涨幅和最大涨幅之间的相对强弱
data['RPS_1'] = (data['Return'] - data['Min250']) / (data['Max250'] - data['Min250'])

# 计算10日移动平均值来得到最终的RPS值
data['RPS'] = data['RPS_1'].rolling(window=10).mean()

# 计算上行波动率和下行波动率
data['UpVolatility'] = np.where(data['Return'] > 0, data['Return'], 0)  # 上行波动率
data['DownVolatility'] = np.where(data['Return'] < 0, -data['Return'], 0)  # 下行波动率

# 计算波动率差值
data['VolatilityDiff'] = data['UpVolatility'] - data['DownVolatility']

# 计算波动率差值的60日移动均值
data['VolatilityDiff_MA'] = data['VolatilityDiff'].rolling(window=60).mean()

# 使用RPS值来确定波动率差值的移动均值天数
# 当RPS > 0.8时,使用较长的60日移动均值;否则使用较短的10日移动均值
data['VolatilityDiff_MA_Smooth'] = np.where(data['RPS'] > 0.8, data['VolatilityDiff_MA'],
                                             data['VolatilityDiff'].rolling(window=10).mean())

# 设定买入和卖出信号
buy_signal = data['VolatilityDiff_MA_Smooth'] > 0  # 持有信号
sell_signal = data['VolatilityDiff_MA_Smooth'] < 0  # 空仓信号

# 初始化回测参数
initial_capital = 1000000  # 初始资金100万
capital = initial_capital
positions = 0  # 当前持仓数量
trade_cost_rate = 0.0005  # 交易成本:千分之5

# 记录每一交易日后的资金
capital_curve = [capital]

# 回测逻辑
for i in range(1, len(data)):
    # 买入信号,且当前没有持仓
    if buy_signal.iloc[i] and positions == 0:
        trade_value = capital * 0.95  # 投入95%的资金进行买入
        positions = trade_value / data['close'].iloc[i]  # 购买的股数
        capital -= trade_value  # 扣除资金

    # 卖出信号,且当前持仓大于0
    elif sell_signal.iloc[i] and positions > 0:
        trade_value = positions * data['close'].iloc[i] * (1 - trade_cost_rate)  # 卖出并扣除交易成本
        capital += trade_value  # 加回资金
        positions = 0  # 清仓

    # 记录资金曲线
    capital_curve.append(capital + positions * data['close'].iloc[i])

# 绘制资金曲线图
plt.figure(figsize=(10, 6))
plt.plot(data.index, capital_curve, label='Capital Curve')
plt.xlabel('Date')
plt.ylabel('Capital')
plt.title('Capital Curve Based on RPS Strategy')
plt.grid(True)
plt.legend()
plt.show()

# 输出最终资金
final_capital = capital_curve[-1]
print(f"Final Capital: {final_capital:.2f}")

图片

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐