量化交易——RSI策略(vectorbt实现)

news/2024/12/23 11:04:09 标签: python, 量化交易, vectorbt

本文为通过vectorbt(以下简称vbt)实现量化交易系列第一篇文章,通过使用vbt实现RSI策略从而熟悉其代码框架。

关于本文所使用数据的说明

由于vbt官方文档提供的入门案例使用的数据是通过其内置的yfinance包获取,在国内无法直接访问,故本文将原数据替换为更容易获取的国内数据。本文使用的数据是通过tushare获取的A股日线行情数据,具体参数如下图所示:
在这里插入图片描述

一、pandas常用函数

(1)drop()

函数语法:

python">DataFrame.drop(
labels=None, 
axis=0, 
index=None,
 columns=None,
  level=None, 
  inplace=False, 
  errors='raise'
  )

参数说明:

labels: 待删除的行名or列名;

axis: 删除时所参考的轴,0为行,1为列;

index: 待删除的行名

columns: 待删除的列名

level:多级列表时使用,暂时不作说明

inplace: 布尔值,默认为False,若为False,则返回的是一个copy;若为True,返回的是删除相应数据后的数据

(1)set_index()

功能:指定数据表中的某列或指定某个数组列表为DataFrame行索引。

函数语法

python">DataFrame.set_index(keys, *, drop=True, append=False, inplace=False, verify_integrity=False)

参数说明:
key: 数据表中的某列/列标签列表/数组列表,需要设置为索引的列。
drop: 删除用作新索引的列,默认为True,删除。
append:是否将列附加到现有索引,默认为False,否。
inplace:表示当前操作是否对原数据重新,默认为False,否。
verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为False,将提高该方法的性能,默认为False。

保留到小数点后两位

python">df.apply(lambda x:round(x,2))

二、RSI策略

(1)RSI计算步骤‌

‌确定时间周期‌:通常设定为14天,但也可以根据需要选择6、12、24等其他周期。
‌计算涨幅和跌幅‌:
涨幅:每日收盘价高于前一日收盘价的差额。
跌幅:每日收盘价低于前一日收盘价的差额(取正值)。
‌计算N日内涨幅之和与跌幅之和‌:将时间周期内每日的涨幅和跌幅分别累加。
‌计算RS值‌:用N日内涨幅之和的平均值除以N日内跌幅之和的平均值。
‌计算RSI值‌:将RS值代入RSI公式,得到RSI值。

(2)RSI取值范围及意义‌

RSI的取值范围在0到100之间,通常以30和70作为超卖和超买的标志线,或以20和80作为超卖和超买的标志线。具体解读如下:

当RSI值超过70或80时,市场处于超买状态,可能会有下跌的趋势。
当RSI值低于30或20时,市场处于超卖状态,可能会有上涨的趋势。
当RSI值在50附近时,代表多空力量均衡。

vectorbt_70">RSI策略的vectorbt实现方法

第一步:RSI.run()

只需要传入股票每日收盘价,窗口默认为14天。

python">rsi=vbt.RSI.run(price,window=14)
print('rsi:',rsi.rsi)

特别提示: 查看rsi的值请使用rsi.rsi
官方文档详见下图:
在这里插入图片描述

第二步:设置买入和卖出条件

rsi值下穿30线时买入,上穿70时卖出。下图为rsi_above和rsi_below函数参数。

python">#下穿rsi=30线时买入
entries=rsi.rsi_crossed_below(30)
print(entries)
#上穿rsi=70时卖出
exits=rsi.rsi_crossed_above(70)
print(exits)

在这里插入图片描述

函数名说明
rsi_above()开区间上穿特定值时,返回True,反之返回False
rsi_closed_above()闭区间上穿特定值时,返回True,反之返回False
rsi_crossed_above()刚好上穿特定值时,返回True,反之返回False
rsi_below()开区间下穿特定值时,返回True,反之返回False
rsi_closed_below()闭区间下穿特定值时,返回True,反之返回False
rsi_crossed_below()刚好下穿特定值时,返回True,反之返回False

第三步:模拟投资【vbt.Portfolio.from_signals()】

该函数通过买入和卖出信号来模拟投资。代码如下:

python">pf=vbt.Portfolio.from_signals(price,entries=entries,exits=exits,init_cash=10000)

该函数的参数详情如下:

python">Portfolio.from_signals(
    close,
    entries=None,
    exits=None,
    short_entries=None,
    short_exits=None,
    signal_func_nb=no_signal_func_nb,
    signal_args=(),
    size=None,
    size_type=None,
    price=None,
    fees=None,
    fixed_fees=None,
    slippage=None,
    min_size=None,
    max_size=None,
    size_granularity=None,
    reject_prob=None,
    lock_cash=None,
    allow_partial=None,
    raise_reject=None,
    log=None,
    accumulate=None,
    upon_long_conflict=None,
    upon_short_conflict=None,
    upon_dir_conflict=None,
    upon_opposite_entry=None,
    direction=None,
    val_price=None,
    open=None,
    high=None,
    low=None,
    sl_stop=None,
    sl_trail=None,
    tp_stop=None,
    stop_entry_price=None,
    stop_exit_price=None,
    upon_stop_exit=None,
    upon_stop_update=None,
    adjust_sl_func_nb=no_adjust_sl_func_nb,
    adjust_sl_args=(),
    adjust_tp_func_nb=no_adjust_tp_func_nb,
    adjust_tp_args=(),
    use_stops=None,
    init_cash=None,
    cash_sharing=None,
    call_seq=None,
    ffill_val_price=None,
    update_value=None,
    max_orders=None,
    max_logs=None,
    seed=None,
    group_by=None,
    broadcast_named_args=None,
    broadcast_kwargs=None,
    template_mapping=None,
    wrapper_kwargs=None,
    freq=None,
    attach_call_seq=None,
    **kwargs
)

第四步:查看回测结果

python">print(pf.stats().apply(lambda x:round(x,2)))

运行结果:

Start                         20230804.00
End                           20241220.00
Period                             335.00
Start Value                      10000.00
End Value                        10041.23
Total Return [%]                     0.41
Benchmark Return [%]                -5.53
Max Gross Exposure [%]             100.00
Total Fees Paid                      0.00
Max Drawdown [%]                    21.89
Max Drawdown Duration              313.00
Total Trades                         5.00
Total Closed Trades                  5.00
Total Open Trades                    0.00
Open Trade PnL                       0.00
Win Rate [%]                        60.00
Best Trade [%]                      13.20
Worst Trade [%]                    -14.94
Avg Winning Trade [%]                7.12
Avg Losing Trade [%]                -9.31
Avg Winning Trade Duration          25.67
Avg Losing Trade Duration           77.00
Profit Factor                        1.02
Expectancy                           8.25
dtype: float64

第五步:画图

python">pf.plot().show()

运行结果:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

完整代码

python">import vectorbt as vbt
import pandas as pd

pd=pd.read_csv("stock_data/000001.SZ.csv",names=['index','trade_date','open','close','low','high','vol','x','macd','dif','dea'])
#删除index列
pd=pd.drop(columns='index')
#pd.index=pd['trade_date']
#设置trade_date列为行索引
pd=pd.set_index('trade_date')
price=pd['close']#每日收盘价
#设计RSI策略
'''
窗口:14天
超卖:30
超买:70
'''
rsi=vbt.RSI.run(price,window=14)
print('rsi:',rsi.rsi)
#下穿rsi=30线时买入
entries=rsi.rsi_crossed_below(30)
print(entries)
#上穿rsi=70时卖出
exits=rsi.rsi_crossed_above(70)
print(exits)
#回测
pf=vbt.Portfolio.from_signals(price,entries=entries,exits=exits,init_cash=10000)
#
print(pf.stats().apply(lambda x:round(x,2)))
print(pf.total_return)
pf.plot().show()

参考文献

pandas drop()函数详解
tushare官网


http://www.niftyadmin.cn/n/5796560.html

相关文章

3 JDK 常见的包和BIO,NIO,AIO

JDK常见的包 java.lang:系统基础类 java.io:文件操作相关类,比如文件操作 java.nio:为了完善io包中的功能,提高io性能而写的一个新包 java.net:网络相关的包 java.util:java辅助类,特别是集合类 java.sql:数据库操作类 IO流 按照流的流向分…

Mapbox-GL 中 `token` 的使用

Mapbox-GL 是一个开源的 JavaScript 库,允许开发者在网页上渲染交互式地图。token 在 Mapbox 中主要是指 access token,它用于身份验证和授权,确保应用程序能够访问 Mapbox 的地图服务。 下面详细解析 Mapbox GL 中 token 的使用&#xff0c…

了解RPC

本文来自智谱清言 --------- RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用位于远程计算机上的子程序或服务的技术。这种技术使得构建分布式计算变得更加容易,因为它提供了强大的远程调用能力,同时保持…

[react]不能将类型“string | undefined”分配给类型“To”。 不能将类型“undefined”分配给类型“To”

场景, 封装组件的时候, 想通过外部传进去一个路由地址, 再用<Link to{}>跳转, 显示这个, 有四种方法解决 第一种 合并运算符 ?? ?? 是 空值合并运算符&#xff08;Nullish Coalescing Operator&#xff09;&#xff0c;它是 JavaScript 和 TypeScript 中的一种逻辑…

Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VMI-FGSM介绍核心思想梯度方差定义算法流程 VMI-FGSM代码实现VMI-FGSM算法实现攻击效果 代码汇总vmifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构…

C#都可以找哪些工作?

在国内学习C#&#xff0c;可以找的工作主要是以下4个&#xff1a; 1、游戏开发 需要学习C#编程、Unity引擎操作、游戏设计和3D图形处理等。 2、PC桌面应用开发 需要学习C#编程、WinForm框架/WPF框架、MVVM设计模式和UI/UX设计等。 3、Web开发 需要学习C#编程、ASP.NET框架…

使用Java构建高性能微服务架构

微服务架构&#xff08;Microservices Architecture&#xff09;是一种广泛采用的软件设计模式&#xff0c;用于构建模块化、高可扩展性的系统。Java&#xff0c;作为企业开发的主力语言&#xff0c;拥有丰富的生态系统和框架支持&#xff0c;是构建微服务的理想选择。本文将探…

计算机组成原理的学习笔记(5)--数据的表示与运算·其四 浮点数的储存和加减/内存对齐/大端小端

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记&#xff0c;仅用于学习交流。 1. 浮点数的表示与运算 规格化数&#xff1a; 浮点数的存储格式为 &#xff0c;其中&#xff1a; 为符号位。 为尾数&#xff0c;通常在0和1之间&#xff08;规格化形式为1.xx…