繪圖
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