首页 > 其他分享 >R语言量化交易RSI策略:使用支持向量机SVM|附代码数据

R语言量化交易RSI策略:使用支持向量机SVM|附代码数据

时间:2024-01-24 22:55:27浏览次数:37  
标签:语言 SVM 策略 50 交易 向量 RSI

原文链接:http://tecdat.cn/?p=19839

机器学习算法可用于找到最佳值来交易您的指标  点击文末“阅读原文”获取完整代码数据)。

相对强弱指标(RSI)是最常见的技术指标之一。它用于识别超卖和超买情况。传统上,交易者希望RSI值超过70代表超买市场状况,而低于30则代表超卖市场状况。但是,这些主张是否有效?为什么70,为什么30?此外,不同的趋势市场如何影响RSI信号?

在本文中,我们将使用一种功能强大的机器学习算法-支持向量机(SVM),在考虑到市场整体趋势的同时,探索您实际需要的RSI值。

首先,我们将简要概述SVM,然后根据算法发现的模式来构建和测试策略。

支持向量机

支持向量机基于其发现非线性模式的能力,是较流行且功能强大的机器学习算法之一。SVM通过找到一条称为“决策边界”或“超平面”的线来工作,该线可以根据类别(在我们的情况下为“看涨”或“看跌”)最好地分离数据。SVM的强大功能是可以使用一组称为“核”的数学函数将数据重新排列或映射到多维特征空间,在该空间中数据可以线性分离。

图片

然后,SVM在较高维度的空间中绘制一条线,以最大化两个类之间的距离。将新的数据点提供给SVM后,它会计算该点落在线的哪一边并进行预测。


点击标题查阅往期内容

图片

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC

左右滑动查看更多

01

02

03

04

SVM的另一个优点是,在可以使用它之前,必须选择的参数相对较少。首先,您必须选择用于将数据转换到更高维度空间的核或映射功能。径向基函数是一种流行的选择。接下来,您需要选择gamma参数。gamma确定单个训练示例可以对决策边界产生多少影响。较低的值表示单个点将对画线的位置产生较大的影响,而较高的值表示每个点将仅对较小的影响。将gamma参数选择为模型输入数量(1 /(输入数量))是一个经验法则。最后,您需要选择正则化参数C。C确定了训练集中分类错误的示例与决策边界的简单性之间的权衡。低C会创建更平滑的决策边界并减少过度拟合,而高C会尝试正确分类训练集中的每个数据点,并可能导致过度拟合。我们希望减少模型的过拟合量,因此我们将选择一个值1。

现在,我们对支持向量机的工作原理以及如何选择其参数有了基本的了解,让我们看看是否可以使用它来计算如何交易RSI。

交易RSI

相对强弱指标(RSI)将“上涨”移动的平均大小与“下跌”移动的平均大小进行比较,并将其归一化为0到100。传统的逻辑是,一旦股价有更多的,显着的上升趋势,它已经变得超买或被高估,并且价格可能会下降。超买通常由RSI值超过70来确定,相反的情况表示RSI值为30时出现超卖或低估。

在强劲的上升趋势中,RSI值超过70可能表示趋势的延续,而在下降趋势期间的RSI值70可能意味着一个很好的切入点。问题是要找出要考虑这两个因素的确切条件。

我们可以收集成千上万个数据点,然后尝试自己找到这些关系,也可以使用支持向量机为我们完成工作。

让我们看看我们可以使用AUD / USD 每小时数据将开盘价与50期简单移动平均线(SMA)比较,从而在3期RSI中找到模式并定义趋势。

加载历史价格。

   
#*****************************************************************

# 载入历史数据

#****************************************************************** 




AUDUSD = read.xts('AUDUSD.csv', 

format='%m/%d/%y %H:%M', index.class = c("POSIXlt", "POSIXt"))

建立模型

使用R建立我们的模型,分析它能够找到的模式,然后进行测试以查看这些模式在实际的交易策略中是否成立。

创建指标并训练SVM:

   
#*****************************************************************

# 代码策略

#****************************************************************** 

load.packages('e1071,ggplot2')



indicators = as.xts(list(

RSI3 = RSI(Cl(AUDUSD), 3),



SMA50 = SMA(Op(data$AUDUSD), 50)





# 删除缺失

DataSet = DataSet[-(1:49),]



#将数据分为60%的训练集以构建模型,20%的测试集以测试我们发现的模型,以及20%的验证集将我们的策略应用于新的数据

Training = DataSet[1:4528,]





#使用径向基函数作为核,将成本或C设置为1,构建支持向量机



svm(

 data=Training, 

kernel="radial",

cost=1,gamma=1/2)



#在训练集中再次运行算法以可视化找到的模型

predict(SVM,Training,type="class")





# 绘图

ggplot(TrainingData, aes(x=Trend,y=RSI3))

图片

我们可以看到算法在三个不同的区域预测空头,而在中间的一个区域预测多头。

让我们进一步探索。

多头

空头

RSI低于25,价格比SMA 50低20(准确度为56%,交易36次)

RSI小于25,且价格比SMA 50低10至5个点(准确度为54%,交易81次)

RSI3在50到75之间,价格比SMA 50高5到10个点之间(准确度为58%,交易104)

RSI大于70,价格比SMA 50低5个点以上(准确度为59%,交易37次)

RSI大于75,价格比SMA 50高出15个点(准确度为59%,交易34次)

首先是左下角区域。在这里,价格刚刚跌破50期SMA,RSI跌破25,表明跌势突破。

但是,如果价格跌破50周期SMA下方20个点,而RSI仍低于25点,则该算法会发现有较强的信号可以转换为均值,并预测多头交易。

接下来,图左上方的短暂机会代表了RSI的传统观点。我们希望RSI超过70,而价格比50周期均线高出15点以上,以表示“超买”情况,这表明我们做空了。

左上方的区域有些不同。当价格刚刚跌破50期SMA以下且RSI超过70时,它发现了一个短暂的机会。这与第一种情况相似,但我们正在寻找看跌突破进入信号,而不是传统的“超买”条件。

最终,存在一个区域的RSI在50到75之间,而价格已经超过了50期均线,该算法发现了强烈的买入信号。

现在,我们找到了SVM发现的一组基本规则,让我们测试一下它们对新数据(测试集)的支持程度。

   
# 我们找到了SVM发现的一组基本规则,测试一下它们在新数据(测试集)的正确程度。# 模式在测试集中的表现: sum(ShortTrades$Direction == -1)/nrow(ShortTrades)*100

[1] 57.82313

   
sum(LongTrades$Direction ==1)/nrow(LongTrades)*100

[1] 57.14286

我们的空头交易为58%(147笔交易中的85笔正确),而我们的多头交易为57%(140笔交易中的80笔正确)。

使用支持向量机(一种功能强大的机器学习算法),我们不仅能够了解RSI的传统知识在什么条件下成立,而且还能够创建可靠的交易策略。

此过程称为从机器学习算法中得出规则,使您可以结合自己的交易经验来使用机器学习算法。


图片

点击文末 “阅读原文”

获取全文完整资料。

本文选自《R语言量化交易RSI策略:使用支持向量机SVM》。

点击标题查阅往期内容

Python配对交易策略统计套利量化交易分析股票市场
R语言资产配置策略量化模型:改进的移动平均线策略动态回测
R语言量化:合成波动率指数移动平均策略分析标准普尔500波动率指数(VIX)
R语言改进的股票配对交易策略分析SPY-TLT组合和中国股市投资组合
R语言量化交易RSI策略:使用支持向量机SVM
使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略
R语言量化交易RSI策略:使用支持向量机SVM
R语言资产配置: 季度战术资产配置策略研究
R语言动量交易策略分析调整后的数据
TMA三均线股票期货高频交易策略的R语言实现
R语言时间序列:ARIMA / GARCH模型的交易策略在外汇市场预测应用
R语言基于Garch波动率预测的区制转移交易策略
r语言多均线股票价格量化策略回测
使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略
Python基于粒子群优化的投资组合优化研究
R语言Fama-French三因子模型实际应用:优化投资组合
R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现
Python计算股票投资组合的风险价值(VaR)
R语言Markowitz马克维茨投资组合理论分析和可视化
R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口

标签:语言,SVM,策略,50,交易,向量,RSI
From: https://www.cnblogs.com/tecdat/p/17986047

相关文章

  • 【模板】多项式半家桶 version 2
    #include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,##__VA_ARGS__)#else#defineendl"\n"#definedebug(...)void(0)#endiftypedeflonglongLL;template<unsignedumod>structmodint{......
  • 【Azure Compute Gallery】使用 Python 代码从 Azure Compute Gallery 复制 Image-Ver
    问题描述AzureComputeGallery可以帮助围绕Azure资源(例如映像和应用程序)生成结构和组织,并且支持全局复制。如果想通过Python代码实现Image-Version从一个AzureComputeGallery复制到另一个中,如何实现呢? 问题解答示例Python代码:importosfrommsrestazure.azure_cloudimpor......
  • 【Azure Compute Gallery】使用 Python 代码从 Azure Compute Gallery 复制 Image-Ver
    问题描述AzureComputeGallery可以帮助围绕Azure资源(例如映像和应用程序)生成结构和组织,并且支持全局复制。如果想通过Python代码实现Image-Version从一个AzureComputeGallery复制到另一个中,如何实现呢? 问题解答示例Python代码:importosfrommsrestazure.azure_cl......
  • F1. Smooth Sailing (Easy Version)
    F1.SmoothSailing(EasyVersion)Theonlydifferencebetweenthetwoversionsofthisproblemistheconstrainton$q$.Youcanmakehacksonlyifbothversionsoftheproblemaresolved.Thomasissailingaroundanislandsurroundedbytheocean.Theoc......
  • Find min and max element in bst using recursion【1月23日学习笔记】
    点击查看代码#include<iostream>usingnamespacestd;structNode{intdata;Node*left,*right;};Node*newNode(intx){Node*temp=newNode;temp->data=x;temp->left=temp->right=NULL;returntemp;}voidin......
  • Inplementation of Binary Search Tree using recursion-local version 3【1月23日学
    点击查看代码#include<iostream>usingnamespacestd;structNode{intdata;Node*left,*right;//注意声明格式};Node*newNode(intx){Node*temp=newNode;temp->data=x;temp->left=temp->right=NULL;returntemp;}......
  • Inplementation of Binary Search Tree using iteration-local version 2【1月23日学
    点击查看代码#include<iostream>usingnamespacestd;structNode{intdata;Node*left;Node*right;};Node*newNode(intx){Node*temp=newNode;temp->data=x;temp->left=temp->right=nullptr;returntemp......
  • libm.so.6: version `GLIBC_2.29' not found
    基础GLIBC是Linux系统中最底层的API,最主要的功能是对系统调用进行了封装,几乎其他任何的运行库都要依赖glibc。因此,切勿擅自通过编译的方式升级,容易将系统搞坏。升级glibc主要是对/lib库中的libc.so.6,libm.so.6,libpthread.so.0和librt.so.1这四个文件的修改[root@taishan-atlas......
  • 火山引擎ByteHouse:“专用向量数据库”与“数据库+向量扩展”,怎么选?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群背景随着LLM(LargeLanguageModel)的不断发展,向量检索也逐渐成为关注的焦点。LLM通过处理大量的文本数据,获取丰富的语义信息,从而能够更好地理解和生成自然语言。然而,LLM的输出通常是一系列概......
  • 0ptimizing tail recursion
    尾递归(TailRecursion)是一种特殊形式的递归,其特点是递归调用是函数的最后一个操作。在尾递归中,递归调用的返回值不需要进行额外的操作,而是直接返回给调用者。这种特殊的结构使得编译器有机会对递归调用进行优化,称为尾递归优化。尾递归函数的特征是,在递归调用中,没有后续的计算步骤......