Marche aléatoire en Python

Ceci est un mémo de marche aléatoire par Python. J'écris une petite formule, mais ce n'est pas mathématiquement strict, alors n'ayez pas peur.

Marche aléatoire simple

Prix $ p (n) $ au temps $ n $,

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

Séries chronologiques calculées en ajoutant $ d (n) $ (cependant, $ d (n) $ vaut 1 $ ou -1 $) au prix $ p (n-1) $ un échantillon avant. S'appelle une simple marche aléatoire.

Tout d'abord, $ d (n) $ peut être écrit en Python comme suit:

%matplotlib inline
import numpy as np
import pandas as pd

dn = np.random.randint(2, size=1000)*2-1

Si vous générez un nombre aléatoire de 0 ou 1, doublez-le et soustrayez 1, vous obtenez -1 ou 1. Alternativement, vous pouvez sélectionner aléatoirement soit «[-1,1]» comme suit.

dn = np.random.choice([-1,1], size=1000)

Si vous les ajoutez dans l'ordre, ce sera une simple marche aléatoire. Ici, la valeur initiale est $ p (0) = 100 $.

p0 = 100
swalk = np.cumsum(dn)+p0

Tracons-le dans la classe Series de pandas.

pd.Series(swalk).plot()

index.png

Marche aléatoire géométrique

Une simple marche aléatoire ajoute $ + 1 $ ou $ -1 $ au prix précédent, mais si vous continuez à le faire, le prix peut devenir négatif. Il est étrange que le cours de l'action soit négatif, donc afin de simuler le mouvement réel du cours de l'action, nous utiliserons une marche aléatoire géométrique qui est une version légèrement modifiée de la marche aléatoire simple.

Geometric Random Walk utilise la valeur logarithmique du prix au lieu du prix pour formuler une formule similaire.

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

Dans cette formule, transposez $ \ log p (n-1) $

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

Si vous prenez exp () des deux côtés,

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

Ce sera. En d'autres termes, la formule pour trouver $ p (n) $ à partir de $ p (n-1) $ est

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

Ce sera. Ici, $ d (n) $ est le prix de l'échantillon précédent car il peut être approximé comme $ e ^ \ {d (n) } \ approx 1 + d (n) $ quand $ d (n) $ est petit. Vous pouvez voir que c'est le taux de changement de.

Cependant, si $ d (n) $ est le taux de changement, $ + 1 $ ou $ -1 $ sera le taux de changement de 100%, ce qui est trop grand. Ici, puisque le changement de 1 yen pour 100 yens est de 1%, $ d (n) $ est calculé comme 0,01 $ ou -0,01 $. En utilisant le dn obtenu par la marche aléatoire simple, la valeur initiale est $ p (0) = 100 $.

gwalk = np.cumprod(np.exp(dn*0.01))*p0

C'est OK si vous multipliez ʻexp (dn * 0.01) ʻ dans l'ordre comme ceci. Ceci est tracé comme suit:

pd.Series(gwalk).plot()

index.png

Comme il utilise le même $ d (n) $ que la marche aléatoire simple, il a presque le même aspect, mais la différence entre changer par incréments de 1 yen et par incréments de 1% apparaît un peu éloigné de 100 yens. Je suis.

Marche aléatoire proche du prix réel du marché

Le prix réel du marché pour les actions et les devises n'est pas exactement une marche aléatoire, mais il peut être considéré comme proche d'une marche aléatoire. Ici, je vais essayer de faire quelque chose de proche du prix réel du marché avec une marche aléatoire.

Le taux variable est un paramètre de la marche aléatoire géométrique. Dans l'exemple précédent, le taux de fluctuation par échantillon était fixé à 1%, mais dans le monde du marché, l'écart-type du taux de fluctuation sur une base annuelle est exprimé par le terme «volatilité». Vous trouverez ci-dessous un site qui montre la volatilité réelle des devises.

Volatilité historique (Central Short Capital FX)

Une volatilité de 10% signifie que la probabilité que le prix tombe dans $ \ pm 10 $% un an plus tard est dans la distribution normale de $ \ pm 1 \ sigma $ (environ 68%), mais en réalité la volatilité est le temps. Il fluctue avec. Il existe également un modèle de marche aléatoire qui fait fluctuer la volatilité, mais ici nous allons corriger la volatilité. Dans le cas du FX, la volatilité est d'environ 10% à 20%, donc cette fois je la fixerai à 15%.

Deuxièmement, ce ne peut pas être le prix réel du marché qui change au même rythme à chaque fois. Par conséquent, nous rendrons le calendrier de changement plus fin. Par exemple, si vous exécutez une marche aléatoire à des intervalles d'une minute, vous aurez exécuté 60 échantillons de marches aléatoires en 1 heure, de sorte que le taux de fluctuation par heure changera à chaque fois. Au fur et à mesure que le nombre d'échantillons augmente, la probabilité de taux de fluctuation devient une distribution normale, qui est plus proche du mouvement réel.

Alors, utilisons des pandas pour créer un index pendant une minute pendant un an.

idx = pd.date_range('2015/01/01', '2015/12/31 23:59', freq='T')

Puisque le marché des changes ne bouge pas le week-end, seule la partie jour de semaine est retirée de ʻidx`.

weekidx = idx[idx.weekday<5]

Ensuite, créez $ d (n) $ de la même taille que weekidx.

dn = np.random.randint(2, size=len(weekidx))*2-1

La volatilité est une volatilité d'un an, alors convertissez-la en une volatilité d'une minute. Calculé en divisant par la racine carrée du nombre total de barres d'une minute pour le nombre de jours ouvrables dans une année (260 jours).

Vola = 15.0 #Volatilité(%)
scale = Vola/100/np.sqrt(260*24*60)
gwalk = np.cumprod(np.exp(scale*dn))*p0

Sur la base de cette marche aléatoire d'une minute, faisons une marche aléatoire de 4 heures, par exemple.

df = pd.Series(gwalk, index=weekidx).resample('4H').ohlc().dropna()

Utilisez la méthode resample () de pandas pour créer des données à 4 valeurs. Si vous n'affichez que le cours de clôture, ce sera comme suit.

df['close'].plot()

index.png

Voici un exemple de marche aléatoire avec une volatilité de 15%. Cependant, la marche aléatoire a un graphique différent à chaque fois, donc je ne sais pas si cela correspond.

Recommended Posts

Marche aléatoire en Python
Forêt aléatoire équilibrée en python
Utiliser Random Forest avec Python
Choix aléatoire pondéré en python
Tester avec des nombres aléatoires en Python
Créer une chaîne aléatoire en Python
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Classification des maladies par Random Forest en utilisant Python
[Python] Classification des maladies dans une forêt aléatoire-avec LDA-
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python