原创R语言用神经网络改进NelsonSiegel模型拟合收益率曲线数据分析报告论文附代码数据.docx
- 文档编号:3987761
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:9
- 大小:218.44KB
原创R语言用神经网络改进NelsonSiegel模型拟合收益率曲线数据分析报告论文附代码数据.docx
《原创R语言用神经网络改进NelsonSiegel模型拟合收益率曲线数据分析报告论文附代码数据.docx》由会员分享,可在线阅读,更多相关《原创R语言用神经网络改进NelsonSiegel模型拟合收益率曲线数据分析报告论文附代码数据.docx(9页珍藏版)》请在冰豆网上搜索。
原创R语言用神经网络改进NelsonSiegel模型拟合收益率曲线数据分析报告论文附代码数据
R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线数据分析报告
在先前我们提供了Nelson-Siegel模型收敛失败的示例,我们已经展示了它的一些缺陷。
蒙特卡洛模拟帮助我们理解:
library(YieldCurve)
#StartwithsamplevaluesforFedYieldCurveon1982-04-30
data(FedYieldCurve)
rate.Fed=first(FedYieldCurve,'5month')
maturity.Fed<-c(3/12,0.5,1,2,3,5,7,10)
NSParameters<-Nelson.Siegel(rate=rate.Fed,maturity=maturity.Fed)
pp=NSParameters[5,]#parametersinsxtsformat
MATURITY_BASES=c(0.25,0.5,1,1.5,2,3,4,5,7,10,12,15,20,25,30)#maturitiesinyears
VOLAs=0.005*sqrt(MATURITY_BASES)#volatilies(theygrowatsqrt-speedastimegrows)
VOLAs[1:
3]=VOLAs[1:
3]*c(4,3,2)#shortendisusuallymorevolatile
N_MAT=length(MATURITY_BASES)#numberofmatutiries
N_SIMULATIONS=1e5
paramArray=array(0.0,dim=c(N_SIMULATIONS,4))#logNSparamsforeachsimulation
oldYieldsArray=array(0.0,dim=c(N_SIMULATIONS,N_MAT))
newYieldsArray=array(0.0,dim=c(N_SIMULATIONS,N_MAT))
newNsYieldsArray=array(0.0,dim=c(N_SIMULATIONS,N_MAT))
maxDistanceArray=array(0.0,dim=N_SIMULATIONS)
relativeMaxDistanceArray=array(0.0,dim=N_SIMULATIONS)
for(jin1:
N_SIMULATIONS)
{
oldYields=NSrates(pp,MATURITY_BASES)
newYields=oldYields+rnorm(N_MAT,rep(0.0,N_MAT),VOLAs)
newMATs=MATURITY_BASES-1.0/365#nextdayallmatsbecome1dayshorter
pp=Nelson.Siegel(newYields,newMATs)
newNsYields=NSrates(pp,newMATs)
npo=c(newYields,oldYields)
plot(MATURITY_BASES,oldYields,ylim=c(min(npo),max(npo)))
lines(MATURITY_BASES,oldYields)
points(MATURITY_BASES,newYields,col="red",pch=4)
points(newMATs,newNsYields,col="blue")
lines(newMATs,newNsYields,col="blue")
oldYieldsArray[j,]=as.numeric(oldYields)
newYieldsArray[j,]=as.numeric(newYields)
newNsYieldsArray[j,]=as.numeric(newNsYields)
maxDistanceArray[j]=max(abs(oldYieldsArray[j,]-newNsYieldsArray[j,]))
relativeMaxDistanceArray[j]= maxDistanceArray[j]/max(abs(oldYieldsArray[j,]))
paramArray[j,]=as.numeric(pp)
}
plot(density(maxDistanceArray))
plot(density(log(maxDistanceArray)))
idx=which.max(maxDistanceArray)
maxDistanceArray[which.max(maxDistanceArray)]
relativeMaxDistanceArray[which.max(relativeMaxDistanceArray)]
我们要做的是:
我们从一些收益率曲线开始,然后逐步地随机修改收益率,最后尝试拟合NS模型以新的收益。
因此我们对此进行了模拟。
oldYields=NSrates(pp,MATURITY_BASES)
newYields=oldYields+rnorm(N_MAT,rep(0.0,N_MAT),VOLAs)
newMATs=MATURITY_BASES-1.0/365#nextdayallmatsbecome1dayshorter
pp=Nelson.Siegel(newYields,newMATs)
newNsYields=NSrates(pp,newMATs)
请注意,对于Nelson-Siegel模型,此Monte-Carlo模拟在某种意义上是“仁慈的”,因为我们始终假定前一步的收益(旧收益率) 与NS曲线完全匹配。
但是,即使如此仁慈也无法完全避免麻烦。
我们如何发现这些麻烦?
在每一步中,我们计算两条相邻曲线之间的最大距离(supremum-norm):
maxDistanceArray[j]=max(abs(oldYieldsArray[j,]-newNsYieldsArray[j,]))
最后,我们仅找到到上一条曲线的最大距离的步骤,这就是收敛失败的示例。
好的,发现问题了,但是该怎么办呢?
maxDistanceArray的概率密度 如下所示:
分布尾部在视觉上在0.08处减小,但对于收益率曲线而言,每天偏移8个基点并不罕见。
因此,尽管我们进行了1e5=10000蒙特卡洛模拟,但只有极少数情况,我们可以将其标记为不良。
训练神经网络绝对是不够的。
而且,正如我们之前指出的那样,两条Nelson-Siegel曲线可能彼此非常接近,但其参数却彼此远离。
由于模型是线性的,因此有可能假设beta的极大变化(例如,超过95个位数)是异常值,并将其标记为不良。
mmScaler<-function(x){(x-min(x))/(max(x)-min(x))} #MinMaxScaler
beta0_ds=abs(diff(paramArray[1:
N_SIMULATIONS,1]))/abs(paramArray[1:
(N_SIMULATIONS-1),1])
beta1_ds=abs(diff(paramArray[1:
N_SIMULATIONS,2]))/abs(paramArray[1:
(N_SIMULATIONS-1),1])
beta2_ds=abs(diff(paramArray[1:
N_SIMULATIONS,3]))/abs(paramArray[1:
(N_SIMULATIONS-1),1])
b0=mmScaler(beta0_ds)
b1=mmScaler(beta1_ds)
b2=mmScaler(beta2_ds)
#nowfilteroutjumpingbetas
QUANTILE=0.95
q_b0=as.numeric(quantile(b0,QUANTILE))
q_b1=as.numeric(quantile(b1,QUANTILE))
q_b2=as.numeric(quantile(b2,QUANTILE))
idx=intersect(intersect(which(b0 par(mfrow=c(3,3)) plot(density(log(b0))) plot(density(log(b1))) plot(density(log(b2))) plot(density(log(b0[idx]))) plot(density(log(b1[idx]))) plot(density(log(b2[idx]))) plot(density(b0[idx])) plot(density(b1[idx])) plot(density(b2[idx])) #de-mean b0=b0-mean(b0) b1=b1-mean(b1) b2=b2-mean(b2) #trainneuralnetwork X=cbind(b0,b1,b2) Y=array(0,dim=(N_SIMULATIONS-1)) Y[idx]=1 然后我们可以训练神经网络 SPLT=0.8 library(keras) b=floor(SPLT*(N_SIMULATIONS-1)) x_train=X[1: b,] x_test=X[(b+1): (N_SIMULATIONS-1),] y_train=to_categorical(Y[1: b],2) y_test=to_categorical(Y[(b+1): (N_SIMULATIONS-1)],2) model<-keras_model_sequential() model%>% layer_dense(units=3,activation='tanh',input_shape=dim(X)[2])%>% layer_dense(units=2,activation='tanh')%>% #reluhere(sometimes)givesslightlybetteraccuracythantanh layer_dense(units=2,activation='softmax') summary(model) model%>%compile( loss='categorical_crossentropy', optimizer=optimizer_rmsprop(), metrics=c('accuracy') ) history<-model%>%fit( x_train,y_train, epochs=100,batch_size=100, validation_split=0.2 ) plot(history) model%>%evaluate(x_test,y_test) 神经网络不仅在样本中而且在验证集上都提供了高精度。 如果模拟新数据集,例如VOLAs=0.005*sqrt(MATURITY_BASES) , VOLAs=0.05*sqrt(MATURITY_BASES) 对模型进行修改 将无法识别新数据集上的不良情况。 可以进行以下检查: ##################################### ###loadnewworkspaceatthisstep### ##################################### beta0_ds_2=abs(diff(paramArray[1: N_SIMULATIONS,1]))/abs(paramArray[1: (N_SIMULATIONS-1),1]) beta1_ds_2=abs(diff(paramArray[1: N_SIMULATIONS,2]))/abs(paramArray[1: (N_SIMULATIONS-1),2]) beta2_ds_2=abs(diff(paramArray[1: N_SIMULATIONS,3]))/abs(paramArray[1: (N_SIMULATIONS-1),3]) b0_2=mmScaler(beta0_ds_2) b0_2=b0_2-mean(b0_2) b1_2=mmScaler(beta1_ds_2) b1_2=b1_2-mean(b1_2) b2_2=mmScaler(beta2_ds_2) b2_2=b2_2-mean(b2_2) X2=cbind(b0_2,b1_2,b2_2) result=model%>%predict(X2) idxRes=which(round(result[,1])==1) 不足与展望: 尽管我们在两种情况下均对数据进行了归一化和平均化,但是模型波动性的线性变化对尾部分位数具有很高的非线性影响。 那么,我们是否需要一个更复杂的AI模型?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 原创 语言 神经网络 改进 NelsonSiegel 模型 拟合 收益率 曲线 数据 分析 报告 论文 代码
链接地址:https://www.bdocx.com/doc/3987761.html