Новое: Учитывая, что мое понимание волатильности является правильным, это только стандартное отклонение среднего возвращения, правильно? Затем все, что вам нужно сделать, это получить нормально распределенное случайное число со средним значением 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.
Это броуновское модель типа движения. Я просто просмотрел, что я пытаюсь сделать из файла Excel; Я пытаюсь получить обратное стандартное нормальное распределение для каждого случайного числа в наблюдении; то есть эквивалент NORMSINV() в Excel. Итак, в формуле s1 = s0 * np.exp (k * t/250) # + (v * datapoints) * np.sqrt (t/250), я хочу, чтобы переменная datapoints ссылалась на это число. Я был бы признателен за любые советы, поскольку я все еще очень потерян. – optimisation2810
Я вижу. Итак, что вы действительно хотите сделать, это нарисовать случайное число из нормального распределения со средним mu и стандартным отклонением v? По крайней мере, если я правильно читаю wiki-запись для волатильности. Затем просмотрите обновленное сообщение. –
В настоящее время я пытаюсь запустить код, но просто чтобы сообщить, что я получаю ValueError для строки: plt.plot (np.arange (250), stock_total, c = 'k'). – optimisation2810