導航:首頁 > 編程語言 > python蒙特卡羅技巧

python蒙特卡羅技巧

發布時間:2022-06-07 12:00:19

⑴ 優必傑python課程中提到的蒙特卡羅方法計算圓周率需要滿足的條件有哪些

使用蒙特卡羅方法計算圓周率的過程中,需要設定很大的點數,建議一百萬個點以上;需要使用random()函數給到每個點隨機的坐標;使用平面上兩點之間距離公式計算點與圓的關系。

⑵ 計算圓周率,使用點模擬法,如何從以下python代碼中看出正方形的邊長

'''
蒙特卡洛方法實現計算圓周率的方法,其思想是假設我們向一個正方形的標靶上隨機投擲飛鏢,靶心在正中央,標靶的長和寬都是2英尺。同時假設有一個圓與標靶內切。圓的半徑是1英尺,面積是π平方英尺。如果擊中點在標靶上是均勻分布的(我們總會擊中正方形),那麼飛鏢擊中圓的數量近似滿足等式:
飛鏢落在圓內的次數/飛鏢落在標靶內的總次數=π/4
因為環包含的面積與正方形面積的比值是π/4。
因為環所包含的面積與正方形面積的比值是π/4。
我們可以用這個公式和隨機數產生器來估計π的值。
這種採用了隨機(隨機投擲)的方法稱為蒙特卡洛(MonteCarlo)方法。
寫程序時,一般默認採用單位圓來計算.R=1,正方形邊長a=2.圓心即坐標軸原點.
'''
foriinrange(1,DARTS)://運算次數DARTS=1200
x,y=random(),random()//生成點坐標位置
dist=sqrt(x**2+y**2)//計算此點與坐標軸原點(即圓心)的距離
ifdist<=1.0://與原點的距離小1,即在圓的半徑內.該點落在單位圓內.
hits=hits+1//落在圓內的點數合計
pi=4*(hits/DARTS)

⑶ 請問 Python程序蒙特卡羅方法求Pi怎樣讓每次運行結果相同

guess = input("What's yer guess? ")

改為
guess = int(input("What's yer guess? "))

⑷ python模擬蒙特卡羅法計算圓周率的近似值

畫一個圓以及與其外切的正方形,在正方形內任取一個點,則它在圓內的概率=圓面積/正方形面積=πr^2/(2r)^2=π/4。所以π近似等於這個概率的4倍。用python多次取正方形內隨機點,判斷是否在圓內,算出這個概率後乘以4,就大致等於π。

⑸ 如何用python實現Markowitz投資組合優化

多股票策略回測時常常遇到問題。
倉位如何分配?
你以為基金經理都是一拍腦袋就等分倉位了嗎?
或者玩點玄乎的斐波拉契數列?
OMG,誰說的黃金比例,讓我看到你的腦袋(不削才怪)!!

其實,這個問題,好多好多年前馬科維茨(Markowitz)我喜愛的小馬哥就給出答案——投資組合理論。

根據這個理論,我們可以對多資產的組合配置進行三方面的優化。
1.找到有效前沿。在既定的收益率下使組合的方差最小。
2.找到sharpe最優的組合(收益-風險均衡點)

3.找到風險最小的組合

跟著我,一步兩步,輕松實現。
該理論基於用均值和方差來表述組合的優劣的前提。將選取幾只股票,用蒙特卡洛模擬初步探究組合的有效前沿。
通過最大Sharpe和最小方差兩種優化來找到最優的資產組合配置權重參數。
最後,刻畫出可能的分布,兩種最優以及組合的有效前沿。

註:
文中的數據API來自量化平台聚寬,在此表示感謝。
原文見【組合管理】——投資組合理論(有效前沿)(包含正態檢驗部分)

0.導入需要的包
import pandas as pd
import numpy as np
import statsmodels.api as sm #統計運算
import scipy.stats as scs #科學計算
import matplotlib.pyplot as plt #繪圖

1.選取幾只感興趣的股票
000413 東旭光電,000063 中興通訊,002007 華蘭生物,000001 平安銀行,000002 萬科A
並比較一下數據(2015-01-01至2015-12-31)
In[1]:
stock_set = ['000413.XSHE','000063.XSHE','002007.XSHE','000001.XSHE','000002.XSHE']
noa = len(stock_set)
df = get_price(stock_set, start_date = '2015-01-01', end_date ='2015-12-31', 'daily', ['close'])
data = df['close']
#規范化後時序數據
(data/data.ix[0]*100).plot(figsize = (8,5))
Out[1]:

2.計算不同證券的均值、協方差
每年252個交易日,用每日收益得到年化收益。計算投資資產的協方差是構建資產組合過程的核心部分。運用pandas內置方法生產協方差矩陣。
In [2]:
returns = np.log(data / data.shift(1))
returns.mean()*252
Out[2]:

000413.XSHE 0.184516
000063.XSHE 0.176790
002007.XSHE 0.309077
000001.XSHE -0.102059
000002.XSHE 0.547441

In [3]:
returns.cov()*252
Out[3]:

3.給不同資產隨機分配初始權重
由於A股不允許建立空頭頭寸,所有的權重系數均在0-1之間
In [4]:
weights = np.random.random(noa)
weights /= np.sum(weights)
weights
Out[4]:

array([ 0.37505798, 0.21652754, 0.31590981, 0.06087709, 0.03162758])

4.計算預期組合年化收益、組合方差和組合標准差
In [5]:
np.sum(returns.mean()*weights)*252
Out[5]:

0.21622558669017816

In [6]:
np.dot(weights.T, np.dot(returns.cov()*252,weights))
Out[6]:

0.23595133640121463

In [7]:
np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))
Out[7]:

0.4857482232609962

5.用蒙特卡洛模擬產生大量隨機組合
進行到此,我們最想知道的是給定的一個股票池(證券組合)如何找到風險和收益平衡的位置。
下面通過一次蒙特卡洛模擬,產生大量隨機的權重向量,並記錄隨機組合的預期收益和方差。
In [8]:
port_returns = []
port_variance = []
for p in range(4000):
weights = np.random.random(noa)
weights /=np.sum(weights)
port_returns.append(np.sum(returns.mean()*252*weights))
port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))
port_returns = np.array(port_returns)
port_variance = np.array(port_variance)
#無風險利率設定為4%
risk_free = 0.04
plt.figure(figsize = (8,4))
plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker = 'o')
plt.grid(True)
plt.xlabel('excepted volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
Out[8]:

6.投資組合優化1——sharpe最大
建立statistics函數來記錄重要的投資組合統計數據(收益,方差和夏普比)
通過對約束最優問題的求解,得到最優解。其中約束是權重總和為1。
In [9]:
def statistics(weights):
weights = np.array(weights)
port_returns = np.sum(returns.mean()*weights)*252
port_variance = np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252,weights)))
return np.array([port_returns, port_variance, port_returns/port_variance])
#最優化投資組合的推導是一個約束最優化問題
import scipy.optimize as sco
#最小化夏普指數的負值
def min_sharpe(weights):
return -statistics(weights)[2]
#約束是所有參數(權重)的總和為1。這可以用minimize函數的約定表達如下
cons = ({'type':'eq', 'fun':lambda x: np.sum(x)-1})
#我們還將參數值(權重)限制在0和1之間。這些值以多個元組組成的一個元組形式提供給最小化函數
bnds = tuple((0,1) for x in range(noa))
#優化函數調用中忽略的唯一輸入是起始參數列表(對權重的初始猜測)。我們簡單的使用平均分布。
opts = sco.minimize(min_sharpe, noa*[1./noa,], method = 'SLSQP', bounds = bnds, constraints = cons)
opts
Out[9]:
status: 0
success: True
njev: 4
nfev: 28
fun: -1.1623048291871221
x: array([ -3.60840218e-16, 2.24626781e-16, 1.63619563e-01, -2.27085639e-16, 8.36380437e-01])
message: 'Optimization terminated successfully.'
jac: array([ 1.81575805e-01, 5.40387481e-01, 8.18073750e-05, 1.03137662e+00, -1.60038471e-05, 0.00000000e+00])
nit: 4

得到的最優組合權重向量為:
In [10]:
opts['x'].round(3)
Out[10]:
array([-0. , 0. , 0.164, -0. , 0.836])

sharpe最大的組合3個統計數據分別為:
In [11]:
#預期收益率、預期波動率、最優夏普指數
statistics(opts['x']).round(3)
Out[11]:

array([ 0.508, 0.437, 1.162])

7.投資組合優化2——方差最小
接下來,我們通過方差最小來選出最優投資組合。
In [12]:
#但是我們定義一個函數對 方差進行最小化
def min_variance(weights):
return statistics(weights)[1]
optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
optv
Out[12]:
status: 0
success: True
njev: 7
nfev: 50
fun: 0.38542969450547221
x: array([ 1.14787640e-01, 3.28089742e-17, 2.09584008e-01, 3.53487044e-01, 3.22141307e-01])
message: 'Optimization terminated successfully.'
jac: array([ 0.3851725 , 0.43591119, 0.3861807 , 0.3849672 , 0.38553924, 0. ])
nit: 7

方差最小的最優組合權重向量及組合的統計數據分別為:
In [13]:
optv['x'].round(3)
Out[13]:
array([ 0.115, 0. , 0.21 , 0.353, 0.322])

In [14]:
#得到的預期收益率、波動率和夏普指數
statistics(optv['x']).round(3)
Out[14]:
array([ 0.226, 0.385, 0.587])

8.組合的有效前沿
有效前沿有既定的目標收益率下方差最小的投資組合構成。
在最優化時採用兩個約束,1.給定目標收益率,2.投資組合權重和為1。
In [15]:
def min_variance(weights):
return statistics(weights)[1]
#在不同目標收益率水平(target_returns)循環時,最小化的一個約束條件會變化。
target_returns = np.linspace(0.0,0.5,50)
target_variance = []
for tar in target_returns:
cons = ({'type':'eq','fun':lambda x:statistics(x)[0]-tar},{'type':'eq','fun':lambda x:np.sum(x)-1})
res = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
target_variance.append(res['fun'])
target_variance = np.array(target_variance)

下面是最優化結果的展示。
叉號:構成的曲線是有效前沿(目標收益率下最優的投資組合)
紅星:sharpe最大的投資組合
黃星:方差最小的投資組合
In [16]:
plt.figure(figsize = (8,4))
#圓圈:蒙特卡洛隨機產生的組合分布
plt.scatter(port_variance, port_returns, c = port_returns/port_variance,marker = 'o')
#叉號:有效前沿
plt.scatter(target_variance,target_returns, c = target_returns/target_variance, marker = 'x')
#紅星:標記最高sharpe組合
plt.plot(statistics(opts['x'])[1], statistics(opts['x'])[0], 'r*', markersize = 15.0)
#黃星:標記最小方差組合
plt.plot(statistics(optv['x'])[1], statistics(optv['x'])[0], 'y*', markersize = 15.0)
plt.grid(True)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
Out[16]:

⑹ 什麼是蒙特卡洛法

蒙特卡羅方法(Monte
Carlo
Methods),簡稱M-C法,又稱隨機抽樣技巧法,其實質是利用隨機數,可以說是把某個未知值取作某種概率分布或者概率過程的未知參量,然
後根據無作為標本抽出法對它進行統計、推定的一種方法。這個未知值不一定是概率的值,也可以是推定的值。這種思想方法是一種在某種意義上可知的對策(博弈)觀點。隨著方差減少法的開發和大型超高速計算機的出現,它不僅是模擬諸方法中最重要的—種方法,而且也是系統工程諸方法中最有效的一種方法。

⑺ 誰有最小二乘蒙特卡洛方法的美式期權定價python程序代碼

function [c,p]=ucoption(S,X,sigma,r,T,M) sig2=sigma^2; srT=sqrt(T); srTa=sigma*srT; c=0; p=0; for i=1:M ST=S*exp((r-0.5*sig2)*T+srTa*randn); c=c+max(ST-X,0); p=p+max(X-ST,0); end c=c/M; p=p/M; [Call,Put] = blsprice(S, X, r, T, ...

⑻ python蒙特卡洛計算圓周率耗時比較

1. 請指明python版本

2. 如果有錯,請貼出報錯信息
3. 如果不是程序異常,而是有邏輯錯誤,請說明你希望的邏輯和程序運行時實際的邏輯

⑼ 如何用python的蒙特卡洛模擬生成新的數據

生成1~10的隨機數1000個:
import
random
fp
=
open("test",
'w');
for
i
in
range(1,
1000):
a
=
random.randint(1,10)
fp.write(str(a)+"\n");
fp.close();
注意:寫入文件的不會在最後寫入,而是重新寫文件。

⑽ 蒙特卡洛方法原理

蒙特卡洛方法(Monte Carlo method),也稱統計模擬方法,是二十世紀四十年代中期由於科學技術的發展和電子計算機的發明,而被提出的一種以概率統計理論為指導的一類非常重要的數值計算方法。它是以概率統計理論為基礎, 依據大數定律( 樣本均值代替總體均值) , 利用電子計算機數字模擬技術,解決一些很難直接用數學運算求解或用其他方法不能解決的復雜問題的一種近似計演算法。蒙特卡洛方法在金融工程學,宏觀經濟學,計算物理學(如粒子輸運計算、量子熱力學計算、空氣動力學計算)等領域應用廣泛。
其基本原理如下:由概率定義知,某事件的概率可以用大量試驗中該事件發生的頻率來估算,當樣本容量足夠大時,可以認為該事件的發生頻率即為其概率。因此,可以先對影響其可靠度的隨機變數進行大量的隨機抽樣,然後把這些抽樣值一組一組地代入功能函數式,確定結構是否失效,最後從中求得結構的失效概率。蒙特卡洛法正是基於此思路進行分析的。
設有統計獨立的隨機變數Xi(i=1,2,3,„,k),其對應的概率密度函數分別為fx1,fx2,„,fxk,功能函數式為Z=g(x1,x2,„,xk)。首先根據各隨機變數的相應分布,產生N組隨機數x1,x2,„,xk值,計算功能函數值Zi=g(x1,x2,„,xk)(i=1,2,„,N),若其中有L組隨機數對應的功能函數值Zi≤0,則當N∞時,根據伯努利大數定理及正態隨機變數的特性有:結構失效概率,可靠指標。

閱讀全文

與python蒙特卡羅技巧相關的資料

熱點內容
哪裡有解壓程序 瀏覽:299
java靜態方法內存 瀏覽:545
我的世界ec伺服器如何帶vip 瀏覽:737
什麼是由解析器域名和伺服器構成 瀏覽:414
自動識別電影信息源碼 瀏覽:849
柱筋箍筋加密區怎麼算 瀏覽:48
鋼筋中加密15倍是什麼意思 瀏覽:366
esc加密演算法 瀏覽:518
linux運行exe命令 瀏覽:124
一級建造師管理pdf 瀏覽:720
如何更改伺服器登錄賬號 瀏覽:317
看pdf文件軟體 瀏覽:183
android恢復模式 瀏覽:808
生命令人憂 瀏覽:597
魔獸搬磚怎麼選擇伺服器 瀏覽:771
程序員求伯君圖片 瀏覽:827
安卓手機如何打開mark2文件 瀏覽:662
紅米手機解壓中文解壓密碼 瀏覽:316
安卓智謀三國志是什麼平台 瀏覽:948
伺服器系統linux怎麼下載 瀏覽:946