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.
Prix $ p (n) $ au temps $ 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()
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.
Dans cette formule, transposez $ \ log p (n-1) $
Si vous prenez exp () des deux côtés,
Ce sera. En d'autres termes, la formule pour trouver $ p (n) $ à partir de $ p (n-1) $ est
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()
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.
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()
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