基于NS模型+久期衡量利率风险(Julia)
生活随笔
收集整理的這篇文章主要介紹了
基于NS模型+久期衡量利率风险(Julia)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天剛剛交完金融風險管理的作業,我是覺得這次作業可以綜合體現我上大學以來學到的東西,甚至可以代表我的水平了(讓大家見笑了)。
首先,我們利用NS模型計算國債的利率期限結構。
假設順勢遠期利率形式滿足下式:
| (1) |
其中,為瞬時遠期收益率,為水平因子,極限下不會衰減,代表長期成分貢獻,為斜率因子,其衰減速度最快,代表短期成分貢獻,為曲率因子,從0開始并衰減至0,代表中期成分貢獻,為衰減率。到期收益率為瞬時遠期收益率的均值,其計算公式如下:?
| (2) |
通過式(1)(2)計算得國債利率期限結構,作為企業債的貼現率
using XLSX#讀入數據 t=XLSX.readtable("D://julia//NS.xlsx","Sheet1","A") r=XLSX.readtable("D://julia//NS.xlsx","Sheet1","B") t=t[1][1] r=r[1][1]function NS(r,t,γ)#基于NS模型的OLS回歸x1=zeros(length(t))#用于儲存x1for i in 1:length(t)#計算各期x1的值x1[i]=(γ/t[i])*(1-exp(-t[i]/γ))endx2=zeros(length(t))#用于儲存x2for i in 1:length(t)#計算各期x2的值x2[i]=(γ/t[i])*(1-exp(-t[i]/γ))-exp(-t[i]/γ)end#方法一:用GLM包進行OLS回歸#using GLM#using DataFrames#data=DataFrame(:x1=>Float64.(x1),:x2=>Float64.(x2),:r=>Float64.(r))#model=lm(@formula(r~x1+x2),data)X=[ones(length(t)) x1 x2]#將所有解釋變量加常數項放入X中Y=r#被解釋變量beta=(inv(X'*X))*(X')*YR=zeros(length(t))#預測for i in 1:length(t)#依據回歸后的表達式計算各剩余期限的到期收益率R[i]=beta[1]+beta[2]*x1[i]+beta[3]*x2[i]enderror=0#計算誤差for i in 1:length(t)error=error+(R[i]-r[i])^2endreturn error,beta,R endγ=0.5#設置γ的初始值 n=1#計次 Γ=zeros(60)#用于儲存每次的γ Error=zeros(60)#用于儲存每次的誤差,即目標函數 while γ<=30#設置γ的終值error,beta,R=NS(r,t,γ)Γ[n]=γ#儲存γError[n]=error#儲存誤差γ=0.5+0.5*n#增加γ的值(這樣表示可以減少計算精度問題,但不能完全避免)n=n+1#累計次數 end#尋找誤差最小時所對應的索引值,并輸出其對應的γ a=Error[1] for j in 1:length(Error)b=Error[j]if b<=aa=bglobal m=jend end error,beta,R=NS(r,t,Γ[m]) γ=Γ[m]接下來,用NS模型計算出來的國債利率期限結構作為貼現率,計算久期。主要是麥考利久期、FW久期、修正久期和凸度。由于學藝不精,一開始沒想起來麥考利久期假設各期利率相等,寫了個貼現函數,后來學FW久期剛好用上了。不過,說實話我感覺我的代碼還是一如既往的效率不高。
#初步準備: function Tiexian(r,P,t) #貼現函數,r為貼現利率序列(長度為10,從第1年到第10年),P為現金流序列(長度為t,從對應(10-t)年份到第10年),t為時間長度m=zeros(t)#生成長度為t的零矩陣for j in 1:t#取出P中的元素,進行操作后給m賦值for i in (length(r)-t+1):(length(r)-t+j)#取出對應年份的利率進行操作P[j]=P[j]/((1+r[i])^1)#循環除以每年的利率進行貼現endm[j]=P[j]#給m賦值endreturn m end function PV(F,i,r,t)C=F*i#計算每月利息n=zeros(t)#生成長度為t的零矩陣for j in 1:(t-1)#計算每個月的利息n[j]=Cendn[t]=C+F#計算最后一個月的利息q=Tiexian(r,n,t)#貼現得到當期債券價值return sum(q) end#麥考利久期、FW久期 function D(F,i,r,t)#麥考利久期函數,F為債券面值,i為票面利率,r為貼現利率(r相同則計算麥考利久期,r為各期的貼現率則為FW久期),t為時間長度C=F*i#計算每月利息(也可以把C換成序列,這樣就可以計算每月利息不同的情況,還省掉了下面的一些步驟)m=zeros(t)#生成長度為t的零矩陣for j in 1:(t-1)#計算每個月的久期分子并付給mm[j]=j*C#t*C,時間*利息endm[t]=t*(C+F)#最后一個單獨賦值(債券本金償還)p=Tiexian(r,m,t)#貼現得到麥考利久期的分子n=zeros(t)#生成長度為t的零矩陣for j in 1:(t-1)#計算每個月的利息n[j]=Cendn[t]=C+F#計算最后一個月的利息q=Tiexian(r,n,t)#貼現得到當期債券價值return sum(p)/sum(q)#麥考利久期 end#修正久期(麥考利久期隱含假設收益率不變,即y為定值) function reviseD(P,i,r,t)#修正久期函數y=sum(r)/length(r)#計算債券到期時間內利率的均值reviseD=D(P,i,r,t)/(1+y)#依據修正久期和久期之間的關系return reviseD end#依據修正久期計算資產凈現值變化量: rd=reviseD(P,i,r,t) dy=0.01 dp=-P*rd*dy#凸度: function C(F,i,r,t)#凸度函數C=F*i#計算每月利息(也可以把C換成序列,這樣就可以計算每月利息不同的情況,還省掉了下面的一些步驟)m=zeros(t)#生成長度為t的零矩陣for j in 1:(t-1)#計算每個月的久期分子并付給mm[j]=j*(j+1)*C#t*(t+1)*C,時間*(時間+1)*利息endm[t]=t*(t+1)*(C+F)#最后一個單獨賦值(債券本金償還)p=Tiexian(r,m,t)#貼現得到凸度的分子n=zeros(t)#生成長度為t的零矩陣for j in 1:(t-1)#計算每個月的利息n[j]=Cendn[t]=C+F#計算最后一個月的利息q=Tiexian(r,n,t)#貼現得到當期債券價值y=sum(r)/length(r)return sum(p)/(sum(q)*(1+y)^2) #凸度 end#依據凸度計算資產凈現值變化量: c=C(P,i,r,t) dy=0.01 dP=-P*rd*dy+0.5*P*c*(dy^2)總結
以上是生活随笔為你收集整理的基于NS模型+久期衡量利率风险(Julia)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业智能网关BL110应用之63:如何实
- 下一篇: 软件开发V模型--解读