In [1]:
import numpy as np

class bond(object):
    def __init__(self, libor, coupon, t_series):
        self.libor=libor
        self.coupon=coupon
        self.t_series = t_series
        self.ntimes=len(self.t_series)
        self.pvAvg=0.0

    def pv(self):
        deltaT= self.t_series[2:]-self.t_series[-1:]
        self.cashFlows= self.coupon*deltaT
        principal = np.zeros(deltaT)
        principal[-1:]=1.0
        self.cashFlows += principal
        pv = self.cashFlows*self.libor[2:]
        self.pvAvg = np.average(pv,axis=2)
        return

In [2]:
__author__ = 'marcopereira'
from pandas import DataFrame, Series
import numpy as np
import pandas as pd


class MC_Vasicek_Sim(object):
    def __init__(self, date_list,r0,sigmaR,muR,alphaR, simNumber,t_step):
    #SDE parameters - Vasicek SDE
        self.sigmaR = sigmaR
        self.muR = muR
        self.alphaR = alphaR
        self.simNumber = simNumber
        self.t_step = t_step
        self.r0 = r0
    #internal representation of times series - integer multiples of t_step
        self.t_series = pd.DataFrame(date_list)
    #creation of a fine grid for Monte Carlo integration
        #Create fine date grid for SDE integration
        minDay = min(date_list)
        maxDay = max(date_list)
        self.datelistlong = pd.date_range(minDay, maxDay).tolist()
        self.ntimes = len(self.datelistlong)
        return

    def getLibor(self):
        rd = np.random.random((self.ntimes,self.simNumber))   # array of numbers for the number of samples
        r = np.ones(np.shape(rd))
        r[0,:] = self.r0*r[0,:]
        nrows = np.shape(rd)[0]
        sigmaDT = self.sigmaR* np.sqrt(self.t_step)
    #calculate r(t)
        r[0,:] = self.r0*r[0,:]
        for i in np.arange(1,nrows):
            r[i,:] = r[i-1,:]+ self.alphaR*(self.muR-r[i-1,:]) + sigmaDT*rd[i,:]
    #calculate integral(r(s)ds)
        integralR = r.cumprod(axis=0)*self.t_step
    #calculate Libor
        self.libor = np.exp(-integralR)
        return

    def return_indices1_of_a(self, a, b):
        b_set = set(b)
        return [i for i, v in enumerate(a) if v in b_set]

    def return_indices2_of_a(self, a, b):
        index=[]
        for item in a:
            index.append(np.bisect.bisect(b,item))
        return np.unique(index).tolist()

    def getSmallLibor(self):
        #calculate indexes
        ind = self.return1_indices(self.date_list, self.datelistlong)
        return self.libor[ind,:]

In [3]:
__author__ = 'marcopereira'
import numpy as np
import datetime


#CashFlow Dates
t_series = np.round(np.arange(0,0.25001,0.25)*365)
base = datetime.datetime.today()
datelist = [base + datetime.timedelta(days=x) for x in t_series]

#SDE parameter
t_step = 1.0/365
r0 = 0.08
sigmaR = 0.05
muR = 0.05
alphaR=3.0
simNumber=10

#Bond parameters
coupon = 0.08

In [4]:
#Monte Carlo trajectories creation
myVasicek = MC_Vasicek_Sim(datelist, r0,sigmaR, muR, alphaR, simNumber,t_step).getLibor()

In [ ]:
libor = myVasicek.getSmallLibor()

In [5]:
myVasicek

In [ ]: