Dies ist ein Memo von Random Walk von Python. Ich schreibe eine kleine Formel, aber sie ist mathematisch nicht streng, also hab keine Angst.
Preis $ p (n) $ zum Zeitpunkt $ n $,
Zeitreihen, die durch Addition von $ d (n) $ (jedoch ist $ d (n) $ 1 $ oder $ -1 $) zu dem Preis $ p (n-1) $ eine Stichprobe zuvor berechnet wurden. Wird ein einfacher zufälliger Spaziergang genannt.
Erstens kann $ d (n) $ in Python wie folgt geschrieben werden:
%matplotlib inline
import numpy as np
import pandas as pd
dn = np.random.randint(2, size=1000)*2-1
Wenn Sie eine Zufallszahl von 0 oder 1 generieren, verdoppeln und 1 subtrahieren, erhalten Sie -1 oder 1. Alternativ können Sie entweder "[-1,1]" wie folgt zufällig auswählen.
dn = np.random.choice([-1,1], size=1000)
Wenn Sie diese der Reihe nach hinzufügen, ist dies ein einfacher zufälliger Spaziergang. Hier ist der Anfangswert $ p (0) = 100 $.
p0 = 100
swalk = np.cumsum(dn)+p0
Lassen Sie es uns in der Pandas-Klasse der Serie darstellen.
pd.Series(swalk).plot()
Ein einfacher zufälliger Spaziergang addiert $ + 1 $ oder $ -1 $ zum vorherigen Preis. Wenn Sie dies jedoch weiterhin tun, kann der Preis negativ werden. Es ist seltsam, dass der Aktienkurs negativ ist. Um die tatsächliche Bewegung des Aktienkurses zu simulieren, verwenden wir einen geometrischen Zufallslauf, der eine leicht modifizierte Version des einfachen Zufallslaufs ist.
Geometric Random Walk verwendet den logarithmischen Wert des Preises anstelle des Preises, um eine ähnliche Formel zu formulieren.
Transponieren Sie in dieser Formel $ \ log p (n-1) $
Wenn Sie exp () auf beiden Seiten nehmen,
Es wird sein. Mit anderen Worten lautet die Formel zum Finden von $ p (n) $ aus $ p (n-1) $
Es wird sein. Hier ist $ d (n) $ der Preis der vorherigen Stichprobe, da er als $ e ^ \ {d (n) } \ ca. 1 + d (n) $ angenähert werden kann, wenn $ d (n) $ klein ist. Sie können sehen, dass es die Änderungsrate von ist.
Wenn jedoch $ d (n) $ die Änderungsrate ist, ist $ + 1 $ oder $ -1 $ die Änderungsrate von 100%, was zu groß ist. Da hier die Änderung von 1 Yen für 100 Yen 1% beträgt, wird $ d (n) $ als $ 0,01 $ oder $ -0,01 $ berechnet. Unter Verwendung des durch den einfachen Zufallslauf erhaltenen "dn" ist der Anfangswert $ p (0) = 100 $.
gwalk = np.cumprod(np.exp(dn*0.01))*p0
Es ist in Ordnung, wenn Sie exp (dn * 0.01)
in dieser Reihenfolge multiplizieren. Dies ist wie folgt aufgetragen:
pd.Series(gwalk).plot()
Da es das gleiche $ d (n) $ wie der einfache Random Walk verwendet, sieht es fast gleich aus, aber der Unterschied zwischen der Änderung der Einheiten von 1 Yen und der Änderung der Einheiten von 1% scheint ein wenig von 100 Yen entfernt zu sein. Ich bin.
Der tatsächliche Marktpreis für Aktien und Devisen ist nicht gerade ein zufälliger Spaziergang, kann jedoch als nahezu zufälliger Spaziergang angesehen werden. Hier werde ich versuchen, mit einem zufälligen Spaziergang etwas in die Nähe des tatsächlichen Marktpreises zu bringen.
Die variable Rate ist ein Parameter im geometrischen Zufallslauf. Im vorherigen Beispiel wurde die Fluktuationsrate pro Stichprobe auf 1% festgelegt, aber in der Marktwelt wird die Standardabweichung der Fluktuationsrate auf Jahresbasis durch den Begriff "Volatilität" ausgedrückt. Unten finden Sie eine Website, die die tatsächliche FX-Volatilität zeigt.
Historische Volatilität (Central Short Capital FX)
Eine Volatilität von 10% bedeutet, dass die Wahrscheinlichkeit, dass der Preis nach einem Jahr innerhalb von $ \ pm 10 $% fällt, im Bereich von $ \ pm 1 \ sigma $ der Normalverteilung liegt (ungefähr 68%), aber in Wirklichkeit ist die Volatilität die Zeit. Es schwankt mit. Es gibt auch ein Random-Walk-Modell, das die Volatilität schwankt, aber hier werden wir die Volatilität korrigieren. Im Fall von FX beträgt die Volatilität etwa 10% bis 20%, daher werde ich sie diesmal auf 15% einstellen.
Als nächstes kann es nicht der tatsächliche Marktpreis sein, der sich jedes Mal mit der gleichen Änderungsrate ändert. Daher werden wir den sich ändernden Zeitrahmen feiner gestalten. Wenn Sie beispielsweise einen zufälligen Spaziergang in Intervallen von 1 Minute ausführen, haben Sie in 1 Stunde 60 Stichproben von zufälligen Spaziergängen ausgeführt, sodass sich die Schwankungsrate pro Stunde jedes Mal ändert. Mit zunehmender Anzahl von Abtastwerten wird die Wahrscheinlichkeit einer Schwankungsrate zu einer Normalverteilung, die näher an der tatsächlichen Bewegung liegt.
Verwenden wir also Pandas, um ein Jahr lang einen Index für eine Minute zu erstellen.
idx = pd.date_range('2015/01/01', '2015/12/31 23:59', freq='T')
Da sich der Devisenmarkt an Wochenenden nicht bewegt, wird nur der Wochentagsteil aus dem "idx" herausgenommen.
weekidx = idx[idx.weekday<5]
Als nächstes erstellen Sie $ d (n) $, das dieselbe Größe wie "weekidx" hat.
dn = np.random.randint(2, size=len(weekidx))*2-1
Die Volatilität ist eine einjährige Volatilität. Wandeln Sie diese in eine einminütige Volatilität um. Berechnet durch Teilen der Gesamtzahl der 1-Minuten-Balken durch die Quadratwurzel für die Anzahl der Geschäftstage in einem Jahr (260 Tage).
Vola = 15.0 #Volatilität(%)
scale = Vola/100/np.sqrt(260*24*60)
gwalk = np.cumprod(np.exp(scale*dn))*p0
Basierend auf diesem 1-minütigen zufälligen Spaziergang machen wir zum Beispiel einen 4-stündigen zufälligen Spaziergang.
df = pd.Series(gwalk, index=weekidx).resample('4H').ohlc().dropna()
Verwenden Sie die resample () -Methode von pandas, um 4-Wert-Daten zu erstellen. Wenn Sie nur den Schlusskurs anzeigen, sieht dieser wie folgt aus.
df['close'].plot()
Hier ist ein Beispiel für einen zufälligen Spaziergang mit einer Volatilität von 15%. Allerdings hat der Random Walk jedes Mal ein anderes Diagramm, daher bin ich mir nicht sicher, ob es passt.
Recommended Posts