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

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

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

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

一、pandas常用函数

(1)drop()

函数语法:

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行索引。

函数语法

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

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

保留到小数点后两位

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附近时,代表多空力量均衡。

RSI策略的vectorbt实现方法

第一步:RSI.run()

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

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

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

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

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

#下穿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()】

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

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

该函数的参数详情如下:

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
)

第四步:查看回测结果

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

第五步:画图

pf.plot().show()

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

完整代码

import vectorbt as vbt
import pandas as pdpd=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.mzph.cn/pingmian/64814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地摄像头视频流在html中打开

1.准备ffmpeg 和(rtsp-simple-server srs搭建流媒体服务器)视频服务器. 2.解压视频流服务器修改配置文件mediamtx.yml ,hlsAlwaysRemux: yes 3.双击运行服务器。 4,安装ffmpeg ,添加到环境变量。 5.查询本机设备列表 ffmpeg -list_devices true -f dshow -i d…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

设计模式の享元模板代理模式

文章目录 前言一、享元模式二、模板方法模式三、代理模式3.1、静态代理3.2、JDK动态代理3.3、Cglib动态代理3.4、小结 前言 本篇是关于设计模式中享元模式、模板模式、以及代理模式的学习笔记。 一、享元模式 享元模式是一种结构型设计模式,目的是为了相似对象的复用…

flink实现复杂kafka数据读取

接上文:一文说清flink从编码到部署上线 环境说明:MySQL:5.7;flink:1.14.0;hadoop:3.0.0;操作系统:CentOS 7.6;JDK:1.8.0_401。 常见的文章中&…

越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高

《港湾商业观察》施子夫 12月13日,深圳市越疆科技股份有限公司(以下简称,越疆科技,02432.HK)发布全球发售公告,公司计划全球发售4000万股股份,其中3800万股国际发售,200万股香港公开…

datasets 笔记:加载数据集(基本操作)

参考了huggingface的教程 1 了解数据集基本信息( load_dataset_builder) 在下载数据集之前,通常先快速了解数据集的基本信息会很有帮助。数据集的信息存储在 DatasetInfo 中,可能包括数据集描述、特征和数据集大小等信息。&…

Java图片拼接

最近遇到一个挺离谱的功能,某个表单只让上传一张图,多图上传会使导出失败。跟开发沟通后表示,这个问题处理不了。我... 遂自己思考,能否以曲线救国的方式拯救一下,即不伤及代码之根本,又能解决燃眉之急。灵…

.NET重点

B/S C/S什么语言 B/S: 浏览器端:JavaScript,HTML,CSS 服务器端:ASP(.NET)PHP/JSP 优势:维护方便,易于升级和扩展 劣势:服务器负担沉重 C/S java/.NET/…

Linux——卷

Linux——卷 介绍 最近做的项目,涉及到对系统的一些维护,有些盘没有使用,需要创建逻辑盘并挂载到指定目录下。有些软件需要依赖空的逻辑盘(LVM)。 先简单介绍一下卷的一些概念,有分区、物理存储介质、物…

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)核心问题拆解 3. 实…

clickhouse-副本和分片

1、副本 1.1、概述 集群是副本和分片的基础,它将ClickHouse的服务拓扑由单节点延伸到多个节点,但它并不像Hadoop生态的某些系统那样,要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活,用户既可以将所有节点组成…

Redis 集群实操:强大的数据“分身术”

目录 Redis Cluster集群模式 1、介绍 2、架构设计 3、集群模式实操 4、故障转移 5、常用命令 Redis Cluster集群模式 1、介绍 redis3.0版本推出的Redis Cluster 集群模式,每个节点都可以保存数据和整个集群状态,每个节点都和其他所有节点连接。Cl…

C# 从控制台应用程序入门

总目录 前言 从创建并运行第一个控制台应用程序,快速入门C#。 一、新建一个控制台应用程序 控制台应用程序是C# 入门时,学习基础语法的最佳应用程序。 打开VS2022,选择【创建新项目】 搜索【控制台】,选择控制台应用(.NET Framew…

猫咪睡眠:萌态背后的奥秘与启示

猫咪的睡眠,犹如一本充满趣味与奥秘的小书,每一页都写满了它们独特的习性与本能。 猫咪堪称 “睡眠大师”,睡眠时间之长令人咋舌,一天中大约有 12 - 16 个小时在梦乡中度过,幼猫和老年猫甚至能睡更久。它们似乎深谙放…

基于前端技术UniApp和后端技术Node.js的电影购票系统

文章目录 摘要Abstruct第一章 绪论1.1 研究背景与意义1.2 国内外研究现状 第二章 需求分析2.1 功能需求分析2.2 非功能性需求分析 第二章系统设计3.1 系统架构设计3.1.1 总体架构3.1.2 技术选型 3.2 功能架构 第四章 系统实现4.1 用户端系统实现4.1.1 用户认证模块实现4.1.2 电…

用adb命令给APP做压力测试,有什么不同?

压力测试 app做压力测试目的是模拟用户在使用软件时随意向软件发出指令,例如操作app的点击,滑动,返回等一系列随机事件,来检测app的承受能力 第一步:手机安装包需要待测的app 第二步:输入adb start-ser…

2023年西南大学数学建模C题天气预报解题全过程文档及程序

2023年西南大学数学建模 C题 天气预报 原题再现: 天气现象与人类的生产生活、社会经济、军事活动等方方面面都密切相关,大到国家,小到个人,都受到极端天气的影响。2022年6月,全球陆地地区出现了自1850年代末人类有系…

Android 10 Launcher3 删除谷歌搜索

命令行获取页面 手机处于launcher首页 adb shell dumpsys window | findstr mCurrentFocus 输出 mCurrentFocusWindow{9afb34d u0 com.android.launcher3/com.android.launcher3.Launcher} 找到源码路径 packages/apps/Launcher3/ Android10源码 搜索控件 grep -r -n Apps…

LabVIEW机械故障诊断中的传感器选择

在机械设备故障诊断中,传感器是关键设备,用于采集设备运行状态的各种数据。常见的传感器类型和选择方法如下: 1. 振动传感器 用于检测设备运行中的振动特征,常见于旋转机械和轴承故障诊断。 加速度传感器:检测高频振…

JVM和数据库面试知识点

JVM内存结构 主要有几部分:堆、栈、方法区和程序计数器 堆是JVM中最大的一块内存区域,用于存储对象实例,一般通过new创建的对象都存放在堆中。堆被所有的线程共享,但是它的访问时线程不安全的,通常通过锁的机制来保证线…