一、远期利率
有时企业会根据规划在未来的时间进行融资安排,如在1年后向银行借款,期限为3年,也就意味着企业的融资初始日是1年后,到期日则是4年后,这种发生在未来的交易即为“远期交易”,对于远期交易,零息利率是不适用的,那么就必须要使用远期利率。远期利率通常可以根据零息利率曲线上对应的即期利率求得。
假设有债券在不同期限下的零息利率如下:
期限 | 1年 | 2年 | 3年 | 4年 | 5年 |
零息利率(连续复利) | 2.5% | 2.8% | 3.2% | 3.7% | 4.5% |
现要求出第2-5年的远期利率。
通过上述数据可知,投资100元后,在1-5年后投资者可以得到的本息和是:
100*e0.25*1 =102.5315
100*e0.28*2 =105.7598
100*e0.32*3 =110.0759
100*e0.37*4 =115.9513
100*e0.45*5 =125.2323
那么第2年的远期利率(设为rf2,后面的类似为rf3、rf4、rf5)可以通过1年期和2年期的零息利率求出:
100*e0.25*1 *erf2*1=100*e0.28*2
同理:
100*e0.28*2 *erf3*1=100*e0.32*3
100*e0.32*3 *erf4*1=100*e0.37*4
100*e0.37*1 *erf5*1=100*e0.45*5
联立如上方程组:
import numpy as np
lxll=np.array([0.025,0.028,0.032,0.037,0.045])
def yqll(rr):
rr2,rr3,rr4,rr5=rr
yq2=100*np.exp(lxll[1]*2)-100*np.exp(lxll[0]*1.0)*np.exp(rr2*1.0)
yq3=100*np.exp(lxll[2]*3)-100*np.exp(lxll[1]*2.0)*np.exp(rr3*1.0)
yq4=100*np.exp(lxll[3]*4)-100*np.exp(lxll[2]*3.0)*np.exp(rr4*1.0)
yq5=100*np.exp(lxll[4]*5)-100*np.exp(lxll[3]*4.0)*np.exp(rr5*1.0)
return np.array([yq2,yq3,yq4,yq5])
还是利用scipy模块中的optimize子模块来求解:
from scipy import optimize as sci
rk=sci.fsolve(yqll,[0.1,0.1,0.1,0.1])
for i in rk:
print(i)
可以得到结果为:
0.0310000000110587
0.03999999997813826
0.05200000000790241
0.07700000000351453
同样,也可以根据远期利率的计算公式来求取:
rf=r2+(r2-r1)*t1/(t2-t1)
def yqll1(rr1,rr2,t1,t2):
#r1,r2是对应t1,t2年限的零息利率,t1,t2是期限长度
return rr2+(rr2-rr1)*t1/(t2-t1)
tlist=np.arange(1,6)
rf=yqll1(rr1=lxll[0:4],rr2=lxll[1:],t1=tlist[0:4],t2=tlist[1:])
rf
求得的结果为:
array([0.031, 0.04 , 0.052, 0.077])
基本与上面的方法得到的相同。
二、远期利率协议
远期利率协议FRA是交易双方约定在未来某日交换协议期间内一定名义本金的基础上分别以固定利率和参考利率计算的利息的金融合约。其中,买入方(多头)支付以固定利率计算的利息,卖出方(空头)支付以参考利率计算的利息。若合约中约定的固定利率大于对应的同期参考利率,则多头需支付空头固定利率与参考利率的利差乘以本金,反之则空头支付给多头固定利率与参考利率的利差乘以本金。
该现金流用数学表达式表达为:
L*(Rm-Rk)(T2-T1)
而在实践中经常会有期初就进行贴现支付的情况,那么则变为:
L(Rm-Rk)*(T2-T1)/(1+(T2-T1)*Rm
其中L为本金,Rm为参考利率,Rk为固定利率,T1、T2为时间期限
如:假定某公司预期在第1年末向银行贷款1000万元,贷款期限为3个月,为预防利率上涨风险,公司与银行签订了一份远期利率协议,公司为多头,协议规定公司在第1年末对这1000万元贷款能获取3%的3个月期固定利率,参考利率为3个月期的Shibor利率。要求对应的到期现金流。
def fra(rk,rm,l,t1,t2,position,time):
#position表示是多头还是空头,time表示是起初还是到期
if position=='long':
if time=='begin':
return ((rm-rk)*(t2-t1)*l)/(1+(t2-t1)*rm)
else:
return (rm-rk)*(t2-t1)*l
else:
if time=='begin':
return ((rk-rm)*(t2-t1)*l)/(1+(t2-t1)*rm)
else:
return (rk-rm)*(t2-t1)*l
fra_long_begin=fra(rk=0.03,rm=0.035,l=10000000,t1=1.0,t2=1.25,position='long',time='begin')
fra_long_end=fra(rk=0.03,rm=0.035,l=10000000,t1=1.0,t2=1.25,position='long',time='end')
fra_short_begin=fra(rk=0.03,rm=0.035,l=10000000,t1=1.0,t2=1.25,position='short',time='begin')
fra_short_end=fra(rk=0.03,rm=0.035,l=10000000,t1=1.0,t2=1.25,position='short',time='end')
print(fra_long_begin,fra_long_end,fra_short_begin,fra_short_end)
可以得到4种不同情况下的结果:
12391.573729863703 12500.000000000011 -12391.573729863703 -12500.000000000011
三、远期协议定价
对于远期协议,我们经常需要对其进行定价,也就是判断合约的价值。对于远期协议的多头,合约的价值是:
Vfra=L*(Rf-Rk)(T2-T1)e-R*T2
反之对于空头,合约的价值是:
Vfra=L(Rk-Rf)(T2-T1)*e-R*T2
如:某公司与银行达成一份远期利率协议,约定该公司在第2年末至第2.25年末期间将收取固定利率3.8%(每季度复利一次),并在第2年末至第2.25年期间支付3个月期的Shibor,远期利率协议本金为1000万元。假定第2年末至第2.25年末期间的Shibor远期利率为4%(每季度复利一次),此外,2.25年期的无风险利率为5%(连续复利)。
根据上述公式,我们可以定义如下函数求解合约价值:
def vfra(rk,rf,r,l,t1,t2,position):
'''
rk是远期利率协议中的固定利率
rf是当前观察到的未来t1-t2期间的远期参考利率
r是期限长度为t2的无风险利率
l是远期利率协议的本金
t1,t2是期限长度
position是协议多头或空头,long为多头'''
if position=='long':
return l*(rf-rk)*(t2-t1)*np.exp(-r*t2)
else:
return l*(rk-rf)*(t2-t1)*np.exp(-r*t2)
vfra_s=vfra(0.038,0.04,0.05,10000000,2.0,2.25,'short')
vfra_l=vfra(0.038,0.04,0.05,10000000,2.0,2.25,'long')
print(vfra_s,vfra_l)
可以得到:
-4467.986735542582 4467.986735542582
即空头方的合约价值为前者,多头方的合约价值为后者。