美文网首页作图
R语言量化投资(1)

R语言量化投资(1)

作者: Liam_ml | 来源:发表于2018-12-29 23:07 被阅读68次

    R是一门非常适合做数据的工具。不用关注时间复杂度多少,怎么把程序写漂亮。而是关注如何收集数据,提高数据质量,来解决实际的业务问题。

    跨界是一个很难的问题,因为不同背景的人进行沟通是一个非常困难的问题,尤其是金融行业和IT行业:一个封闭不愿意分享,一个开放崇尚开源;一种所有人都要为我服务,一种只专注自己感兴趣的事情。

    做跨学科的事情,你要了解项目管理的方法,产品设计的逻辑,数知识,机器学习知识,结合业务,理解市场规则。

    量化领域更是R语言的强项,有针对投资研究的包,有做回测分析的包,有做金融产品定价的包,有做投资组合优化的包,还有风险管理的包,涵盖了量化投资的方方面面,只是有些包的使用要针对中国市场的特点进行改进和优化

    • 数据管理:包括数据集抓取、存储、读取、时间序列、数据处理等,涉及的R包有zoo(时间序列对象)、xts(时间序列处理)、timeSeries(Rmetrics系时间序列对象)、timeDate(Rmetrics系时间序列处理)、data.table(数据处理)、quantmod(数据下载和图形可视化)、RQuantLib(QuantLib数据接口)、WindR(Wind数据接口)、RJDBC(数据库访问接口)rhadoop(Hadoop访问接口)、rhive(Hive访问接口)、rredis(Redis访问接口)、rmongodb(MongoDB访问接口)、SparkR(Spark访问接口)、fImport(Rmetrics系数据访问接口)等

    • 指标计算:包括金融市场的技术指标的各种计算方法,涉及的R包有TTR(技术指标)、TSA(时间序列计算)、urca(单位根检验)、fArma(Rmetrics系ARMA计算)、fAsianOptions(Rmetrics系亚洲期权定价)、fBasics(Rmetrics系计算工具)、fCopulae(Rmetrics系财务分析)、fExoticOptions(Rmetrics系期权计算)、fGarch(Rmetrics系Garch模型)、fNonlinear(Rmetrics系非线模型)、fOptions(Rmetrics系期权定价)、fRegression(Rmetrics系回归分析)、fUnitRoots(Rmetrics系单位根检验)等

    • 回测交易:包括金融数据建模,并验证历史数据验证模型的可靠性,涉及的R包有FinancialInstrument(金融产品)
      quantstrat(策略模型和回测)、blotter(账户管理)、fTrading(Rmetrics系交易分析)等

    • 投资组合:对多策略或多模型进行管理和优化,涉及的R包有PortfolioAnalytics(组合分析和优化)、stockPortfolio(股票组合管理)、fAssets(Rmetrics系组合管理)等。

    • 风险管理:对持仓进行风险指标的计算和风险提示,涉及的R包有Performance-Analytics(风险分析)、fPortfolio(Rmetrics系组合优化)、fExtremes(Rmetrics系数据处理)

    下面,列出一个简单的例子,做一个简单的交易策略,即基于移动平均线MACD做一个针对全球指数的投资方案

    1. 用quantmod 包下载数据
    2. 使用 zoo包和xts 包进行数据格式标准化
    3. 用TTR 包进行模型计算
    4. 使用PerformanceAnalytics进行 指标风险计算
    5. 使用ggplot2 进行可视化展示
    6. 最后,进行结果分析

    首先,我们要获取数据:个人用户可以通过互联网免费下载数据,专业机构通常都是买专业数据库。这里我们通过quantmod包从Yahoo财经下载数据。我选择了全球5个市场的指数进行比较

    # 加载程序库
    library(quantmod)
    library(TTR)
    library(PerformanceAnalytics)
    library(ggplot2)
    library(scales)
    
    # 从Yahoo财经下载各全球指数数据
    options(stringsAsFactors = FALSE) 
    
    
    ymbols<-c("^GSPC","^N225","^HSI","^STI","000001.SS")
    
    suppressWarnings(getSymbols(ymbols,src = "yahoo",from="2012-01-01"))
    
    
    
    
    
    # 取指数价格调整后的数据,合并数据集
    df<-merge(GSPC$GSPC.Adjusted,HSI$HSI.Adjusted,N225$N225.Adjusted,STI$STI.Adjusted,`000001.SS`$`000001.SS.Adjusted`)
    
    # 对列重命名
     names(df)<-c("GSPC","HSI","N225","STI","SSE")
    
     # 查看数据
     
     head(df)
    
                 GSPC      HSI    N225     STI      SSE
    2012-01-03 1277.06 18877.41      NA 2688.36       NA
    2012-01-04 1277.30 18727.31 8560.11 2711.02 2169.390
    2012-01-05 1281.06 18813.41 8488.71 2713.02 2148.452
    2012-01-06 1277.81 18593.06 8390.35 2715.59 2163.395
    2012-01-09 1280.70 18865.72      NA 2691.28 2225.890
    2012-01-10 1292.08 19004.28 8422.26 2719.83 2285.744
    

    整个数据集采用从2012年01月03日到现在的数据,画出全球化指数

    
     # 画出全球指数
     g<-ggplot(aes(x=Index,y=Value, colour=Series),data=fortify(df,melt=TRUE))
     g<-g+geom_line(size=1)
     g<-g+scale_y_continuous(breaks = seq(1000,30000,4000))
     g<-g+ggtitle("Gloabel Index")
     g
     
    
    image.png

    由于各国指数成立时间不同,成份股也不同,导致指数值有的很大,有的相对比较小,所以我们不能用指数大小来判断好坏。通常情况下,我们会转换成收益率进行比较,通过收益率进行度量后,所有标的便都是在同一个维度了。

    # 全球指数的每日累计收益率
     ret_df<-Return.calculate(df, method="discrete")
     chart.CumReturns(ret_df,legend.loc="topleft", main="Cumulative Daily Returns for Gloabel Index")
    
    image.png

    收益率越高,说明指数在这期间是表现越多的,我们越应该去投资。图1-3中,日经225(N225)指数大幅超越了其他指数,中国的上证综指(SSE)一起一落波动非常大,标普500(GSPC)走势稳健。

    接下来计算指数的平均年化收益率,如果我们把钱一直投资在这些指数上面,那么每年的平均回报是多少呢?

    Return.annualized(ret_df)   
                           GSPC        HSI      N225        STI         SSE
    Annualized Return 0.08714533 0.06414805 0.1526533 0.02519472 0.007562616
    

    这里日经指数(N225)年化回报率是最高的,每年平均有19.28%的年化收益率,

    相符。而中国的上证综指(SSE)仅有4.82%的年化收益率,回报不算高,且波动太大。综合来看,标普500(GSPC)其实是投资的首选,11.34%年化收益率,平均波动率也不是太高,所以风险和收益都是相对不错的。

    接下来,我们构建一个简单的MACD模型,通过MACD策略再对上面5个指数构建交易策略。

    
    MACD<-function(dt,n=30){
    names(dt)<-c('close')
    # MACD移动平均均线
    dat<-na.locf(dt)
    dat$ma<-SMA(dat$close,n)
       
    # 交易信号
    sig_buy<-which(dat$ma-dat$close>0)
    sig_Sell<-which(dat$ma-dat$close<0)
    sig_buy<-sig_buy[which(diff(sig_buy)>1)]
    sig_Sell<-sig_Sell[which(diff(sig_Sell)>1)]
    
    if(first(sig_Sell)<first(sig_buy)) sig_Sell<-sig_Sell[-1]
    if(last(sig_Sell)<last(sig_buy)) sig_buy<-sig_buy[-length(sig_buy)]
         
             # 交易清单
    trade_dat<-do.call(rbind.data.frame, apply(cbind(sig_buy,sig_Sell),1,function(row){
    dt[row[1]:row[2],]
    }))
    
             
               # 计算收益率
    ret_trade<-Return.calculate(trade_dat, method="discrete")
               return(ret_trade)
    }
    
    
     # MACD策略每日收益率
    macd_ret<-lapply(df, function(col) MACD(col,30))
     # MACD策略,年化收益率
    
    t(do.call(rbind.data.frame, lapply(macd_ret,Return.annualized)))
               GSPC       HSI      N225       STI       SSE
    close 0.2000791 0.2125424 0.2043864 0.0288004 0.1387109
    

    我们写了一个MACD的策略函数,相当于建模的过程,函数的输出即策略的收益率。然后,我们把指数数据传给MACD()函数,经过计算输出策略收益率。

    量化交易平台系统架构

    image.png

    量化投资的计算过程就是:包括数据采集、数据清洗、数据标准化、指标计算、数据建模、历史回测、投资组合构建、组合优化、计算结果评价、数据可视化等组成部分

    要搭建一套量化交易的系统,主要就是完成图1-4所示的这些步骤。对于个人玩家来说,按照上面R语言代码的思路,就已经可以实现了。如果你想做得更好,不仅是个人玩,而是通过成立公司把系统做大做强,为更多的用户提供量化服务,那么你还需要有一整套的平台架构方案,同时配合你要做的金融业务。

    image.png
    • 数据采集系统:主要用于采集证券、期货等金融产品的交易数据,证券产品的财务数据,以及宏观指标数据和互联网数据等

    • 数据平台系统:用于数据存储和数据访问,实现统一的数据访问的接口。

    • 在线研发系统:让开发者通过API进行在线策略开发,开发者可以直接使用平台的数据,策略提交后自动化完成策略回测

    • 回测系统:对用户已提交的策略进行历史数据的回测,并进行打分和评估。

    • 策略系统:把回测验证后的策略,进行信号的可视化展示,在交易时间实现实时数据刷新,帮助开发者更直观地理解策略信号

    • 优选系统:从回测已验证的策略中,选出符合一定条件的策略进行模拟交易。

    • 模拟交易系统:运行策略产生策略信号,进行模拟买卖

    • 模拟会计系统:对模拟交易进行每日的会计核算

    • 策略超市:从模拟会计系统选出符合一定条件的策略,放入策略超市,开放给投资人

    • 投资组合:投资人从策略超市中选出多个策略,组建投资组合

    • 实盘交易系统:根据投资组合中的策略信号,进行实盘的自动化交易

    • 实盘会计系统:对实盘交易进行每日的会计核算

    • 风控系统:对实盘的策略进行风险监控,一旦实盘策略遇到黑天鹅事件,将马上切断交易,并通知投资人调整投资组合

    • 指标系统:以宏观数据为基础,让用户可以通过自定义的方式,创建自己理解的指标,并以个人的名义进行发布和分享

    • 策略周刊:每周选出平台中公开的、表现比较好的策略,以报告形形式进行推广和发布

    接下来我们换一个角度,从系统架构看,整套IT系统主要分为4大模块:数据部分、计算部分、展示部分、交易部分。我们把图1-5的内容转化为用技术架构来描述

    image.png
    • 数据部分主要包括2类数据,历史数据和实时数据。历史数据的特点是种类繁多,数据量巨大,用于回测和建模。实时数据的特点是及时性要求高,用于交易。数据部分主要通过Java来构建,以保证系统的可靠性、稳定性和高性能

    • 计算部分主要是各种算法的应用,包括指标计算、历史回测、实时估值、数据挖掘等(这些是R语言擅长的,并且用Docker进行隔离,可以有效地分配计算资源)。计算部分主要通过R来完成。R让建模变得简单,几分钟就可以把想法落地变成模型

    • 展示部分主要是把计算的结果在PC或手机上进行可视化,以友好的方式将收益和风险水平反馈给用户。展示部分主要是用Javascript来完成,可以让可视化有更好的体验

    • 交易部分主要是对接交易所的交易通道,让我们可以用真钱去交易,让分析结果得到价值的体现,让技术得以变现。交易部分主要是用C++技术,以保证交易的及时性。

    从整体的结构来看,R语言是大脑,是帮助我们决策的最核心的部分,而决策也是量化投资过程中最复杂的部分。量化投资本身是一个跨学科的领域,需要系统的、科学的方法才能把这些事情做好

    相关文章

      网友评论

        本文标题:R语言量化投资(1)

        本文链接:https://www.haomeiwen.com/subject/ddtrlqtx.html