Die zweite in einer Reihe von Ableitungen, die Sie mit Python lernen können. Es ist eine Weile her, aber ich werde bis zur Optionspreisgestaltung fortfahren. Wenn Sie den ersten noch nicht gesehen haben, schauen Sie bitte.
Erstens: Berechnung des Devisenterminkurses 2. Zeichnen Sie eine Zinsstrukturkurve (JPY-Libor-Kurve)
Schreiben Sie, wie Sie eine einfache Zinsstrukturkurve zeichnen. Wir berücksichtigen hier keine Sicherheiten, Tenor-Spreads oder Basis-Spreads. Die Welt der Einzelkurven, nicht der Mehrfachkurven. Diesmal ist dies zunächst eine Kreiskurve. Nächstes Mal werde ich einen Dollar schreiben.
Neben der Boot Strap-Methode gibt es noch andere Möglichkeiten, eine Kurve zu zeichnen. Hier wird die Boot Strap-Methode erklärt.
Tatsächlich ist es notwendig, die Berechnungsmethode für die Anzahl der Tage (ob ein Jahr 360 Tage oder 365 Tage usw. ist) und die Feiertage zu berücksichtigen, aber Es ist mir hier egal. Es werden nur der Cash Rate und der Swap Rate verwendet.
Im Falle eines Yen-Zinsswaps ist der Umtausch ein 6-Monats-Libor auf der variablen Seite und ein 6-Monats-Festzins auf der festen Seite.
Aktuelle Zeit t, Fälligkeit T, Die Swap-Rate zum Zeitpunkt t der Fälligkeit T ist S (t, T), Wenn der Abzinsungsfaktor des Zeitpunkts t der Fälligkeit T DF ist (t, T)
Der aktuelle Wert P (t) auf der Festzinsseite beträgt
P(t) = \frac{1}{2}S(t,T) \times DF(t, t_{0.5}))
+ \frac{1}{2}S(t,T) \times DF(t, t_{1.0}))
+ ...
+ \frac{1}{2}S(t,T) \times DF(t, T))
Wird sein.
Der aktuelle Wert F (t) auf der variablen Zinsseite ist
F(t) = \frac{1}{2}f(t, t_0, T_{0.5}) \times DF(t, t_{0.5})
+ \frac{1}{2}f(t, t_{0.5}, T_{1.0}) \times DF(t, t_{1.0})
+ ...
+ \frac{1}{2}f(t, T-0.5, T) \times DF(t, T)
Wird sein.
Hier repräsentiert f (t, t1, t2) den Yen-Terminkurs zum Zeitpunkt t1, der zum Zeitpunkt t beginnt, und den Zeitpunkt t2, zu dem er fällig wird. Der Zinsswap-Vertrag wird geschlossen, wenn der aktuelle Wert auf der festen Seite und der aktuelle Wert auf der variablen Seite gleich sind.
P(t) = F(t)
Ist festgelegt.
Dann ist beim tatsächlichen Zinsswap das fiktive Kapital gleich und das Kapital wird nicht ausgetauscht, aber der Einfachheit halber wird unter Berücksichtigung des fiktiven Kapitals 1 die folgende Formel erhalten.
\frac{1}{2}S(t,T) \times DF(t, t_{0.5}))
+ \frac{1}{2}S(t,T) \times DF(t, t_{1.0}))
+ ...
+ \frac{1}{2}S(t,T) \times DF(t, T))
+ 1 \times DF(t, T) \\
=
\frac{1}{2}f(t, t_0, T_{0.5}) \times DF(t, t_{0.5})
+ \frac{1}{2}f(t, t_{0.5}, T_{1.0}) \times DF(t, t_{1.0})
+ ...
+ \frac{1}{2}f(t, T-0.5, T) \times DF(t, T)
+ 1 \times DF(t, T)
Der Wert auf der rechten Seite ist 1, da nur die Forward Rate auf den aktuellen Wert zurückgesetzt wird.
(Ergänzung) Warum 1? Betrachten Sie eine variabel verzinsliche Libor-Anleihe mit einem Nennwert von 100. Der Wert des Coupons entspricht 100 Auszahlungen zum Zeitpunkt des Kaufs, 100 Auszahlungen bei Einlösung (zukünftig) und Libor. Mit anderen Worten, wenn der fiktive Kapitalbetrag 1 beträgt, beträgt der abgezinste variable Libor-Zinssatz und der Kapitalbetrag 1 1.
aus diesem Grund,
Grundformel
\frac{1}{2}S(t,T) \times DF(t, t_{0.5}))
+ \frac{1}{2}S(t,T) \times DF(t, t_{1.0}))
+ ...
+ \frac{1}{2}S(t,T) \times DF(t, T))
+ 1 \times DF(t, T)
= 1
Wird sein.
Die Bootstrap-Methode verwendet diese Formel, um nacheinander den DF von dem mit der kürzesten Laufzeit zu finden.
Ich habe es lange geschrieben, aber die Bootstrap-Methode selbst Verwenden Sie, wie der Name schon sagt, das vorherige Ergebnis und nehmen Sie die nachfolgenden Ergebnisse nacheinander auf.
Lassen Sie uns nun den DF nacheinander berechnen.
Es wurde gesagt, dass der DF nacheinander berechnet wird, aber innerhalb eines Jahres wird der DF unter Verwendung des Libor-Zinssatzes, des sogenannten Cash-Satzes, berechnet, so dass der DF direkt aus dem Zinssatz berechnet werden kann.
Der 6-Monats-Libor wird verwendet, um den DF nach 0,5 Jahren zu berechnen. Zusätzlich erfolgt die Berechnung durch einfache Zinsberechnung.
DF(t, t_{0.5}) = \frac{1}{(1 + r(t, t_{0.5}) \times \frac{1}{2})}
Hier repräsentiert r (t, T) den Yen-Libor-Zinssatz T zum Zeitpunkt t.
Verwenden Sie den 12-Monats-Libor, um die DF nach 1 Jahr zu berechnen. (Verwenden Sie manchmal 1Y Swap Rate)
DF(t, t_{1.0}) = \frac{1}{(1 + r(t, t_{1.0}))}
Der DF bis zu 1 Jahr unter Verwendung des Libor-Zinssatzes (Cash Rate) kann nach der folgenden Formel berechnet werden.
DF = \frac{1}{1 + r(t) * t / 100} \\
r(t):Libor-Zinssatz bei t(\%Von reeller Zahl umrechnen) \\
t:Jahre\\
Von hier an die Geschichte der sequentiellen Suche nach DF. Nach Ergänzung des vom Markt erworbenen Libor-Swap-Zinssatzes und des sogenannten Swap-Satzes in Schritten von 0,5 Jahren wird er nach der oben genannten Formel der Bootstrap-Methode berechnet.
Der Grund für alle 0,5 Jahre ist, dass der angenommene Yen-Zinsswap-Coupon eine Halbjahresrolle ist.
Bei Berücksichtigung der Zeit von 1,5 Jahren in der Formel der Boot Strap-Methode
\frac{1}{2}S(t, t_{1.5}) \times DF(t, t_{0.5}))
+ \frac{1}{2}S(t, t_{1.5}) \times DF(t, t_{1.0}))
+ \frac{1}{2}S(t, t_{1.5}) \times DF(t, t_{1.5}))
+ 1 \times DF(t, t_{1.5})
= 1
Wird sein. (Die von der Boot Strap-Methode abgeleitete Formel wird in 1,5 Jahren gestoppt.)
Die einzige unbekannte Variable hier ist DF (t, t_ {1.5}). aus diesem Grund,
DF(t, t_{1.5}) = \frac{ 1 - ( DF(t, t_{0.5}) + DF(t, t_{1.0}) ) \times \frac{S(t, t_{1.5})}{2}}{ 1 + \frac{S(t, T_{1.5})}{2} }
Daher kann der DF für 1,5 Jahre berechnet werden.
Ähnliches gilt für DF bei einer Laufzeit von 2 Jahren.
\frac{1}{2}S(t, t_{2.0}) \times DF(t, t_{0.5}))
+ \frac{1}{2}S(t, t_{2.0}) \times DF(t, t_{1.0}))
+ \frac{1}{2}S(t, t_{2.0}) \times DF(t, t_{1.5})) \\
+ \frac{1}{2}S(t, t_{2.0}) \times DF(t, t_{2.0}))
+ 1 \times DF(t, t_{2.0})
= 1
Weil es möglich ist
DF(t, t_{2.0}) = \frac{ 1 - ( DF(t, t_{0.5}) + DF(t, t_{1.0}) + DF(t, t_{1.5}) ) \times \frac{S(t, t_{2.0})}{2}}{ 1 + \frac{S(t, T_{2.0})}{2} }
Und kann berechnet werden.
Der DF für einen Zeitraum von mehr als einem Jahr unter Verwendung des Libor-Swap-Zinssatzes (Swap-Satz) kann bei Verwendung der Bootstrap-Methode nach der folgenden Formel berechnet werden.
DF(t, T) = \frac{ 1 - \sum_{i=0.5}^{T-0.5}DF(t, t_i) \times \frac{S(t, T)}{2}}{1 + \frac{S(t,T)}{2}} \\
(T > 1)
Aus dem berechneten DF kann die kontinuierliche Zinsbasis (Nullsatz) berechnet werden.
y(t, T) = \frac{ \ln DF(t, T) }{ -(T - t) }
DF(t, T) = e^{-rτ}Verformung von
τ:Zeitraum(T - t)
r:Kassakurs von Punkt t bis zur Fälligkeit T.(Nullrate, y(t,T)Das)
y (t, T) repräsentiert den Nullsatz auf kontinuierlicher Zinsbasis zum Zeitpunkt t der Fälligkeit T. Für andere Nullraten als die berechnete Laufzeit wird DF durch lineare Interpolation oder Spline-Interpolation berechnet.
Wenn Sie die berechnete Nullrate zeichnen, können Sie eine Kurve zeichnen.
Der Nullsatz ist die endgültige Rendite von auf Zinseszinsen basierenden Diskontanleihen (Nullkuponanleihen). Diskontierte Anleihen sind Finanzprodukte, die erst am Fälligkeitstag einen Cashflow generieren. Der Nullsatz ist der Zinssatz, der ab dem gegenwärtigen Zeitpunkt beginnt, und wird auch als Kassakurs bezeichnet, um ihn vom Terminkurs zu unterscheiden. Der Nullsatz wird verwendet, wenn der zukünftige Cashflow auf den aktuellen Wert abgezinst wird, da in der Mitte keine Zinszahlung erfolgt und kein Problem der erneuten Operation besteht.
Parrate ist die endgültige Rendite verzinslicher Anleihen. Verzinsliche Anleihen sind Finanzprodukte, bei denen bis zur Fälligkeit jedes Jahr ein bestimmter Zinsbetrag gezahlt wird.
Wenn Sie mit 6 Monaten Zinszahlung verallgemeinern
DF_i = \frac{1 - r_i \sum_{k=1}^{i-1} DF_{i-1}}{ 1 + r_i} \\
i:Zeitpunkt\\
r_i:Zinssatz zum Zeitpunkt i\\
DF_i:Discant-Faktor zum Zeitpunkt i\\
Es ist lange her, aber schließlich werde ich tatsächlich eine Kurve in Python zeichnen. Es scheint, dass ich verschiedene Dinge umschreiben werde, wenn ich andere Währungen oder Mehrfachkurven zeichne, aber es ist gut, weil es einmal funktioniert. (Ausrede?)
# -*- coding: utf-8 -*-
#Vorbereitung dessen, was für die grafische Darstellung erforderlich ist
import matplotlib
import matplotlib.pyplot as plt
#Bibliothek für den Umgang mit Daten erforderlich
import numpy as np
from scipy import interpolate
#Andere
from enum import Enum
#Die Magie von Matplotlib
plt.style.use('ggplot')
font = {'family': 'meiryo'}
matplotlib.rc('font', **font)
#Verschiedene Daten
# JPY Libor
cash_rate = {
"ON": 0.1, "1W": 0.10357, "1M": 0.12014, "2M": 0.13857, "3M": 0.15429, "6M": 0.16123, "12M": 0.23875
}
# JPY Libor Swap
swap_rate = {
"2Y": 0.26250, "3Y": 0.30250, "4Y": 0.36000, "5Y": 0.44813, "6Y": 0.55250,
"7Y": 0.66750, "8Y": 0.77500, "9Y": 0.88250, "10Y": 0.98500, "12Y": 1.17750, "15Y": 1.44750, "20Y": 1.75000,
"25Y": 1.89000, "30Y": 1.95813
}
input_market_data = cash_rate.copy()
input_market_data.update(swap_rate)
class RateType(Enum):
CASH_RATE = 1
SWAP_RATE = 2
class MarketData:
def __init__(self, grid, rate):
self.grid = grid
self.rate = rate / 100 #Von Eingabe%Zu einer reellen Zahl
self.set_term()
self.set_rate_type()
def set_term(self):
if self.grid == "ON":
self.term = 1 / 365
else:
num = float(self.grid.replace("M", "").replace("W", "").replace("Y", ""))
if "W" in self.grid:
self.term = num * 7 / 365
elif "M" in self.grid:
self.term = num * 1 / 12
elif "Y" in self.grid:
self.term = num
else:
self.term = 0.0
def set_rate_type(self):
if self.term <= 1:
self.rate_type = RateType.CASH_RATE
else:
self.rate_type = RateType.SWAP_RATE
def value(self):
print("Grid:{0}, RateType: {1}, Term:{2}, Rate: {3}".format(self.grid, self.rate_type, self.term, self.rate))
class YieldCurve:
def __init__(self, market_data_list):
self.market_data_list = market_data_list
self.sigma_df = 0.0 # TODO:Machs besser
self.df_list = []
self.zero_list = []
def get_grids(self):
return list(map(lambda x: x.term, self.market_data_list))
def interpolate_swap_rate(self):
i = 1.5 #Nach 1 Jahr ist JPY ein halbes Jahr, also 1.Beginnen Sie mit 5
original_rates = list(map(lambda x: x.rate * 100, self.market_data_list))
f = interpolate.interp1d(self.get_grids(), original_rates)
while i <= 30:
r = list(filter(lambda x: x == i, self.get_grids()))
if not r:
m = MarketData(str(i) + "Y", f(i))
self.market_data_list.append(m)
i += 0.5 #JPY ist für ein halbes Jahr roll+0.5
#Am Ende sortieren
self.market_data_list.sort(key=lambda x: x.term)
def output_market_data_list(self):
for mkt in self.market_data_list:
mkt.value()
def generate_curve(self):
for mkt in self.market_data_list:
self.calc_df(mkt)
def calc_df(self, mkt):
if mkt.rate_type == RateType.CASH_RATE:
d = 1 / (1 + mkt.term * mkt.rate)
self.df_list.append(d)
elif mkt.rate_type == RateType.SWAP_RATE:
#Insgesamt DF nur für ein halbes Jahr Rollgitter
d = (1 - self.sigma_df * mkt.rate / 2) / (1 + mkt.rate / 2)
self.df_list.append(d)
if mkt.term % 0.5 == 0:
self.sigma_df += d
self.calc_zero(mkt, d)
def get_df(self, term):
f = interpolate.interp1d(self.get_grids(), self.df_list, kind="cubic")
return f(term)
def calc_zero(self, mkt, d):
if mkt.rate_type == RateType.CASH_RATE:
self.zero_list.append(mkt.rate)
elif mkt.rate_type == RateType.SWAP_RATE:
zero = -1 * np.log(d) / mkt.term
self.zero_list.append(zero)
def output(self):
print("Grid: DF: ZeroRate:")
for i, v in enumerate(self.market_data_list):
print("{0}: {1}: {2}".format(v.grid, self.df_list[i], self.zero_list[i] * 100))
def plot(self):
fig = plt.figure(figsize=(10, 10))
ax_df = fig.add_subplot(2, 1, 1)
plt.subplots_adjust(hspace=0.3)
ax_df.set_ylim([0, 1.1])
ax_df.plot(self.get_grids(), self.df_list)
ax_df.set_title("Discount Factor")
ax_df.set_xlabel("Grid")
ax_df.set_ylabel("DF")
ax_zero = fig.add_subplot(2, 1, 2)
ax_zero.set_ylim([0, 3])
ax_zero.plot(self.get_grids(), list(map(lambda z: z * 100, self.zero_list)))
ax_zero.set_title("Zero Rate")
ax_zero.set_xlabel("Grid")
ax_zero.set_ylabel("Zero Rate")
plt.show()
if __name__ == '__main__':
# read market data
market_data_list = list(map(lambda x: MarketData(x[0], x[1]), input_market_data.items()))
# generate yield curve
curve = YieldCurve(market_data_list)
curve.interpolate_swap_rate()
curve.generate_curve()
curve.plot()
[Alle Derivate, die durch Illustration verstanden werden können](https://www.amazon.co.jp/ Alle Derivate, die durch Illustration verstanden werden können - mit EXCEL-Blatt-CD-ROM, die in der Praxis verwendet werden kann-Tabuchi-Naoya / dp / 4534038186 / ref = sr_1_21? dh = UTF8 & qid = 1467724878 & sr = 8-21 & keywords = Derivate)
[LIBOR-Rabatt und OIS-Rabatt von EXCEL verstanden](https://www.amazon.co.jp/ LIBOR-Rabatt und OIS-Rabatt von EXCEL verstanden - mit CD-ROM-Nakahara-Genta / dp / 432123848 / ref = sr_1_2? = UTF8 & qid = 1467724851 & sr = 8-2 & keywords = LIBOR)
Ich bin damit nicht vertraut, aber in meiner Arbeit zeichne ich eine Kurve mit mehr Rücksicht.
Recommended Posts