基於python的金融分析與風險管理-程式碼塊-c8-股票投資組合

epsilon_t發表於2024-10-24

繪圖

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt  
##Matplotlib是一個用於繪製資料視覺化的Python庫。它提供了一種類似於Matlab的繪圖介面,可以用於生成各種靜態、動態、互動式的圖形,包括線圖、散點圖、柱狀圖、餅圖、等高線圖等。
###Matplotlib具有強大的功能和靈活的可定製性,可以滿足各種資料視覺化的需求。

from pylab import mpl  
##pylab是一個Python庫,用於科學計算,資料分析和繪圖。它是Matplotlib庫的一個模組,提供了類似於MATLAB的繪圖介面。
##pylab庫結合了NumPy庫和Matplotlib庫的功能,使得使用者可以使用簡單的命令來建立和定製各種型別的圖形。

mpl.rcParams['font.sans-serif']= ['SimHei']  
##這段程式碼的意思是設定matplotlib圖表的預設字型為"SimHei",即使用"SimHei"字型來顯示中文。

mpl.rcParams['axes..unicode _minus']= False  
##  mpl.rcParams[‘axes.unicode_minus’] = False是Matplotlib庫中的一個配置引數,用於設定軸標籤是否顯示減號的Unicode字元。應該是不顯示負軸的意思


index_data = pd.read_excel('C:/desktop/a.xlsx', sheet_name = "sheet1", header = 0, index_col = 0)  
## 資料的第一行將被作為列名,第一列將被作為行索引。讀取的資料將被儲存在名為index_data的Pandas DataFrame中。

index_data.plot(subplots= True, layout = (2,2), figsize = (10, 10), fontsize = 13, grid = True)  
##這行程式碼是用來繪製一個包含4個子圖的圖表,並設定圖表的佈局為2行2列。
##其中,引數subplots=True表示建立子圖,layout=(2,2)表示佈局為2行2列,figsize=(10,10)表示圖表的大小為10x10英寸,fontsize=13表示字型的大小為13,grid=True表示顯示網格線。

隨機數

##預期收益率
x = np.random.random(5) ##這些隨機浮點數的範圍在0到1之間。
weights = x/np.sum(x)  #broadcasting
print(weights)
round(sum(weights,2) #檢驗

方差

(data/data.iloc[0]).plot(figsize = (8,6))  ##根據第一行進行歸一化

R = np.log(data/data.shift(1)) ###data.shift(1)將資料框中的每一列向下移動一行,並將第一行的值替換為缺失值。
####對數收益率
R = R.dropna()
R = R.describe()
R.hist(bins = 40, figsize = (10, 10))  #其中引數bins=40表示將資料分成40個區間,每個區間表示一個柱子
R_mean = R.mean()*252
R_cov = R.cov()*252
R_corr = R.corr()
R_vol = R.std()*mp.sqrt(252)

R_port = np.sum(weights * R_mean)  #投資組合預期收益率
vol_port = np.sqrt(np.dot(weights, np.dot(R_cov, weights.T)))  ###投資組合方差

模擬有效前沿

Rp_list = []  ##列表是Python中用來儲存多個值的資料結構,可以儲存不同型別的資料。
Vp_lisp = []
for i in np.range(1000):
  x = np.random.random(5)
  weights = x/sum(x)
  Rp_list.append(np.sum(weights*R_mean))
  Vp_list.append(np.sqrt(np.dot(weights, np.dot(R_cov, weights.T))) )

plt.figure()   ###用於建立一個新的圖形視窗
plt.scatter(Vp_list, Rp_list)
plt.xlabel((u'波動率',fontsize = 13)
plt.ylabel((u'收益率',fontsize = 13, rotation = 0)  ##rotation=0表示標籤不旋轉
plt.xticks(fontsize = 13) ###設定x軸刻度的字型大小
plt.yticks(fontsize = 13)
plt.xlim(0.1, 0.28) ###用於設定x軸的取值範圍
plt.ylim(-0.1, 0.2)
plt.title(u'投資組合收益率與波動率的關係', fontsize= 13)
plt.grid('True')  #plt.grid(‘True’)用於顯示圖形的網格線
plt.show()  ###plt.show()用於顯示圖形

最優解 optimize包

import scipy.optimize as sco
def f(w):
  w = np.array(w)  #將變數w轉換為NumPy陣列
  Rp_opt = np.sum(w*R_mean)
  Vp_opt = np.sqrt(np.dot(w, np.dot(R_cov, w.T)))
  return np.array([Rp_opt, Vp_opt])

def Vmin_f(w):
  return f(w)[1]   ###讀取第一個數字

cons = ({'type':'eq', 'fun':lambda x:np.sum(x)-1}, {'type':'eq', 'fun':lambda x:f(x)[0]-0.1})  
###該變數用於optimize
bnds = tuple(0,1) ##以元組格式生成邊界條件
fox x in range(len(R_mean))


results = scp.minimize(Vmin_f, lem

相關文章