我想在Python中運行一個模擬,從而我繪製了一個給定兩個變量參數的集合級別的數組隨機遊走。Python迭代?
但是,我有一個問題,我不知道如何迭代,以便生成250個不同的隨機數插入公式。例如我已經定義了一個隨機數x,但由於它只是一個隨機數,所以Python會生成一條直線圖,因爲該公式只考慮了一個變量。
對於250個數據點,程序需要在0到1之間生成250個隨機數,以便能夠對數據運行隨機過程。但是,我不確定該從哪裏出發,並希望得到任何建議。
我想在Python中運行一個模擬,從而我繪製了一個給定兩個變量參數的集合級別的數組隨機遊走。Python迭代?
但是,我有一個問題,我不知道如何迭代,以便生成250個不同的隨機數插入公式。例如我已經定義了一個隨機數x,但由於它只是一個隨機數,所以Python會生成一條直線圖,因爲該公式只考慮了一個變量。
對於250個數據點,程序需要在0到1之間生成250個隨機數,以便能夠對數據運行隨機過程。但是,我不確定該從哪裏出發,並希望得到任何建議。
該答案根據您希望應用隨機數的方式而變化。
但你可以做這樣的事情:
tt=np.arange(0,250)
s1=[(s0+random())*np.exp(k*t/250) for t in tt]
新: 鑑於我波動的理解是正確的,它只是平均收益率的標準差,是否正確?然後你需要做的是得到一個正態分佈的隨機數,平均值爲mu,標準差爲v。正如Severin指出的那樣,在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)的表達產生了具有在-1和+1之間250個的隨機變量的陣列。現在,如果你想在你的指數模型周圍存在一個幅度爲2.0的「隨機性」,那麼你只需將rndScale改爲2.0即可。
布朗運動模擬需要的是獲得正態分佈(又名高斯)隨機數的向量。您不需要任何像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.肖爾茨代碼看起來不錯,我...
這是布朗運動型模型的更多細節。我剛剛從Excel文件中回顧了我想要做的事情;我試圖在觀察中得到每個隨機數的標準正態分佈的倒數;即相當於Excel中的NORMSINV()。因此,在公式s1 = s0 * np.exp(k * t/250)#+(v * datapoints)* np.sqrt(t/250)中,我希望數據點變量引用此數字。我很感激任何建議,因爲我仍然很迷茫。 – optimisation2810
我明白了。那麼你真正想要做的是從平均mu和標準差v的正態分佈中抽取一個隨機數?至少如果我正確閱讀wiki條目的波動性。然後查看更新的帖子。 –
我目前正在嘗試運行代碼,但只是建議我爲該行獲取ValueError:plt.plot(np.arange(250),stock_total,c ='k')。 – optimisation2810