利用R语言编写量化投资策略
基于R语言的均线量化策略分析
基于R语言的均线量化策略分析作者:屈长杰来源:《经营者》2016年第16期摘要随着IT技术的不断进步,基于新型电子化交易的量化投资也得到了飞速发展,计算机科学和股票技术分析的大力发展和融合,使开源的R语言集成了多种数据分析与可视化算法,具备良好的可扩展性,适用于策略分析及数量化分析。
本文根据上海医药历史数据,研究了买卖信号突破日期及买卖执行期,测算了10日简单移动平均线下交易策略的累计收益率及买卖点获胜率,并通过比较得出,以R语言为工具的移动平均线策略具有较高的收益率,得到了可供实际股票操作的R语言控制模型,为股票分析提供了技术参考。
关键词 R语言移动平均线收益率量化分析一、引言技术分析在股票市场的投资中被广泛应用,其中,均线系统分析是实践中最常采用的也是准确率最高的技术评价体系。
R语言具有灵活性、开放性,而它最具魅力的地方在于其自带了多种统计学及数字分析功能。
移动平均线具有滞后性。
对于短期投资者来说,能否提前预测到平均线的走势,进而判断股价的买卖点,意义就显得尤为重要。
因此,本文在寻找上海医药的买卖点时,借助R语言强大的预测统计功能,将均线策略与其结合,从而达到提前预测及稳定获利的目标。
二、R语言介绍R语言是由新西兰奥克兰大学的Ross Ihaka与Robert Gentlemen一起开发的面向对象的编程语言。
R语具有一套完整的数据处理、计算和制图软件系统,同时它是一个开源软件,它的主程序小巧,有着丰富的数据包。
正是因为拥有这些特征,使得R语言在金融量化投资领域应用广泛,并且具有良好的预测功能。
本文以R语言为工具,对上海医药股价进行以均线系统为策略的量化投资分析。
三、R语言策略模型R语言要实现均线策略,首先需要提取数据,再将其转换为时间序列,接着进行平稳性检验、白噪声检验,当序列满足平稳性且自相关条件时,方可进行策略建模,直到策略实现。
四、均线系统策略实现第一,本文主要利用简单移动平均线对上海医药的股价进行预测分析,在此之前,对相关概念做一个简要的介绍。
基于R语言的主成分分析在股票市场中的应用
基于R语言的主成分分析在股票市场中的应用主成分分析(Principal Component Analysis,简称PCA)是一种常用的多元数据降维技术,通过将多个相关变量线性组合成一组新的综合变量(主成分),从而降低数据的维度,保留原始数据的主要信息。
在股票市场中,主成分分析可以帮助投资者从大量的基本数据中提取关键信息,辅助判断股票市场的走势和投资决策。
主成分分析在股票市场中的应用主要包括以下几个方面:1. 股票组合构建:主成分分析可以通过对大量的股票基本数据进行降维处理,提取和归纳出代表股票市场整体的主要因子,从而构建股票组合。
通过选取股票组合中的主要成分股,投资者可以降低组合风险,并且在市场上实现更好的收益。
2. 股票市场预测:主成分分析可以通过对历史股票市场数据进行降维处理,提取股票市场的主要变化模式。
基于这些主要变化模式,可以构建预测模型,辅助投资者预测未来市场的走势。
例如,可以通过分析股票市场的主要成分来预测股票指数的涨跌情况。
3. 投资组合优化:主成分分析还可以用于优化投资组合。
通过对多个相关变量进行降维处理,构建出代表投资组合风险和回报的主成分。
然后,可以通过调整主成分的权重,优化投资组合的风险回报比。
这样,投资者可以根据个人的风险偏好和投资目标,选择合适的投资组合。
4. 行业分析:主成分分析可以帮助投资者对不同行业的相关性进行分析。
通过将不同股票行业的基本数据进行降维处理,可以提取出各个行业的主要因子。
通过对这些主要因子的比较和分析,投资者可以了解各个行业的发展趋势和相互关系,从而进行行业配置和选择。
5. 风险控制:主成分分析可以帮助投资者有效地进行风险控制。
通过对多个相关变量进行降维处理,可以提取出代表风险的主要成分。
通过对主要成分的分析和监控,投资者可以及时发现和控制投资组合的风险,避免出现大幅度的损失。
总结来说,基于R语言的主成分分析在股票市场中的应用非常广泛。
它可以帮助投资者从大量数据中提取关键信息,辅助预测市场走势、优化投资组合、进行行业分析和风险控制。
利用R语言编写量化投资策略
利用R语言编写量化投资策略量化投资是利用计算机算法和数据分析方法进行投资决策的一种投资策略。
R语言是一种功能强大的数据分析和统计编程语言,广泛应用于量化投资领域。
在本文中,我们将探讨如何利用R语言编写量化投资策略。
首先,量化投资策略的核心是数据分析和模型建立。
R语言提供了丰富的数据处理和统计函数,可以帮助我们在量化投资过程中进行数据分析。
例如,我们可以使用R语言读取金融市场的历史价格数据,并进行数据清洗和处理,以便后续的模型建立和分析。
在量化投资中,常用的模型包括趋势跟踪模型、均值回归模型、套利模型等。
趋势跟踪模型用于捕捉市场价格的上升或下降趋势,均值回归模型用于利用价格的波动来获取投资机会,套利模型则利用市场价格的不一致性来获取收益。
在R语言中,我们可以使用统计分析的方法和包括quantmod、TTR等量化投资专用的R包来实现这些模型。
接下来,我们需要将模型应用到实际的交易策略中。
在R语言中,我们可以利用R语言提供的量化交易框架进行交易策略的编写和回测。
量化交易框架提供了一种简单便捷的方式来模拟投资策略在实际交易过程中的表现,并进行回测和优化。
在编写量化交易策略时,我们可以利用R语言的条件语句、循环、函数等编程特性来实现策略的具体逻辑。
例如,我们可以根据其中一种技术指标的信号进行买入或卖出决策,同时可以设置止损和止盈条件来管理风险。
除了交易策略的编写,R语言还提供了丰富的可视化功能,可以帮助我们对策略的性能进行分析和评估。
我们可以利用R语言的绘图函数来画出策略的资金曲线、收益率分布图等,以便更全面地了解策略的表现。
最后,在实际的量化投资过程中,数据的质量和实时性是关键因素。
R语言提供了许多功能强大的数据源接口,如quantmod包可以直接从雅虎财经、谷歌财经等获取金融数据,以保证我们在建立模型和进行交易策略时使用的数据的准确性和实时性。
综上所述,利用R语言编写量化投资策略是一种强大的工具。
R语言提供了丰富的数据分析和统计函数、量化交易框架、可视化功能以及强大的数据源接口,可以帮助我们实现量化投资策略的建立、回测和优化,最大限度地提高投资效益。
(整理)量化投资-R语言-TTR包-CMF佳庆资金流量指标-王樱洁、云金杞
佳庆资金流量指标Chaikin Money Flow(CMF)由Marc Chaikin发明,用图表来将买家的购买力和卖家的抛售力度形象化。
如果收盘价位于日最高价与最低价之间上半部分,且成交量放大,那么该指标将会是正值,表示该证券处于强势之中;如果收盘价位于日最高价与最低价之间下半部分,且成交量放大,那么该指标将会是负值,表示该证券处于弱势之中
函数定义:
CMF(HLC, volume, n = 20)
参数列表:
HLC:时间序列或矩阵,包含最高价-最低价-收盘价
volume:成交量
n:期限数量
举例:
获得上证指数今年以来的数据,并画出CMF。
getSymbols("^SSEC")
chartSeries(SSEC, TA = "addCMF ()", subset = "2015", theme=chartTheme('white'))
图5-7 CMF佳庆资金流量指标
表5-1 34种函数
注:这是一本即将出版的量化投资与R语言的书,现在免费分享一些章节,供大家学习。
作者:王樱洁、云金杞
王樱洁:
新浪微博:
/u/3029097837
二维码:
云金杞:
新浪微博:
/gudingshouyizhuanjia/home?topnav=1&wvr=6
二维码:
公众平台:
量化投资以VBA和R和Python等为工具
二维码:
欢迎关注作者的微信和我们的公众号,新书发布,我们将在公众号和微博第一时间分享给大家。
基于R语言的个股交易策略探析——移动平均趋势
基于R语言的个股交易策略探析——移动平均趋势基于R语言的个股交易策略探析——移动平均趋势摘要:移动平均趋势是一种常见的股票交易策略,该策略基于计算股票价格的移动平均值,并根据移动平均线的走势进行买卖决策。
本文将使用R语言编写移动平均趋势交易策略,并在真实股票数据上进行模拟回测,分析其盈利性与稳定性。
研究结果表明,该策略在特定市场条件下具有一定的盈利潜力,但需要结合其他分析指标和风险管理方法进行进一步优化和控制。
第一章引言1.1 选题背景在股票交易领域,寻找有效的交易策略对于投资者的盈利至关重要。
移动平均趋势作为一种简单有效的技术分析工具,被广泛应用于量化交易中。
然而,是否可以通过基于R语言编写的移动平均趋势交易策略在实际股票市场中获取超额收益,以及该策略的稳定性如何,需要进行探索和分析。
1.2 研究目的本文的研究目的是通过使用R语言编写移动平均趋势交易策略,并在真实股票数据上进行模拟回测,从而分析该策略的盈利潜力与稳定性。
通过研究目的的实现,我们可以评估移动平均趋势策略在实际交易中的应用价值,并为投资者提供参考。
第二章移动平均趋势策略原理2.1 移动平均线移动平均线是一个技术指标,用于平滑股票价格的波动,并提供更直观的价格走势。
常用的移动平均线包括简单移动平均线(SMA)和指数移动平均线(EMA)。
简单移动平均线是对一段时间内的股票价格进行简单均值计算,而指数移动平均线则赋予最近的价格更大的权重。
2.2 交叉信号移动平均线之间的交叉现象被认为是移动平均趋势策略的买卖信号。
如果短期移动平均线从下方穿过长期移动平均线,被称为“黄金交叉”,意味着买入信号;相反,如果短期移动平均线从上方穿过长期移动平均线,被称为“死亡交叉”,意味着卖出信号。
第三章 R语言实现移动平均趋势策略本章将介绍如何使用R语言编写移动平均趋势策略,并以真实股票数据进行模拟回测。
3.1 数据准备通过R语言的Quantmod包,我们可以获取真实股票数据,并进行预处理和准备,包括价格数据的下载、数据清洗和数据分割等。
(原创)为什么要用R语言做量化投资--云金杞
为什么要用R语言做量化投资?
可能你想说:“我已经学会了spss/sas/stata/matlab等软件,尤其是现在很多人主要用matlab做量化投资,我为什么要学习R呢?”
想要成为一名优秀的宽客,你不得不学R语言的理由:
①R语言功能强大:R语言通过不断增加的R包,几乎能够实现matlab 等软件的各种功能。
用一句有点夸大的话:只要你能想到,R语言都能实现。
大部分你想要实现的功能,已经有人实现,并通过R包分享出来了,你只需要通过“拿来主义”就可以了。
②R是免费开源软件:相对于matlab这些分析软件,R语言免费开源的特点,注定了R是会在未来流行的一个量化投资界的主要工具。
③R语言入门简单:R语言并不需要掌握复杂的编程知识,相对于matlab 来说,入门比较容易。
④R有专门的量化投资包:R语言有专门的用于量化投资的R包,能够满足使用者进行量化投资需要。
⑤R语言有强大的帮助系统:通过R语言的帮助系统,能够使得使用者很快学会用R语言进行数学计算、统计分析、量化投资等工作。
⑥R语言强大的数据处理能力:R语言具有强大的数据获取,处理,保存机制,简单高效的建模能力等。
R语言非常受到专业人士欢迎,根据对数据挖掘大赛胜出者的调查可以发现,他们用的工具基本上都是R语言。
此外,从最近几次R语言大会上可以了解到,咨询业、金融业、医药业都在大量的使用R语言,包括google和facebook 的大公司都在用它。
未来的世界,R语言一定会叱咤风云。
你准备好了吗?。
library(fgarch) 用法
在R语言中,library(fgarch)是一个用于金融时间序列分析的包。
它提供了对金融数据建模所需的各种功能,包括波动率建模、风险管理和金融衍生品定价。
在本文中,我们将深入探讨library(fgarch)的用法和功能,以便读者能更全面地了解如何在R语言中应用这个强大的工具来进行金融数据分析。
1. 安装和加载library(fgarch)我们需要确保已经安装了library(fgarch)包。
在R语言中,可以使用install.packages("fgarch")命令来安装该包。
安装完成后,我们可以使用library("fgarch")命令来加载这个包。
接下来,我们就可以开始使用library(fgarch)来进行金融时间序列分析了。
2. 建立波动率模型使用library(fgarch),我们可以建立各种波动率模型,包括GARCH、EGARCH和APARCH等。
可以使用garchFit()函数来拟合GARCH模型,并使用garchForecast()函数来预测波动率。
通过这些函数,我们可以对金融市场的波动性进行准确的建模和预测,从而帮助我们进行风险管理和资产定价。
3. 应用于金融衍生品定价除了波动率建模,library(fgarch)还可以被应用于金融衍生品的定价。
可以使用函数garchCall()和garchPut()来计算期权的价格,这对于金融衍生品交易者和风险管理者来说是非常重要的。
我们也可以利用这些函数来进行期权的风险敞口分析,以便更好地理解和管理市场风险。
4. 个人观点和总结总体来说,library(fgarch)提供了丰富的功能和工具,帮助我们在R语言中进行金融时间序列分析。
它不仅可以用于波动率建模和预测,还可以应用于金融衍生品的定价和风险管理。
通过深入了解和灵活运用library(fgarch),我们可以更好地理解金融市场的波动性,并更好地管理和定价金融资产。
利用R语言编写量化投资策略
利用R语言编写量化投资策略选取一股票,利用R语言进行分析,同时构建通道突破,双均线交叉和MACD策略,进行回测。
library(xts)library(xtsExtra)library(quantmod)library(FinTS)library(forecast)library(TSA)library(TTR)library(fGarch)library(rugarch)library(tseries)setSymbolLookup(MHXX=list(name='0696。
hk',src='yahoo’))getSymbols("MHXX”,from=”2013—01—01”,to=”2015—09—30")#显示K线图,如图明显发现股价呈现递增趋势,价格序列是非平稳的. chartSeries(MHXX)#考虑对数收益率#获取收盘价cp = MHXX[,4]lgcp=log(MHXX[,4])#tdx =c(1:456)/365+2014#计算日收益率ret=dailyReturn(MHXX)chartSeries(ret,theme=”white",TA=NULL)#plot(tdx,cp,xlab="year”,ylab=”close price”,type=’l')#计算对数收益率,如图课件,股价在15年左右有一个跳跃,15年第二季度的股价增长导致#之后股价有较大的下降,这些特征给后续的分析带来一些较大的异常值lgret = log(ret+1)chartSeries(lgret,theme="white”,TA=NULL)#由ACF和PACF图可以看出,该股1股价的日收益率序列即使存在某种相关性,该自相关性也#很小par(mfcol=c(2,1))acf(lgret,lag=30)pacf(lgret,lag=30)#为了验证该收益率序列有没有序列相关性,使用Ljung—Box检验,结果对应的P值0。
用R语言做量化分析
43
参考资料
R的极客理想系统列文章 (http://blog.fens.me/series-r/) 用IT技术玩金融系列文章 (http://blog.fens.me/series-it-finance/) R 语 言 为 量 化 而 生 (http://blog.fens.me/r-finance/) R语言量化投 资常用包总结 (http://blog.fens.me/r-quant-packages/) R语言时间序列基础库zoo (http://blog.fens.me/r-zoo/) 可扩展的时间序列xts (http://blog.fens.me/r-xts/) 超高性能数据处理包data.table (http://blog.fens.me/r-data-table/) 掌握R语言中的apply函数族 (http://blog.fens.me/r-apply/) R语言解读一元线性回归模型 (http://blog.fens.me/r-linear-regression) R语言解读多元线性回归模型 (http://blog.fens.me/r-multi-linear-regression) R语言解读自回归模型 (http://blog.fens.me/r-ar)
8
1.2 金融数据
• 金融行业本身就是玩数据的行业。金融量化上,我们会有各种 数据处理的需求。 • 技术指标,计算某个金融产品的5日移动平均线。
9
1.2 上证综指数据集
• 上证综指数据集包括2列,时间序列索引列和每日收盘价,已存 储在SSE 变量中。
10
1.2 技术指标计算
• 计算5日平均线,10日平均线,合并到数据框
44
14
1.4 R语言易学易上手
Wind量化平台-用户手册(R语言)
——中国金融数据及工具首席服务商9311509Wind R数据及交易接口Version 1.1修订时间:2014.02.12上海万得信息技术股份有限公司Shanghai Wind Information Co., Ltd.地址上海浦东新区福山路33号建工大厦9楼邮编Zip 200120电话Tel (8621)6888 2280传真Fax (8621)6888 2281主页 版本历史目录1WINDR接口说明 (1)1.1W IND R接口概述 (1)1.2W IND R接口安装 (1)1.2.1WindR对系统环境要求 (1)1.2.2R环境安装 (2)1.2.3正常WindR接口安装 (1)1.2.4特殊安装WindR方式 (3)1.3W IND R接口向导界面 (3)1.4W IND R获取帮助途径 (5)1.4.1本用户手册 (5)1.4.2R里面的帮助文档 (5)1.4.3量化交易群和R语言交流群 (7)1.5W IND R接口相关规范 (1)1.5.1命令区分大小写,且“w.”不能省略 (1)1.5.2单字节码和双字节码的问题 (1)1.5.3品种、指标、参数等引号内的部分不区分大小写 (1)1.5.4参数支持数组输入 (1)1.5.5时间、日期支持R语言的时间、日期格式 (2)1.5.6参数中有缺省值的可以不用输入 (2)1.5.7可以带参数名输入 (2)1.5.8Showblank参数 (2)1.5.9交易接口中Showfields参数 (3)1.5.10ErrorCode定义 (3)2WIND R插件命令说明 (6)2.1LIBRARY(W IND R):装载W IND R包 (6)2.2?W IND R:启动W IND R帮助文档 (6)2.3W.START:启动W IND R (6)2.4W.STOP:停止W IND R (7)2.5W.MENU:显示导航界面 (7)2.6W.ISCONNECTED:判断是否已经登录 (8)2.7W.CANCEL R EQUEST:取消订阅 (8)2.8W.AS D ATE T IME:把数字化时间格式转换成R语言时间格式 (9)2.9W.WSD:获取历史序列数据 (9)2.10W.WSI:获取分钟数据 (10)2.11W.WST:获取日内TICK级别数据 (11)2.12W.WSS:获历史截面数据 (12)2.13W.WSQ:获取和订阅实时行情数据 (13)2.14W.WSET:获取板块、指数等成分数据 (14)2.15W.WEQS:获取条件选股结果 (15)2.16W.WPF:获取资产管理、组合管理数据 (15)2.17交易相关函数 (1)2.17.1w.tlogon交易登录 (1)2.17.2w.tlogout交易登出 (1)2.17.3w.torder委托下单 (2)2.17.4w.tcancel撤销委托 (3)2.17.5w.tquery交易查询 (4)2.18W.TDAYS, W.TDAYSOFFSET,W.TDAYSCOUNT:日期函数 (5)2.18.1w.tdays:返回区间内的日期序列 (5)2.18.2w. tdaysoffset:返回某个偏移值对应的日期 (6)2.18.3w. tdayscount:返回某个区间内日期数量 (6)3WINR插件函数体说明 (8)3.1日期序列(WSD) (8)3.2历史截面数据(WSS) (10)3.3分钟序列(WSI) (10)3.4日内跳价(WST) (11)3.5实时数据(WSQ) (12)3.6数据集(WSET) (13)3.7条件选股(WEQS) (13)3.8资管函数(WPF) (13)3.9组合上传函数(WUPF) (15)3.10交易函数 (17)3.10.1登录(tlogon) (17)3.10.2登出(tlogout) (18)3.10.3下单(torder) (18)3.10.4撤单(tcancel) (20)3.10.5查询(tquery) (20)3.11日期函数 (22)3.11.1特定交易日(TDAYS) (22)3.11.2日期偏移函数(TDAYSOFFSET) (23)3.11.3交易日统计(TDAYSCOUNT) (23)3.12日期宏 (24)3.12.1通用日期宏 (24)3.12.2特殊日期宏 (25)4WINDR应用案例 (26)4.1提取数据 (26)4.1.1提取历史交易报价 (26)4.1.2提取分钟序列数据 (26)4.1.3提取盘口买卖盘数据 (27)4.1.4提取截面数据 (27)4.1.5提取实时行情数据 (27)4.1.6提取财务数据 (28)4.1.7提取债券估值数据 (28)4.1.8提取数据集 (28)4.1.9提取资管报表数据 (30)4.1.10提取交易日期 (30)4.2读取股票日K线价格并绘制价格图 (30)4.3D EMO程序介绍 (31)4.3.1wsd_quant_demo (31)4.3.2wsi_demo (32)4.3.3wst_demo (33)4.3.4wsq_demo (34)5常见问题 (38)5.1安装及注册 (38)5.2读取指标数据 (38)5.3交易接口查询返回的数据字段 (41)5.3.1资金查询返回消息 (41)5.3.2持仓查询返回消息 (43)5.3.3当日委托查询返回消息 (44)5.3.4当日成交查询返回消息 (46)5.3.5营业部查询返回消息 (47)5.3.6股东查询返回消息 (48)5.3.7券商(期货商)信息返回 (48)5.3.8已登录账户信息返回 (48)1WindR接口说明1.1WindR接口概述大数据时代已经来临!为满足我们用户在构建模型,量化研究中对大数据量的渴求,Wind资讯将陆续推出一整套数据接口。
用 R 语言进行高级量化投资
II
波动率对冲策略
III
有量化经验的用户实现:量邦天语与R
IV
无经验的普通用户实现:微量网
量邦天语
• 天语是证券期货交易的“量语者”,致力于解决程序化交易投资者关心的最核心问
题,比如高质量数据、便捷式研究、无中转快捷交易等
★ 天语开发过程中,对国内外程序化交易系统进行了大量调研,立足程序化交易的经 典技术,积极融合各种最新技术 ★ 天语作为互联网时代的程序化交易平台,视每一个用户为天语产品的共同缔造者, 在不断收集用户体验反馈的基础上,最求最极致的用户体验
R engine
Interface
.NET环境
信号处理模块
• • • R(D)COM:DCOM组件; statconnDCOM: R(D)COM的后继版本; :开源;
研究评测模块
交易风控模块
天语与R
应用实例
1) 数据实时“流入”; 2) 触发策略代码;
myStrategy.R
50ETF
期权策略
波动率对冲策略 • 波动率策略中,不同CTA策略持仓权重对应的表现
波动率对冲策略 • 波动率对冲方案:dollar neutral(CTA策略权重:25%) • 夏普比:6.34(CTA夏普比:4.33;期权策略夏普比:4.47)
波动率对冲策略表现
1.6 1.5 1.4 1.3 1.2 1.1 1 0.9 0.8 0.7 20150209 20150216 20150302 20150309 20150316 20150323 20150330
★ 天语是程序化交易者的发烧级装备!
• 安全高,策略本地运行,信 号无中转 • 速度快,极速交易 • 方便用,一件补仓 • 容量大,数百策略同时运行 • 全自动,7*24小时自动交易
张丹老师—用R语言进行投资组合管理
8
问题
• 有没有 收益最大、风险最小 的投资组合?
9
最优组合
• X轴为风险 • Y轴为收益率 • 灰色区域为可投资区域 • 黑色线为最优投资组合
• C为无风险资产 • r0为无风险收益率
计算投资组合的风险 βc = wa * βa + wb * βb 投资组合包括无风险资产与2种风险资产时 rc = (1-wa-wb)*rf + wa*ra + wb*rb rc-rf = wa*(ra-rf)+wb*(rb-rf) 预期收益率 E(rc-rf) = wa[E(ra)-rf] + wb*[E(rb)-rf] = (wa * βa + wb * βb)[E(rm) - rf] (w为权重)
目录
• 故事开始 • 资本市场线
• 资本资产定价模型
• Beta VS Alpha • 用R构建投资组合模型 • 总结
22
beta
• β反映了单个证券与整体市场组合的联动性。
• β>1,攻击性,市场上升时涨幅大。
• β<1,防御性,市场下跌时跌幅小。 • β=1,中立性,与市场波动一致。
23
alpha
• B,M为风险资产 • CM的切线与黑色线相切
10
资本市场线(CML)
• X轴为风险 • Y轴为收益率 • 灰色区域为可投资区域 • 黑色线为最优投资组合
• C为无风险资产 • r0为无风险收益率
• M为风险组合 • CM为资本市场线
11
投资组合构建
R语言量化投资数据分析应用
R语言量化投资数据分析应用追涨杀跌 - 模型实现主讲:张丹目录1.什么是追涨杀跌?2.追涨杀跌的建型和实现3.模型优化什么是追涨杀跌法?•追涨杀跌法,是股市操作的一个重要技巧,就是在股市上涨时买入股票,股市下跌时卖出股票。
如果操作得当是很好的赢利手段。
追涨杀跌的原理•追涨杀跌:金融市场专业术语,金融技术派操盘的一种方式。
•操作方法:•金融产品价格上涨的时候买入,以期待涨得更多,然后以更高的价格卖出获利。
•金融产品价格下跌的时候卖出进行止损,不管当初股票买入的价格是多少,都立刻卖出,以求避免更大的损失。
•追涨有2种情况:•短线追涨:当天股价已经涨了5个点或更多,这时追进去就是短线追涨;•中线追涨:股价已经涨了一段时间,走势很强,底部起来已经有30%或更多,这个时候追进去是中线追涨。
•追涨的理由很充分,不论中线还是短线,涨得好就说明现在的走势很强,追强势股自然是不错的。
但追涨的风险也很大,关键在于不知道它能涨到什么地方,到什么位置可能回调甚至出货。
所以说追涨技巧性很强,什么情况下能追,什么情况下不能追,都是很有讲究的。
•杀跌也是一门较深的操作技巧,杀得好的话既可以回避风险。
如果不能进行杀跌的准确判断,则很可能会发生硬性止损,导致严重的亏损。
•杀跌的要点:•快速知变,分析消息、量能、对周边各种因素的影响•善于观察,盘面、形态、消息、舆论等方面的细微变化,对大盘作出准确估量•善于思考,大盘与目标股之问的正向、反向的相关性•利好出尽是利空,当市场利好消息接踵而至时,应随时准备卖出股票•追涨杀跌的技巧:要观大势,看清整个市场多空对决的优势一方是谁。
•假设条件:•市场处于强势交易格局。
•市场形成了鲜明并有持续性上涨能力的热点或板块效应。
•追涨操作的对象:•市场形成鲜明的可持续性的热点时,可追涨这热点。
从理论上讲只要把握热点板块就能获利,追涨时应重点关注领头羊品种。
比如:沪深300指数的成分股,就是不错的选择。
张丹-股市中的R语言量化算法模型final
股市中的R语言量化算法模型均值回归,发现逆市中的投资机会主讲:张丹目录1.均值回归原理2.均值回归模型和实现3.量化选股•在股票市场中有两种典型的投资策略:趋势追踪和均值回归。
•趋势追踪策略:在大行情中波段操作,如均线模型,不仅简单而且有效,我之前写的一篇文章,两条均线打天下就属于趋势追踪策略。
•均值回归策略:在震荡情行中,找到超跌的股票买入,等待上涨后卖出,捕捉小的机会,本次就介绍均值回归的模型。
•在金融学中,均值回归是指股票价格无论高于或低于均衡价格水平(均值),都会以很高的概率向均值回归。
根据这个理论,股票价格总是围绕其均值上下波动。
•上涨或下跌的趋势,不管延续多长时间,不能永远持续下去。
涨得太多了就会跌,跌得太多就会涨。
•简单地说,“涨多必跌,跌多必涨”。
•下面以平安银行(000001)股票日线图为例,截取2005年到2015年7月的股票数据,股价为向前复权的价格。
均值回归是价值投资理论成立的一个核心理论。
具有3个特性:•必然性•不对称性•政府调控•必然性,股票价格不能总是上涨或下跌,一种趋势不管其持续的时间多长都不能永远持续下去。
•在一个趋势内,股票价格呈持续上涨或下跌,称为均值回避。
•当出现反趋势的情况就是均值回归,但回归周期有随机性不能预测。
不同的股票市场,回归的周期是不一样的,就算是相同的股票市场,回归的周期也是不一样的。
•以苏宁云商(002024)股票日线图为例, 同样截取2005年到2015年7月的向前复权的股价数据。
•不对称性,股价波动的幅度与速度是不一样的,回归时的幅度与速度具有随机性。
•在市场供需影响下,股票收益率不会偏离均值时间太久,股票价格会自然地向均值回归。
•政府行为,会促进市场的有效性。
当股价偏离均值后,并等于立即就会向均值回归,很可能会出现持续地均值回避。
政府就会通过一些手段进行市场调节。
•政府行为包括:升准/降准、升息/降息、购买逆回购等。
在股票市场,地产股、银行股,受到调控政策影响会比较明显。
R做投资最优组合
1.获取数据。
本次实验使用quantmod中的getSymbols函数获取所需的五支股票数据。
这里以民生银行(代码为600016)为例进行说明。
首先,设定R的工作目录为D盘。
我们需要载入quantmod包,通过quantmod包中的getSymbols函数获取股票从2010.11.1到2013.1.30的交易数据。
运行代码如下:#设定工作目录setwd("D:/")#安装quantmod程序包install.packages("quantmod")#读取quantmod程序包library(quantmod)#下载股票交易数据s1<-getSymbols("600016.ss",from = "2010-11-01",to = "2013-11-30",auto.assign=FALSE)s2<-getSymbols("600016.ss",from = "2010-11-01",to = "2013-11-30",auto.assign=FALSE)s3<-getSymbols("600080.ss",from = "2010-11-01",to = "2013-11-30",auto.assign=FALSE)s4<-getSymbols("600114.ss",from = "2010-11-01",to = "2013-11-30",auto.assign=FALSE)s5<-getSymbols("600228.ss",from = "2010-11-01",to = "2013-11-30",auto.assign=FALSE)2.我们需要用到五只股票的月收益率,因此还需将得到的股票交易数据处理为月收益率数据。
【原创】R语言TMA三均线策略实现附代码数据
source('in-sample_period.R')library(TTR)getOrders <-function(store, newRowList, currentPos, params) {allzero <-rep(0,length(newRowList)) # used for initializing vectors ################################################# You do not need to edit this part of the code# that initializes and updates the store################################################if (is.null(store))store <-initStore(newRowList)elsestore <-updateStore(store, newRowList)################################################pos <-allzero################################################# This next code section is the only one you# need to edit for getOrders## The if condition is already correct:# you should only start computing the moving# averages when you have enough close prices# for the long moving average################################################if (store$iter >params$lookbacks$long) {for (index in 1:length(params$series)) {current_close=last(store$cl[[index]])close=store$cl[[index]]xtsclose=as.xts(close)GETtma=getTMA(xtsclose,params$lookbacks)pos=getPosSignFromTMA(GETtma)*getPosSize(current_close)}}################################################# You do not need to edit this part of the code# that initializes and updates the store################################################marketOrders <--currentPos +posreturn(list(store=store,marketOrders=marketOrders,limitOrders1=allzero,limitPrices1=allzero,limitOrders2=allzero,limitPrices2=allzero))}####################################################################### ## The following function should be edited to complete steps 1 to 3# of comp22 assignment 2getTMA <-function(close_prices, lookbacks) {if (!("long" %in%names(lookbacks) && "short" %in%names(lookba cks) && "medium" %in%names(lookbacks) ))stop("E01: At least one of \"short\", \"medium\", \"long\" is missi ng from names(lookbacks)")# Replace TRUE to# check that the elements of lookbacks are all integersif( !(class(lookbacks[[1]])=="integer" &&class(lookbacks[[2]])=="int eger" &&class(lookbacks[[3]])=="integer"))stop("E02: At least one of the lookbacks is not an integer accordin g to is.integer()")# Replace TRUE to# check that lookbacks$short < lookbacks$medium < lookbacks$longif (!(lookbacks[[1]]<lookbacks[[2]] &&lookbacks[[2]]<lookbacks[[3]])) stop("E03: The lookbacks do not satisfy lookbacks$short < lookbacks$medium < lookbacks$long")# Replace TRUE to# check that close_prices is an xtsif (!(class(close_prices)[1]=="xts"))stop("E04: close_prices is not an xts according to is.xts()")# Replace TRUE to# check that close_prices has enough rowsif (nrow(close_prices)<max(lookbacks[[1]],lookbacks[[2]],lookbacks [[3]]))stop("E05: close_prices does not enough rows")# Replace TRUE to# check that close_prices contains a column called "Close"if (!(colnames(close_prices)=="Close"))stop("E06: close_prices does not contain a column \"Close\"")sma=numeric(0)for(i in 1:3){sma[i] <-as.numeric(last(SMA(close_prices,n=lookbacks[[i]]))) # TTR version # convert to vector from xts}smalist <-list(short=sma[1],medium=sma[2],long=sma[3])# You need to replace the assignment to ret so that the# returned object:# - is a list# - has the right names (short, medium, long), and# - contains numeric and not xts objects# - and contains the correct moving average values, which should # have windows of the correct sizes which should all end in the # same period which should be the last row of close_prices return(smalist)}getPosSignFromTMA <-function(tma_list) {if(tma_list$short<tma_list$medium &&tma_list$medium<tma_list$long)ret=1else if(tma_list$long>tma_list$medium &&tma_list$medium>tma_list$sho rt)ret=-1else ret=0return(ret)}getPosSize <-function(current_close,constant=1000) {return(floor(constant/current_close))}getInSampleResult <-function() {TIme=getInSamplePeriod('x1xxx ')dataList <-getData(directory="A2")dataList <-lapply(dataList, function(x)x[TIme[1]:TIme[2]])lookbacks <-list(short=as.integer(5),medium=as.integer(10),long=as.in teger(20))sMult <-0.2# slippage multipliernewRowList=getRowList(dataList,1)numOfSeries=length(dataList)params <-list(lookbacks=lookbacks,sdParam=1,series=1:numOfSeries)#,po sSizes=rep(1,getPosSize(newRowList[[1]]$Close)))results <-backtest(dataList, getOrders, params, sMult)pfolioPnL <-plotResults(dataList,results)pfolioPnL$fitAggcat("PD ratio ",pfolioPnL$fitAgg)}getInSampleOptResult <-function() {sMult <-0.2# slippage multiplierTIme=getInSamplePeriod('x4wl1')#####dataList <-getData(directory="A2")dataList <-lapply(dataList, function(x)x[TIme[1]:TIme[2]])sMult <-0.2# slippage multipliernumOfSeries=length(dataList)medium <-seq(from=105,to=120,by=5)short <-seq(from=100,to=110,by=5)long <-seq(from=110,to=130,by=5)time <-matrix(0,28,3)row=1for(z in 1:length(long))for(i in 1:length(short))for(j in 1:length(medium))if(short[i]<medium[j] &&medium[j]<lon g[z]){time[row,]=c(as.integer(short[i]),as.integer(medium[j]),as.intege r(long[z]))row=row+1}colnames(time)=c("short","medium","long")resultsMatrix <-matrix(nrow=nrow(time),ncol=4)colnames(resultsMatrix) <-c("short","medium","long","PDratio")pfolioPnLList <-vector(mode="list",length=nrow(time))count <-1for (i in 1:nrow(time)) {newRowList=getRowList(dataList,count)short=as.integer(time[i,1]);medium=as.integer(time[i,2]);long=as.in teger(time[i,3]);lookbacks <-list(short=short,medium=medium,long=long)params <-list(lookbacks=lookbacks,sdParam=1,series=1:numOfSeries,po sSizes=rep(1,getPosSize(newRowList[[1]]$Close)))results <-backtest(dataList, getOrders, params, sMult)pfolioPnL <-plotResults(dataList,results)resultsMatrix[count,] <-c(lookbacks[[1]],lookbacks[[2]],lookbacks [[3]],pfolioPnL$fitAgg)pfolioPnLList[[count]]<-pfolioPnLcat("Just completed",count,"out of",time,"\n")print(resultsMatrix[count,])count <-count +1}print(resultsMatrix[order(resultsMatrix[,"PDratio"]),])return(max(resultsMatrix[,4]))}####################################################################### ## The functions below do NOT need to be edited for comp226 assignment 2 initClStore <-function(newRowList) {clStore <-lapply(newRowList, function(x) x$Close)return(clStore)}updateClStore <-function(clStore, newRowList) {clStore <-mapply(function(x,y) rbind(x,y$Close),clStore,newRowList,S IMPLIFY=FALSE)return(clStore)}initStore <-function(newRowList,series) {return(list(iter=1,cl=initClStore(newRowList)))}updateStore <-function(store, newRowList) {store$iter <-store$iter +1store$cl <-updateClStore(store$cl,newRowList)return(store)}#############################testlibrary(TTR)############getTMAsource('framework/data.R')## Loading required package: xts## Loading required package: zoo#### Attaching package: 'zoo'## The following objects are masked from 'package:base':#### as.Date, as.Date.numeric## Version 0.4-0 included new data defaults. See ?getSymbols.source('framework/backtester.R')source('framework/processResults.R')lookbacks <-list(short=as.integer(5),medium=as.integer(10),long=as.inte ger(20))# Read in datadataList <-getData(directory="A2")## Read 3 series from DATA/A2close_prices <-dataList[[1]]$Close[1:20]getTMA(close_prices,lookbacks)## $short## [1] 16.948#### $medium## [1] 17.086#### $long## [1] 17.1525getPosSignFromTMA(getTMA(close_prices,lookbacks)) ## [1] 1current_close <-100.5getPosSize(current_close)## [1] 9getInSampleResult()## Read 3 series from DATA/A2## PD ratio -107565.9getInSampleOptResult()## Read 3 series from DATA/A2## Just completed 1 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 105.00 110.00 -71145.22## Just completed 2 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 105.00 115.00 -44965.95## Just completed 3 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 110.00 115.00 -51909.61## Just completed 4 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 110.00 115.00 -80736.32## Just completed 5 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 105.00 120.00 -41036.18## Just completed 6 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 110.00 120.00 -55139.27## Just completed 7 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 115.00 120.00 -50172.36## Just completed 8 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.0 110.0 120.0 -76396.1## Just completed 9 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 105 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 12 0 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 1 20 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 115.00 120.00 -74760.33## Just completed 10 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 110.00 115.00 120.00 -68067.44## Just completed 11 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 105.00 125.00 -37520.49## Just completed 12 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 110.00 125.00 -42490.56## Just completed 13 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 115.00 125.00 -37721.27## Just completed 14 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 120.00 125.00 -58276.12## Just completed 15 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 110.00 125.00 -67416.08## Just completed 16 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 115.00 125.00 -61405.05## Just completed 17 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 120.00 125.00 -53643.25## Just completed 18 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 110.00 115.00 125.00 -53917.27## Just completed 19 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 110.00 120.00 125.00 -61091.66## Just completed 20 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 105.00 130.00 -32146.52## Just completed 21 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 110.00 130.00 -29651.36## Just completed 22 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 115.00 130.00 -18750.82## Just completed 23 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 100.00 120.00 130.00 -41816.79## Just completed 24 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 110.00 130.00 -55087.09## Just completed 25 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 115.00 130.00 -45589.66## Just completed 26 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 105.00 120.00 130.00 -45796.46## Just completed 27 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 110.00 115.00 130.00 -45001.78## Just completed 28 out of 100 100 100 105 100 100 100 105 105 110 100 100 100 100 105 105 105 110 110 100 100 100 100 105 105 105 110 110 10 5 105 110 110 105 110 115 110 115 115 105 110 115 120 110 115 120 115 1 20 105 110 115 120 110 115 120 115 120 110 115 115 115 120 120 120 120 120 120 125 125 125 125 125 125 125 125 125 130 130 130 130 130 130 130 130 130## short medium long PDratio## 110.0 120.0 130.0 -134022.8## short medium long PDratio## [1,] 110 120 130 -134022.77## [2,] 105 110 115 -80736.32## [3,] 105 110 120 -76396.10## [4,] 105 115 120 -74760.33## [5,] 100 105 110 -71145.22## [6,] 110 115 120 -68067.44## [7,] 105 110 125 -67416.08## [8,] 105 115 125 -61405.05## [9,] 110 120 125 -61091.66## [10,] 100 120 125 -58276.12## [11,] 100 110 120 -55139.27## [12,] 105 110 130 -55087.09## [13,] 110 115 125 -53917.27## [14,] 105 120 125 -53643.25## [15,] 100 110 115 -51909.61## [16,] 100 115 120 -50172.36## [17,] 105 120 130 -45796.46## [18,] 105 115 130 -45589.66## [19,] 110 115 130 -45001.78 ## [20,] 100 105 115 -44965.95 ## [21,] 100 110 125 -42490.56 ## [22,] 100 120 130 -41816.79 ## [23,] 100 105 120 -41036.18 ## [24,] 100 115 125 -37721.27 ## [25,] 100 105 125 -37520.49 ## [26,] 100 105 130 -32146.52 ## [27,] 100 110 130 -29651.36 ## [28,] 100 115 130 -18750.82 ## [1] -18750.82。
基于R语言的投资策略研究
基于R语言的投资策略研究近年来,随着科技的不断进步和数据的不断涌现,越来越多的投资者开始利用计算机中的数据处理工具来进行投资决策,其中最为流行的就是基于R语言的投资策略研究。
本文将从R语言的优势、基于R语言的投资策略研究方法、应用案例等方面介绍基于R语言的投资策略研究。
一、R语言的优势R语言是一种开源的统计分析软件,由于其准确度高、灵活性强、可视化丰富等优势而备受欢迎。
首先,R语言在数据分析和建模方面得到了广泛应用,并且其支持的统计模型和算法极为丰富。
其次,R语言支持R Markdown、Shiny、R Notebook等丰富的编程环境,对于数据分析人员而言,这可以让他们更加高效地分析数据、理解和展示结果。
二、基于R语言的投资策略研究方法在进行基于R语言的投资策略研究之前,需要明确数据来源、数据预处理方法、分析方法、模型参数等一系列问题。
简单来说,基于R语言的投资策略研究分为以下4个步骤:1、数据准备在进行投资策略研究之前,需要准备大量的数据。
这些数据可以来自不同的数据源,例如股票数据、财务数据、技术指标等。
一般来说,这些数据需要进行清洗和处理才能用于建模和分析。
因此,数据准备是基于R语言的投资策略研究不可或缺的步骤。
2、数据分析数据分析是基于R语言的投资策略研究中最关键的步骤。
基于R语言的数据分析,需要掌握一定的统计学知识,例如频数分布、箱线图、回归分析等。
基于这些分析方法,可以帮助投资者更加深入地理解市场行情、了解投资标的的走势、判断显著性等。
3、模型构建模型构建是基于R语言的投资策略研究的关键步骤。
在模型构建之前,需要明确模型的目的、假设和参数。
通常使用的建模方法包括线性回归、逻辑回归、时间序列预测、机器学习等。
在这一阶段,投资者需要根据数据分析结果和模型需求,选择合适的模型方法。
4、模型评估模型评估是基于R语言的投资策略研究中最后一个步骤。
评估结果可以用来衡量模型的优劣,并为投资者提供投资决策的依据。
R投资决策原理
R投资决策原理引言投资决策是指投资者在确定是否投资某种资产或工程时所进行的思考和分析过程。
在金融领域,投资决策的目标是最大化投资回报并降低风险。
在本文中,我们将介绍R投资决策原理。
R是一种流行的统计计算和数据分析软件,被广泛应用于金融领域的投资决策过程中。
R语言简介R语言是一种开源的编程语言和环境,专门用于数据分析和统计计算。
它提供了丰富的数据处理和可视化工具,使得分析师可以很方便地处理大量的数据并进行统计分析。
R语言还提供了各种机器学习和人工智能算法的实现,可以帮助投资者进行更准确的预测和决策。
R在投资决策中的应用R语言在投资决策中有多种应用。
下面我们将介绍R在投资组合优化、风险管理和市场预测等方面的原理和方法。
1. 投资组合优化投资组合优化是指在给定的投资标的和约束条件下,寻找一个最优的资产组合,以最大化投资回报或最小化风险。
在R语言中,可以利用优化算法和线性规划模型来解决投资组合优化问题。
通过设定不同的目标函数和约束条件,可以得到不同的投资组合方案。
2. 风险管理风险管理是投资决策中非常重要的一环。
R语言提供了多种风险管理工具和模型,可以帮助投资者分析和控制风险。
常用的风险管理方法包括价值-at-风险〔VaR〕、条件风险模型〔CVaR〕和风险敞口分析等。
借助R语言的风险管理工具,投资者可以更好地理解和管理投资风险。
3. 市场预测市场预测是投资决策中的另一个重要方面。
R语言提供了多种统计模型和机器学习算法,可以用来进行市场趋势预测和股票价格预测。
常用的市场预测方法包括时间序列分析、回归分析和支持向量机等。
通过使用R语言的预测工具,投资者可以更准确地预测市场走势和股票价格,从而做出更明智的投资决策。
R投资决策实例分析为了更好地理解R在投资决策中的应用,我们将介绍一个实例分析。
假设我们要选择一个最正确的股票投资组合,以最大化投资回报并控制风险。
我们可以使用R语言的优化工具和风险管理工具来解决这个问题。
量化投资R语言TTR包TDI趋势预测指标王樱洁、云金杞
趋势预测指标Trend Detection Index(TDI)由M. H. Pee发明,用于识别一个趋势开始和结束的时机。
函数定义:
TDI(price, n = 20, multiple = 2)
参数列表:
price:价格
n:期限
multiple:计算倍数
举例:
获得上证指数今年以来的数据,并画出TDI。
getSymbols("^SSEC")
chartSeries(SSEC, TA = "addTDI ()", subset = "2015", theme=chartTheme('white'))
图5-19 TDI趋势预测指标
表5-1 34种函数
注:这是一本即将出版的量化投资与R语言的书,现在免费分享一些章节,供大家学习。
作者:王樱洁、云金杞
王樱洁:
新浪微博:
二维码:
云金杞:
新浪微博:
二维码:
公众平台:
量化投资以VBA和R和Python等为工具
二维码:
欢迎关注作者的微信和我们的公众号,新书发布,我们将在公众号和微博第一时间分享给大家。
基于R语言的均线量化策略分析(全文)
基于R语言的均线量化策略分析一、引言技术分析在股票市场的投资中被广泛应用,其中,均线系统分析是实践中最常采纳的也是准确率最高的技术评价体系。
R语言具有灵活性、开放性,而它最具魅力的地方在于其自带了多种统计学及数字分析功能。
移动平均线具有滞后性。
对于短期投资者来说,能否提前预测到平均线的走势,进而推断股价的买卖点,意义就显得尤为重要。
因此,本文在寻找医药的买卖点时,借助R语言强大的预测统计功能,将均线策略与其结合,从而达到提前预测及稳定获利的目标。
二、R语言介绍R语言是由新西兰奥克兰大学的Ross Ihk与Robert Gentlemen一起开发的面向对象的编程语言。
R语具有一套完整的数据处理、计算和制图软件系统,同时它是一个开源软件,它的主程序小巧,有着丰富的数据包。
正是因为拥有这些特征,使得R语言在金融量化投资领域应用广泛,并且具有良好的预测功能。
本文以R语言为工具,对医药股价进行以均线系统为策略的量化投资分析。
三、R语言策略模型R语言要实现均线策略,首先需要提取数据,再将其转换为时间序列,接着进行平稳性检验、白噪声检验,当序列满足平稳性且自相关条件时,方可进行策略建模,直到策略实现。
四、均线系统策略实现第一,本文主要利用简单移动平均线对医药的股价进行预测分析,在此之前,对相关概念做一个简要的介绍。
算术平均数的算法,是先对一组数据的值求和,再用这个总和除这组数据的个数来得到算术平均数。
简单移动平均用数学公式表达为:将这些简单移动平均数绘制成时间序列图,就可以得到股价的简单移动平均线。
第二,一是买入(做多)信号的确定分析。
其一,当移动平均线下将趋于平缓或者像上翘时候,价格从左下方上穿移动平均线,表明价格将持续上涨;其二,当移动平均线继续保持向上移动势头,然而价格小幅下蹿,这时可持股待涨或伺机买入。
二是卖出(做空)信号的确定分析。
其一,当移动均线上升过程中逐渐转平或向下时,而价格趋势线也从均线上方向下穿过均线且一去不返,这时价格将开始下跌;其二,当移动均线在下跌的过程中,而价格趋势线却由均线下面向上升至均线时又转向下方,此时价格依旧处于下降趋势。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用R语言编写量化投资策略选取一股票,利用R语言进行分析,同时构建通道突破,双均线交叉和MACD策略,进行回测。
library(xts)library(xtsExtra)library(quantmod)library(FinTS)library(forecast)library(TSA)library(TTR)library(fGarch)library(rugarch)library(tseries)setSymbolLookup(MHXX=list(name='0696.hk',src='yahoo')) getSymbols("MHXX",from="2013-01-01",to="2015-09-30")#显示K线图,如图明显发现股价呈现递增趋势,价格序列是非平稳的。
chartSeries(MHXX)#考虑对数收益率#获取收盘价cp = MHXX[,4]lgcp=log(MHXX[,4])#tdx =c(1:456)/365+2014#计算日收益率ret=dailyReturn(MHXX)chartSeries(ret,theme="white",TA=NULL)#plot(tdx,cp,xlab="year",ylab="close price",type='l')#计算对数收益率,如图课件,股价在15年左右有一个跳跃,15年第二季度的股价增长导致#之后股价有较大的下降,这些特征给后续的分析带来一些较大的异常值lgret = log(ret+1)chartSeries(lgret,theme="white",TA=NULL)#由ACF和PACF图可以看出,该股1股价的日收益率序列即使存在某种相关性,该自相关性也#很小par(mfcol=c(2,1))acf(lgret,lag=30)pacf(lgret,lag=30)#为了验证该收益率序列有没有序列相关性,使用Ljung-Box检验,结果对应的P值0.024,#在1%的显著水平下,拒绝该股票日收益率没有显著前后相关性的这一原假设。
#但在5%的显著水平下,无法拒绝该股票日收益率没有显著前后相关性的这一原假设。
Box.test(lgret,lag=20,type='Ljung')############################################################# #################m1 <- auto.arima(lgret,stationary=TRUE,seasonal=FALSE,ic="aic")#鉴于该股票对数收益率序列的自相关性并不强,所以建立的ARIMA模型可能适用性不高。
#对于对数收益率序列,单样本的t检验结果的t比为1.0625,p值为0.2884,表明该序列不是#显著异于零的,同时此处根据ACF图所示,在4阶有轻微的超越标准差线,#因此取用AR(5)模型拟合,aic=-2987.43m2 <- arima(x=lgret,order=c(4,0,0),include.mean=F)tratio=m2$coef/sqrt(diag(m2$var.coef))tratiomeacf=eacf(lgret,6,12)print(meacf$eacf,digits=2)#残差检验并表示改模型可能不是充分的tsdiag(m2,gof=20)m3 <-auto.arima(ret,stationary = TRUE,seasonal = FALSE,ic="aic")m3############################################################# ####################由上述可知,对于价格变化的分析,纯ARMA模型是不充分的,一方面ARMA模型不能处理#波动率聚集,另一方面,ARMA-GARCH模型能充分处理这些数据的复杂性,#并能提高样本外预测price=ts(cp)dp=ts(diff(cp))par(mfcol=c(2,1))plot(price,xlab='year',ylab='price')plot(dp,xlab='year',ylab='changes')cprice=diff(price)par(mfcol=c(2,1))acf(cprice)pacf(cprice)#aic=-0.37m.garch1<-garchFit(~1+garch(1,1),data=cprice,trace=F)summary(m.garch1)#aic=-0.62m.garch2<-garchFit(~arma(6,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F,cond.dist = "std")summary(m.garch2)#aic=-0.60m.garch3<-garchFit(~arma(2,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F,cond.dist = "std")summary(m.garch3)#aic=-0.596m.garch4<-garchFit(~arma(1,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F,cond.dist = "std")summary(m.garch4)#回测检验source("backtestGarch.R")M2F=backtestGarch(cprice,714,2,inc.mean=F,cdist="sstd")source("backtest.R")M2AF=backtest(m2,cprice,714,2,inc.mean=F)#ArchTest(coredata(ret))############################################################# ####################计算VaRmgarch1<-ugarchspec(variance.model=list(garchOrder=c(1,1)),mean.model=list(armaOrder=c(0,0)))mgarch1_fit<-ugarchfit(spec=mgarch1,data=cprice)mgarch1_fitmgarch1_roll<-ugarchroll(mgarch1,cprice,n.start=120,refit.every=1,refit.window = "moving",solver="hybrid",calculate.VaR = TRUE,VaR.alpha = 0.01,keep.coef = TRUE)report(mgarch1_roll,type="VaR",VaR.alpha=0.01,conf.level=0.99)#生成PLOTcprice_var<-zoo(mgarch1_roll@forecast$VaR[,1])index(cprice_var)<-as.yearmon(rownames(mgarch1_roll@forecast$VaR))cprice_actual<-zoo(mgarch1_roll@forecast$VaR[,2])index(cprice_var)<-as.yearmon(rownames(mgarch1_roll@forecast$VaR))plot(cprice_actual,type="b",main="99% day Var backtesting",xlab="Date",ylab="Return /VaR in percent")lines(cprice_var,col="red")legend("topright",inset=.05,c("MHXX return","VaR"),col=c("black","red"),lty=c(1,1))mgarch1_fcst <- ugarchforecast(mgarch1_fit, n.ahead = 6)mgarch1_fcstret.fcst <- - qnorm(0.95) * mgarch1_fcst @forecast$sigmaFor ret.fcstchartSeries(MHXX,name="中国民航信息",TA=NULL) addBBands()#addMACD()################################量化投资策略########################################## 通道突破#######通道突破函数===================================================== =============bband.bk.sim <- function(stk.prc.xts, k=20, p=1.65, q=0.8){#q是交易倍数,表示资金的q分用于交易stk.prc <- coredata(stk.prc.xts) #把主要数据取出Timeline <- index(stk.prc.xts)End <- length(stk.prc.xts)MA <- c( rep(0, k), 0)std <- c( rep(0, k), 0)u.bound <- c( rep(0, k), 0)signal <- c( rep(0, k), 0) #交易信号trd.state <- c( rep(0, k), 0) #记录买卖状态share <- c( rep(0, k), 0) #记录持股份数cash <- c( rep(1e4, k), 0) #现金部位value <- c( rep(1e4, k), 0) #资产价值=股票市值+现金部位# Sim ----for( t in k:End ){stk.prc.pre <- stk.prc[(t-k):t]MA[t] <- mean( stk.prc.pre )std[t] <- sd( stk.prc.pre )u.bound[t] <- MA[t] + p * std[t] #布林带上界signal[t] <- 0 #默认不交易if( stk.prc[t] > u.bound[t] ) signal[t] = 1#当股票价格超出布林上界时,buyif( stk.prc[t-1] > MA[t-1] & stk.prc[t] <= MA[t] ) signal[t] = -1if( stk.prc[t-1] < MA[t-1] & stk.prc[t] >= MA[t] ) signal[t] = -1 #卖的情况trd.state[t] <- trd.state[t-1]cash[t] <- cash[t-1]share[t] <- share[t-1]value[t] <- value[t-1]#更新交易状态、持股数目、现金金额if( trd.state[t-1] == 0 & signal[t] == 1 ){trd.state[t] <- 1share[t] <- ( q * cash[t-1] ) / stk.prc[t]cash[t] <- cash[t-1] - share[t]*stk.prc[t]}if( trd.state[t-1] == 1 & signal[t] == -1 ){trd.state[t] <- 0share[t] <- 0cash[t] <- cash[t-1] + share[t-1]*stk.prc[t]}value[t] <- cash[t] + share[t]*stk.prc[t]}res <- cbind(stk.prc, signal, trd.state, share, cash, value)names(res) <- c("prc", "signal", "trd.state", "share", "cash", "value")return(res)}#通道突破函数END================================================== ==============res <- bband.bk.sim(cp)head(res)tail(res)plot(res[,6],type='l',col='darkred',lty=1,lwd=2)## 通道(end)############################### 均线系统策略##################################### 双均线交叉策略mov.avg.sim <- function(stk.prc.xts, k=50, n=7, p=1.05, q=1.10, m=0.8){stk.prc <- coredata(stk.prc.xts)Timeline <- index(stk.prc.xts)End <- length(stk.prc)MA.5 <- SMA(stk.prc, 5) #计算5日均线 MA.20 <- SMA(stk.prc, 20) #计算20日均线signal <- c( rep(0, k), 0)trd.state <- c( rep(0, k), 0)share <- c( rep(0, k), 0)cash <- c( rep(1e4, k), 0)value <- c( rep(1e4, k), 0)# Sim -----for( t in k:End ){signal[t] <- 0if( sum(MA.5[(t-n):(t-1)] > MA.20[(t-n):(t-1)]) == n& stk.prc[t-1]/MA.20[t-1] > p) signal[t] <- 1if( MA.5[t-1] >= MA.20[t-1] & MA.5[t] <= MA.20[t]) signal[t] <- -1 if( stk.prc[t-1]/MA.20[t-1] > q ) signal[t] <- -1trd.state[t] <- trd.state[t-1]cash[t] <- cash[t-1]share[t] <- share[t-1]value[t] <- value[t-1]if( trd.state[t-1] == 0 & signal[t] == 1 ){trd.state[t] <- 1share[t] <- ( m * cash[t-1] ) / stk.prc[t]cash[t] <- cash[t-1] - share[t]*stk.prc[t]}if( trd.state[t-1] == 1 & signal[t] == -1 ){trd.state[t] <- 0share[t] <- 0cash[t] <- cash[t-1] + share[t-1]*stk.prc[t]}value[t] <- cash[t] + share[t]*stk.prc[t]}res <- xts( cbind(stk.prc, MA.5, MA.20, signal, trd.state, share, cash, value), order.by=Timeline)names(res) <- c("prc", "MA.5", "MA.20","signal", "trd.state","share", "cash", "value")head(res)return(res)}#双均线交叉策略END================================================== ============res.mov <- mov.avg.sim(cp)head(res.mov)tail(res.mov)plot(res.mov[,6],type='l',lty=1,lwd=2)## MACD(begin)MACD.sim <- function(stk.prc.xts, k=50, m=0.8){stk.prc <- coredata(stk.prc.xts)Timeline <- index(stk.prc.xts)End <- length(stk.prc)macd.line <- MACD(stk.prc, nFast=12, nSlow=26, nSig=9)[, 1] signal.line <- MACD(stk.prc, nFast=12, nSlow=26, nSig=9)[, 2]signal <- c( rep(0, k), 0)trd.state <- c( rep(0, k), 0)share <- c( rep(0, k), 0)cash <- c( rep(1e4, k), 0)value <- c( rep(1e4, k), 0)# Sim -----for( t in (k+1):End ){signal[t] <- 0if( macd.line[t-1] <= signal.line[t-1] & macd.line[t] > signal.line[t]) signal[t] <- 1if( macd.line[t-1] >= signal.line[t-1] & macd.line[t] < signal.line[t]) signal[t] <- -1trd.state[t] <- trd.state[t-1]cash[t] <- cash[t-1]share[t] <- share[t-1]value[t] <- value[t-1]if( trd.state[t-1] == 0 & signal[t] == 1 ){trd.state[t] <- 1share[t] <- ( m * cash[t-1] ) / stk.prc[t]cash[t] <- cash[t-1] - share[t]*stk.prc[t]}if( trd.state[t-1] == 1 & signal[t] == -1 ){trd.state[t] <- 0share[t] <- 0cash[t] <- cash[t-1] + share[t-1]*stk.prc[t] }value[t] <- cash[t] + share[t]*stk.prc[t]}res <- cbind(stk.prc, macd.line, signal.line,signal, trd.state, share, cash, value)names(res) <- c("prc", "MACD.line", "signal.line","signal", "trd.state", "share", "cash", "value") head(res)return(res)}#MACD策略END================================================== ============res.macd <- MACD.sim(cp)head(res.macd)tail(res.macd)plot(res.macd[,8],type='l',lty=1,lwd=2)#收益率ret.macd<-diff(res.macd[,8])plot(ret.macd,type='l',col='red',lty=1,lwd=2)#总收益ret.macd.sum<-sum(ret.macd)ret.macd.sum.ratio<-ret.macd.sum/(res.macd[1,8])## MACD(end)。