Advertisement
Guest User

Nss

a guest
Jan 20th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.30 KB | None | 0 0
  1. #Packages
  2. import os
  3. import pyodbc
  4. import numpy as np
  5. import pandas as pd
  6. import itertools
  7. from matplotlib import pyplot as plt
  8. from numpy import linalg as LA
  9.  
  10. #Date of calculation
  11. date = '10.01.2020'
  12. actual_date = pd.Timestamp('{}'.format(date))
  13.  
  14. #Uploading data
  15. tenors = pd.read_excel('Tenors.xlsx',header=None) #Tenors for Bank's yield curve
  16. tenors_values = tenors[[0]]
  17.  
  18. russian_eurobonds_data = pd.read_excel('BI1168 10.01.2020.xlsx',header=None) #Russian Eurobonds data
  19. tenors_real = russian_eurobonds_data[[0]] #Tenors for Russian Eurobonds
  20. Y = russian_eurobonds_data[[1]] #Russian Eurobonds yields - like a real Y that is used for modelling
  21.  
  22. tenors_real.describe()
  23.  
  24. #Russian Eurobonds yields
  25. plt.scatter(tenors_real,Y)
  26.  
  27. #%%time
  28. # Nelson–Siegel model (NS model) for Russian eurobonds
  29. variance = np.asscalar(Y.var(axis=0))
  30.  
  31. start_lam1 = 30 #Parameters for lambda1
  32. max_to_lam1 = 100
  33. step1 = 0.1
  34.  
  35. start_lam2 = 30 #Parameters for lambda2c
  36. max_to_lam2 = 100
  37. step2 = 0.1
  38.  
  39. lamb1 = [] #Generating list of lambdas1
  40. for k in range(max_to_lam1):
  41. lamk1 = start_lam1 + k*step1
  42. lamb1.append(lamk1)
  43.  
  44. lamb2 = [] #Generating list of lambdas2
  45. for p in range(max_to_lam2):
  46. lamk2 = start_lam2 + p*step2
  47. lamb2.append(lamk2)
  48.  
  49. ones1 = pd.DataFrame(np.ones(tenors_real.shape[0])) #Column of ones for X's massive
  50. TNP = np.array(tenors_real) #Column of Russian Eurobonds' tenors
  51. L = tenors_real.shape[0] #Getting an exact number of rows in Bank's tenors
  52.  
  53. X1 = []
  54. X2 = []
  55. X3 = []
  56. R2 = []
  57. rmse = []
  58. b1 = []
  59. b2 = []
  60. b3 = []
  61. b4 = []
  62.  
  63. num = len(lamb1)*len(lamb2)
  64. index = []
  65. for i in range(num):
  66. ind = i
  67. index.append(ind)
  68. ind = index.copy()
  69.  
  70. z = pd.DataFrame(index = index, columns = ['lam1', 'lam2', 'R2', 'rmse', 'b1', 'b2', 'b3', 'b4'])
  71.  
  72. for lam1 in lamb1:
  73. for lam2 in lamb2:
  74. for j in range(tenors_real.shape[0]): #Generating independent variables for each lambda1 and lambda2
  75. x1j = (1-np.exp(-TNP[j]/lam1))/(TNP[j]/lam1)
  76. x2j = x1j-np.exp(-TNP[j]/lam1)
  77. x3j = ((1-np.exp(-TNP[j]/lam2))/(TNP[j]/lam2))-np.exp(-TNP[j]/lam2)
  78. X1.append(x1j)
  79. X2.append(x2j)
  80. X3.append(x3j)
  81. X1 = pd.DataFrame(X1) #Combining all rows of independent variables into one massive of X
  82. X2 = pd.DataFrame(X2)
  83. X3 = pd.DataFrame(X3)
  84. XX = pd.concat([ones1,X1,X2,X3], axis =1)
  85. X = XX.to_numpy()
  86. beta = LA.lstsq(X,Y)[0] #Getting coefficients from multiplying matrices
  87.  
  88. residuals = np.array(Y)-np.matmul(X,beta)
  89. SSEi = np.asscalar(np.matmul(residuals.T,residuals))
  90. SSEi_aver = SSEi/L
  91. rmsei = (SSEi/L)**0.5
  92. R2i = 1 - SSEi_aver/variance
  93. b1i = np.asscalar(np.array(beta)[0])
  94. b2i = np.asscalar(np.array(beta)[1])
  95. b3i = np.asscalar(np.array(beta)[2])
  96. b4i = np.asscalar(np.array(beta)[3])
  97. zi = [lam1, lam2, R2i, rmsei, b1i, b2i, b3i, b4i]
  98. z.loc[какой-то индекс] = zi??????
  99. z.index = range(z.shape[0])
  100. rmse = list(z['rmse'])
  101. index_optimal = rmse.index(min(rmse))
  102. b1 = z['b1'][index_optimal]
  103. b2 = z['b2'][index_optimal]
  104. b3 = z['b3'][index_optimal]
  105. b4 = z['b4'][index_optimal]
  106. lbo1 = z['lm1'][index_optimal]
  107. lbo2 = z['lm2'][index_optimal]
  108. rmse = z['rmse'][index_optimal]
  109.  
  110. #Lambda function that will be used for bank's tenors
  111. yc = lambda tau: b1 + b2*((1-np.exp(-tau/lbo1))/(tau/lbo1)) + b3*((1-np.exp(-tau/lbo1))/(tau/lbo1) - np.exp(-tau/lbo1)) + b4*((1-np.exp(-tau/lbo2))/(tau/lbo2) - np.exp(-tau/lbo2))
  112.  
  113. rus_eurobonds_nss = []
  114. for t in range(tenors.shape[0]):
  115. yct = yc(tau = tenors[0][t])
  116. rus_eurobonds_nss.append(yct)
  117. rus_eurobonds_nss = pd.DataFrame(rus_eurobonds_nss)
  118.  
  119. beta = [b1,b2,b3,b4]
  120.  
  121. X4 = []
  122. X5 = []
  123. X6 = []
  124.  
  125. for j in range(tenors_values.shape[0]):
  126. x4j = (1-np.exp(-TNP[j]/lbo1))/(TNP[j]/lbo1)
  127. x5j = x4j-np.exp(-TNP[j]/lbo1)
  128. x6j = (1-np.exp(-TNP[j]/lbo2))/(TNP[j]/lbo2)-np.exp(-TNP[j]/lbo2)
  129. X4.append(x4j)
  130. X5.append(x5j)
  131. X6.append(x6j)
  132. X4 = pd.DataFrame(X4)
  133. X5 = pd.DataFrame(X5)
  134. X6 = pd.DataFrame(X6)
  135. ones2 = pd.DataFrame(np.ones(tenors_values.shape[0]))
  136. XX = pd.concat([ones2,X4,X5,X6], axis =1)
  137. XX.columns = ['0','1','2','3']
  138.  
  139. y_hat = np.matmul(XX,beta)
  140.  
  141. fig= plt.figure(figsize=(20,8))
  142. plt.plot(Y)
  143. plt.plot(y_hat)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement