Zufälliger Spaziergang in Python

Dies ist ein Memo von Random Walk von Python. Ich schreibe eine kleine Formel, aber sie ist mathematisch nicht streng, also hab keine Angst.

Einfacher zufälliger Spaziergang

Preis $ p (n) $ zum Zeitpunkt $ n $,

p(n) = p(n-1) + d(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()

index.png

Geometrischer Zufallslauf

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.

\log p(n) = \log p(n-1) + d(n)

Transponieren Sie in dieser Formel $ \ log p (n-1) $

\log\frac{p(n)}{p(n-1)}= d(n)

Wenn Sie exp () auf beiden Seiten nehmen,

\frac{p(n)}{p(n-1)}=e^\{d(n)\}

Es wird sein. Mit anderen Worten lautet die Formel zum Finden von $ p (n) $ aus $ p (n-1) $

p(n)=e^\{d(n)\} 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()

index.png

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.

Zufälliger Spaziergang in der Nähe des tatsächlichen Marktpreises

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

index.png

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

Zufälliger Spaziergang in Python
Balanced Random Forest in Python
Verwenden Sie Random Forest mit Python
Gewichtete zufällige Auswahl in Python
Testen mit Zufallszahlen in Python
Erstellen Sie eine zufällige Zeichenfolge in Python
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Krankheitsklassifizierung durch Random Forest mit Python
[Python] Krankheitsklassifikation in zufälligen Wäldern - mit LDA-
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python