Mit Python erlernte Derivate- (2) Zeichnen Sie eine Zinsstrukturkurve (JPYLibor-Kurve) -

Einführung

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.

Ableitungsserien zum Erlernen von Python

Erstens: Berechnung des Devisenterminkurses 2. Zeichnen Sie eine Zinsstrukturkurve (JPY-Libor-Kurve)

Inhalt dieser Zeit

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.

jpy_yield.png

Wie zeichnet man eine Kurve?

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.

Wie zeichnet man eine Kurve mit der Boot Strap-Methode?

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.

DF-Berechnung innerhalb von 1 Jahr

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.

Berechnung der DF ab 0,5 Jahren

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.

Berechnung der DF ab 1 Jahr

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}))}

Zusammenfassung

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\\

DF-Berechnung für über 1 Jahr

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.

Berechnung der DF ab 1,5 Jahren

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.

Berechnung der DF ab 2 Jahren

Ä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.

Zusammenfassung

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)

Nullratenberechnung

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.

Ergänzung

Nullsatz und Nennwert

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.

DF-Berechnungsformel

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\\

Programm zum Zeichnen einer Zinsstrukturkurve

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?)

Prozessablauf

Programm


# -*- 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()


Nachschlagewerk

[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)

Schließlich

Ich bin damit nicht vertraut, aber in meiner Arbeit zeichne ich eine Kurve mit mehr Rücksicht.

Recommended Posts

Mit Python erlernte Derivate- (2) Zeichnen Sie eine Zinsstrukturkurve (JPYLibor-Kurve) -
Zeichnen einer Silbersteinkurve mit Python
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
Mit Python erlernte Derivate- (1) Berechnung des Devisenterminkurses-
Implementieren eines Generators mit Python> Link> Yield und next ()> Yield
Mit Python abflachen
Zeichne ein Herz in Python
Ich habe einen Line-Bot mit Python gemacht!
Versuchen Sie, eine Bezier-Kurve zu zeichnen
Erstellen Sie mit tkinter eine Python-GUI
Zeichnen Sie eine Streudiagrammmatrix mit Python
Zeichnen Sie mit Python Turtle eine Koch-Kurve
Zeichnen Sie ein CNN-Diagramm in Python
So zeichnen Sie ein Diagramm mit Matplotlib
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Mit Python Teil 2 ein Herz zeichnen (SymPy Edition)
Scraping von Websites mit JavaScript in Python
[Python] Eine Tabelle mit Beautiful Soup kratzen
Ein Programm, das Python zum Abspielen von Junk verwendet
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Erstellen Sie eine GIF-Datei mit Pillow in Python
[Python] Teilen Sie eine große Flask-Datei mit Blueprint
[Python] Zeichnen Sie mit Dash Cytoscape ein gerichtetes Diagramm
[Python] Zeichne eine Mickey Mouse mit Turtle [Anfänger]
Erstellen Sie eine Webmap mit Python und GDAL
Anzeigen von Arzneimittelbewertungen mithilfe von Listen in Python
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Beispiel zum Zeichnen einer einfachen Uhr mit ebiten
Führen Sie Python-Dateien mit Django aus HTML aus
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Führen Sie Python-Skripte in Excel aus (mit xlwings).