2016-05-02 2 views
3

Я пытаюсь запустить симуляцию в Python, в результате чего я рисую случайное блуждание для массива с заданным уровнем для двух переменных параметров.Python Iterations?

Однако у меня возникла проблема в том, что я не уверен, как итерации, чтобы создать 250 различных случайных чисел для вставки в формулу. например Я определил случайное число x, но поскольку это только одно случайное число, Python затем сгенерирует граф прямой линии, так как формула учитывает только одну переменную.

Для 250 точек данных программе требуется 250 случайных чисел от 0 до 1, сгенерированных для возможности случайного процесса по данным. Тем не менее, я не уверен, куда идти отсюда и буду признателен за любые советы.

ответ

0

Этот ответ изменяется в зависимости от того, как вы хотите использовать случайные числа.

Но вы можете сделать что-то вроде этого:

tt=np.arange(0,250) 
s1=[(s0+random())*np.exp(k*t/250) for t in tt] 
2

Новое: Учитывая, что мое понимание волатильности является правильным, это только стандартное отклонение среднего возвращения, правильно? Затем все, что вам нужно сделать, это получить нормально распределенное случайное число со средним значением mu и стандартное отклонение v. Как указал Северин, есть функция в numpy, чтобы сделать именно это: numpy.random.normal (loc, scale) где loc = mu и scale = v. См. Пример ниже. Я попытался явно указать каждый шаг. Как только вам станет удобно с numpy/python, вы можете сделать большую часть его в 1 или 2 строках.

import numpy as np 
import matplotlib.pylab as plt 

# Initial parameters: 
#------------------- 
# mean return per step 
mu = 0.1 
# volatility 
v = 0.06 
# starting stock price 
s0 = 500 

# Looks like compound annual growth rate, but isn't that exactly what you want 
# to determine from the simulation? 
k = mu-(v**2)/2 

# Iterate random walk, assuming no history within the changes. 
stock_price_changes = [] 
for t in xrange(250): 
    rnd = np.random.normal(loc=mu,scale=v) 
    stock_price_changes.append(rnd) 

# Add up all stock changes and add the initial stock price 
stock_total = np.cumsum(stock_price_changes) + s0 

# Plot the whole thing 
plt.figure(figsize=(7,7),edgecolor='k',facecolor='w') 
plt.plot(np.arange(250),stock_total,c='k') 
plt.xlabel('Trading Days') 
plt.ylabel('Price') 
plt.tight_layout() 
plt.show() 

Старый: Может быть, я не совсем понимаю этот вопрос правильно, но вы не хотите, чтобы закодировать «реальный» блуждающая правильно? Это скорее добавление случайности к вашей экспоненциальной модели? Я думаю, что самый простой способ сделать это - использовать numpy, который вы уже импортируете. Вы можете сжать генерации случайных чисел в так:

... 
k = mu-(v**2)/2 

t=np.arange(0,250) 
s1=s0*np.exp(k*t/250) #+(v*datapoints)*np.sqrt(t/250) 

rndScaling = 1.0 
s1 += rndScaling * 2.0 * (np.random.rand(250) - 0.5) 
... 

2.0 * (np.random.rand (250) - 0,5) выражение дает массив с 250 случайных величин между -1 и +1. Теперь, если вам нужна «случайность» с амплитудой 2,0, окружающая экспоненциальную модель, вы просто меняете rndScale на 2.0.

+0

Это броуновское модель типа движения. Я просто просмотрел, что я пытаюсь сделать из файла Excel; Я пытаюсь получить обратное стандартное нормальное распределение для каждого случайного числа в наблюдении; то есть эквивалент NORMSINV() в Excel. Итак, в формуле s1 = s0 * np.exp (k * t/250) # + (v * datapoints) * np.sqrt (t/250), я хочу, чтобы переменная datapoints ссылалась на это число. Я был бы признателен за любые советы, поскольку я все еще очень потерян. – optimisation2810

+0

Я вижу. Итак, что вы действительно хотите сделать, это нарисовать случайное число из нормального распределения со средним mu и стандартным отклонением v? По крайней мере, если я правильно читаю wiki-запись для волатильности. Затем просмотрите обновленное сообщение. –

+0

В настоящее время я пытаюсь запустить код, но просто чтобы сообщить, что я получаю ValueError для строки: plt.plot (np.arange (250), stock_total, c = 'k'). – optimisation2810

0

Что нужно для моделирования броуновского движения - это получить вектор нормально распределенных (a.k.a. гауссовых) случайных чисел. Вам не нужно любой нормальный обратный, как в Excel, но позвонить в

v = np.random.normal(0.0, 1.0, 250) 

Вы получите обратно вектор N (0,1), распределенных чисел. Подробнее на http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.random.normal.html

UPDATE

B. Scholz код выглядит хорошо для меня ...

Смежные вопросы