2013-05-24 14 views
7

Sto provando a creare rapidamente una serie di passeggiate casuali simulate in panda.Panda a piedi casuali

import pandas as pd 
import numpy as np 
dates = pd.date_range('2012-01-01', '2013-02-22') 
y2 = np.random.randn(len(dates))/365 
Y2 = pd.Series(y2, index=dates) 
start_price = 100 

vorrebbe costruire un'altra serie di date a partire da start_price alla data di inizio e crescente dai tassi di crescita casuale. Codice pseudo:

P0 = 100 
P1 = 100 * exp(Y2) 
P2 = P1 * exp(Y2) 

molto facile da fare in Excel, ma non posso pensare a modo di farlo senza l'iterazione di un dataframe/serie con i panda e ho anche sbattere la testa farlo.

hanno provato:

p = Y2.apply(np.exp)-1 
y = p.cumsum(p) 
y.plot() 

questo dovrebbe dare il ritorno cumulativamente composto da inizio

risposta

11
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

def geometric_brownian_motion(T = 1, N = 100, mu = 0.1, sigma = 0.01, S0 = 20):   
    dt = float(T)/N 
    t = np.linspace(0, T, N) 
    W = np.random.standard_normal(size = N) 
    W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ### 
    X = (mu-0.5*sigma**2)*t + sigma*W 
    S = S0*np.exp(X) ### geometric brownian motion ### 
    return S 

dates = pd.date_range('2012-01-01', '2013-02-22') 
T = (dates.max()-dates.min()).days/365 
N = dates.size 
start_price = 100 
y = pd.Series(
    geometric_brownian_motion(T, N, sigma=0.1, S0=start_price), index=dates) 
y.plot() 
plt.show() 

enter image description here