Python实现马科维茨有效边界
参考文章
导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
import scipy.optimize as sco
获取股票数据
原文章中是用美股数据实现的,我试着用沪深的数据实现一下,通过tuhsare来获取选定股票的日收益率。我挑了5只股票:贵州茅台(600519)、格力电器(000651)、万科A(000002)、中国平安(601318)、中国石油(601857)
df = pd.DataFrame()
df = ts.get_hist_data('600519', start='2015-01-05', end='2018-12-28')
s600519 = df['p_change']
s600519.name = '600519'
df = pd.DataFrame()
df = ts.get_hist_data('000651', start='2015-01-05', end='2018-12-28')
s000651 = df['p_change']
s000651.name = '000651'
df = pd.DataFrame()
df = ts.get_hist_data('000002', start='2015-01-05', end='2018-12-28')
s000002 = df['p_change']
s000002.name = '000002'
df = pd.DataFrame()
df = ts.get_hist_data('601318', start='2015-01-05', end='2018-12-28')
s601318 = df['p_change']
s601318.name = '601318'
df = pd.DataFrame()
df = ts.get_hist_data('601857', start='2015-01-05', end='2018-12-28')
s601857 = df['p_change']
s601857.name = '601857'
data = pd.DataFrame({
'600519':s600519,'000651':s000651,'000002':s000002, '601318':s601318,'601857':s601857})
data = data.dropna()
计算年化收益率和协方差矩阵(以一年252个交易日计算)
returns_annual = data.mean() * 252
cov_annual = data.cov() * 252
模拟投资组合
为了得到有效边界,我们模拟了50000个投资组合
number_assets