導航:首頁 > 編程語言 > python蒙特卡洛模型投點圖

python蒙特卡洛模型投點圖

發布時間:2025-05-14 10:04:27

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

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')

B. python分析股票常用的策略

在Python中分析股票常用的策略主要包括以下幾種:

  1. 蒙特卡洛模擬

    • 用途:用於分析投資組合的價格趨勢、風險和收益平衡。
    • 方法:通過生成大量隨機的權重向量,模擬不同投資組合的預期收益和方差,從而找到最優的投資組合配置。
    • 優點:能夠綜合考慮多種不確定性因素,為投資決策提供較為全面的風險評估。
  2. 多因子選股

    • 用途:用於篩選具有特定特徵的股票,以期望獲得超越市場的回報。
    • 方法:根據多個因子(如市盈率、市值、賬面市值比等)對股票進行評分,選擇滿足特定因子標準的股票進行投資。
    • 優點:能夠綜合多個維度的信息,提高選股的穩定性和准確性。
  3. 量化選股

    • 用途:利用數量化的方法選擇股票組合,以期望獲得超越基準收益率的投資回報。
    • 方法:主要分為基本面選股和市場行為選股兩類。基本面選股關注公司的財務狀況、行業地位等;市場行為選股則關注股票的價格、成交量等技術指標。
    • 優點:能夠基於大量數據進行分析,避免主觀判斷帶來的偏差,提高投資決策的科學性。
  4. 回測策略

    • 用途:驗證投資策略的有效性,評估其在歷史數據上的表現。
    • 方法:將投資策略應用於歷史數據,模擬交易過程,計算策略的收益率、波動率等指標。
    • 優點:能夠在不實際投入資金的情況下,評估投資策略的優劣,為實際投資提供決策依據。
  5. 機器學習演算法

    • 用途:用於股票價格預測、市場情緒分析等。
    • 方法:通過訓練機器學習模型,從歷史數據中學習股票價格變動的規律,進而對未來價格進行預測。
    • 優點:能夠處理大規模數據,捕捉復雜的非線性關系,提高預測的准確性。

綜上所述,Python在股票分析中的應用非常廣泛,涵蓋了從投資組合優化、選股策略制定到價格預測等多個方面。這些策略和方法為投資者提供了科學的決策依據,有助於降低投資風險,提高投資收益。

C. 手撕蒙特卡洛樹搜索演算法/Monte Carlo Tree Search (MCTS),包括完整的 Python 代碼實現

來自 Surfer Zen的文章講述了蒙特卡洛樹搜索(Monte Carlo Tree Search,MCTS)這一經典機器學習演算法的基本原理和Python實現。MCTS廣泛應用於解決黑盒問題的最優解搜索,包括大規模優化和強化學習領域,如AlphaGo的圍棋策略。本文將通過通俗講解,引導讀者理解基礎MCTS版本,以便自行擴展適應需求。

Python實現中,首先導入必要的依賴,如treelib用於構建樹結構。以一維函數最大值搜索為例,我們定義一個簡單函數,並設定搜索范圍。

MCTS實質上是強化學習中的決策過程,通過訓練構建樹結構,然後基於貪心策略進行推理。訓練過程中,從根節點出發,結合廣度和深度優先策略,進行節點探索。遇到未展開節點,通過rollout評估,回溯時更新父節點分數,記錄訪問次數,平衡探索和利用。當達到最大深度時,再從根節點開始新遊走。

獲取最優策略和解時,採用全利用策略從根節點到終點,記錄路徑並得出最終分數。代碼實現中,我們設定初始定義域並遞歸切分,同時定義節點數據結構存儲關鍵信息,遊走策略則涉及一個平衡探索和利用的綜合分數公式。

運行示例代碼後,可以得到一維函數的最大值和對應的x坐標。未來文章將探討如何改進MCTS以適應更高維度和連續空間的問題,並將其應用到強化學習的深化研究中。

閱讀全文

與python蒙特卡洛模型投點圖相關的資料

熱點內容
cad最下面的一排命令都什麼意思 瀏覽:456
pythonimportcpp 瀏覽:850
W10的系統怎麼給U盤加密 瀏覽:370
華為手機代碼編程教學入門 瀏覽:762
和彩雲沒會員怎樣解壓 瀏覽:634
androidimageview保存 瀏覽:387
新買店鋪什麼伺服器 瀏覽:883
文件夾能直接刻錄嗎 瀏覽:493
androidxmpp刪除好友 瀏覽:969
javac哪個前景好 瀏覽:427
中華英才網app為什麼不能搜索了 瀏覽:660
伺服器域名是什麼意思 瀏覽:52
Linux導出mysql命令 瀏覽:159
無詐建鄴是什麼app 瀏覽:228
python中的雙色球 瀏覽:167
python解釋器里如何換行 瀏覽:412
python編寫格式 瀏覽:576
用python做出來的軟體 瀏覽:469
伺服器指示燈代表什麼 瀏覽:702
做一個單片機銷售需要知識 瀏覽:777