#时间序列
#自回归模型
set.seed(0)
x<-w<-rnorm(1000) # 生成符合正态分布N(0,1)的数据
for(t in 2:1000) x[t]<-x[t-1]+w[t]
tsx<-ts(x) # 生成ts时间序列的数据集,ts(data, start, end, frequency)
head(tsx);head(tsx,20) #查看数据集前6个或者自定义个数
plot(tsx) # 生成可视化图形
#sample(1:2,replace = TRUE,500) #随机生成500个1,2
a<-ar(tsx);a # 进行自回归建模
#自相关系数为0.9879 ,这是一个非常强的自相关性,所以上述的数列符合自相关的特性。
#R语言中ar()函数提供了多种自相关系数的估计,包括"yule-walker", “burg”, “ols”, “mle”, “yw”,默认是用yule-walker方法,常用的方法还有最小二乘法(ols),极大似然法(mle)。
#我们用最小二乘法,来进行参数估计。
b<-ar(tsx,method = “ols”);b #用最小二乘法的计算结果,则自相关系统数为0.9911,截距为-0.017。只有使用最小二乘法进行参数估计的时候,才会有截距。
d<-ar(tsx,method = “mle”);d #最大似然
#模型识别ACF和PACF
#手动计算出tsx数据集的ACF值
u<-mean(tsx) #均值
v<-var(tsx) #方差
p1<-sum((x[1:length(tsx)-1]-u)*(x[2:length(tsx)]-u))/((length(tsx)-1)*v);p1
p2<-sum((x[1:(length(tsx)-2)]-u)*(x[3:length(tsx)]-u))/((length(tsx)-1)*v);p2
p3<-sum((x[1:(length(tsx)-3)]-u)*(x[4:length(tsx)]-u))/((length(tsx)-1)*v);p3
#R语言中的acf()函数来计算
acf(tsx) #作图,从图中看出,数据的ACF为拖尾,存在很严重的自相关性。接下来,这时候我们用偏自相关函数确定一下AR的阶数。
acf(tsx)KaTeX parse error: Expected 'EOF', got '#' at position 6: acf #̲显示数据前30个 pacf(t…acf #偏自相关
pacf(tsx) #作图,数据满足AR(1)的自回归模型。对于上文中参数估计出的1阶自相关系数值是可以用的
#模型预测
predict(a)#变量 p r e d 表 示 预 测 值 , 变 量 pred表示预测值,变量 pred表示预测值,变量se为误差。样本外预测1个
生成50个预测值
tsp<-predict(a,n.ahead=50L) #预测样本外50个
plot(tsx)
#把预测值和误差画出来
lines(tsp p r e d , c o l = ′ r e d ′ ) l i n e s ( t s p pred,col='red') lines(tsp pred,col=′red′)lines(tsppred+tsp s e , c o l = ′ b l u e ′ ) l i n e s ( t s p se,col='blue') lines(tsp se,col=′blue′)lines(tsppred-tsp$se,col=‘blue’)#图中,黑色线为原始数据的,红色线为预测值,蓝色线为预测值的范围。这样我们就利用AR(1)模型,实现了对规律的预测计算。
install.packages(“forecast”)
library(forecast)
a2 <- arima(tsx, order=c(1,0,0))
tsp2<-forecast(a2, h=50)
plot(tsp2)
iris
AirPassengers
#时间序列分解
a1=ts(1:30,frequency = 12,start=c(2011,3))
print(a1)
plot(AirPassengers)
apts=ts(AirPassengers,frequency = 12)
f=decompose(apts)
f s e a s o n a l f seasonal f seasonalftrend
f r a n d o m f random f randomffigure
#配对交易https://ask.hellobi.com/blog/fensme/3526
#配对交易(Pairs Trading)的理念最早来源于上世纪20年代华尔街传奇交易员Jesse Livermore 的姐妹股票对交易策略。
#配对交易的基本原理是找到两个相关性较高具备均衡关系的股票或其他金融产品,做空近期相对强势的金融产品,同时做多相对弱势金融产品,等待两者价格重返均衡值时进行平仓,赚取两者的价差变动的收益。
#假设两个金融产品在未来的时期会保持良好的均衡关系,一旦两者之间的价格走势出现背离,同时这种背离在未来会被进行修复,那么就可能产生套利的机会。对于配对交易来说,就是找到这样的机会,进行统计套利。
#配对交易的特点
#配对交易与传统股票交易最大的不同之处在于,它的投资标的是两只股票的价差,是一种相对价值而非绝对价值。
#由于它在股票多头和空头方同时建仓,对冲掉了绝大部分的市场风险,所以它是一种市场的中性策略。无论大盘上涨还是下跌,配对交易策略收益都是相对平稳的,与大盘走势的相关性很低。
#在市场无趋势性机会时,可以通过配对交易避免股市系统风险,获取Alpha绝对收益。
#1. 组合筛选:在市场上寻找用于配对的金融产品或者组合,检查历史价格的走势,判断是否可以用来进行配对。主要用下面几个指标来筛选配对组合:相关系数、模型计算的均值回复速度、协整检验、基本面因素等。通过这些因素来寻找出具有稳定相关关系的组合。
#2. 风险衡量和动态组合的构建:计算配对组合各自的预期收益、预期风险、交易成本;判断两个组合之间的价差服从何种分布;判断是具有长期均衡特性还是短期均衡特性;价差发生跳跃的频率等。
#3. 确定交易规则:根据价差的特性,确定交易的频率(高频交易还是低频交易),交易的触发条件和平仓规则等。
#4. 执行交易及风险控制:除了按照交易规则执行外,还必须动态跟踪价差走势,如果发现突变,应该及时调整套利模式和交易频率。
#配对交易缺点
#统计套利的规则都是基于历史数据计算的,但历史不能代表未来,当市场发生变化模型也会失效
#市场对价格进行修复的时间难以准确判断,只能根据历史大致估计。如果回归的时间过长,对套利者的资金使用成本是个考验,也有可能导致套利失败。
set.seed(1) #设置随机种子
dates<-as.Date(‘2018-01-01’)+1:100 #100个日期
x<-round(rnorm(100,50,40),2) #随机生成X产品,100个正态分析的收盘价,四舍五入保留2位小数
y<-round(rnorm(100,50,40),2) #随机生成Y产品,100个正态分析的收盘价
df<-data.frame(dates,x,y)
df
#把数据进行可视化,可以更直观地理解数据本身。
library(ggplot2)
library(scales)
library(reshape2)
df2<-melt(df,c(‘dates’)) #数据拆分,分解
g<-ggplot(data=df2,aes(x=dates,y=value,colour=variable))
g<-g+geom_line()
g<-g+scale_x_date(date_breaks = “1 week”,date_labels=’%m-%d’)
g<-g+labs(x=‘date’,y=‘Price’)
g
#根据配对交易的假设条件,如果两个金融产品的价差是收敛的。我们用X的产品价格减去Y产品的价格,当差值为正的时候,我们认为X的价格过高,则做空X,同时Y的价格过低,则做多Y;当差值为负的时候,我们认为X的价格过低,则做多X,同时Y的价格过高,则做空Y;当差值为0时,则价格被市场所修复,则全部平仓。
#为了让差异更明显,我们定义的计算公式如下。
#价差Z = X价格-Y价格
#Z > 10时,做空X,做多Y ;Z<0时,平仓
#Z < -10时,做多X,做空Y ;Z>0时,平仓
df d i f f < − d f diff<-df diff<−dfx-df y i d x < − w h i c h ( d f y idx<-which(df yidx<−which(dfdiff>10)
idx<-idx[-which(diff(idx)==1)-1]
idx
a=which(diff(idx)==1)
a