投资组合可行集即风险资产可能形成的所有投资组合的总体,位于可有效边界上或其内部。

本文以包含四支股票的投资组合为例,分别为贵州茅台(600519),中天科技(600522),万科A(000002),上证指数(000001),绘制该投资组合的可行集。

注意:本文使用的是tushare的pro接口,利用该接口获取数据需要一定积分,积分可以在注册后通过完成任务获取。附官网注册链接:Tushare大数据社区

高校学生或老师也可以联系社区管理员进行认证,认证完成即可获得一定积分,然后就可以使用一些(我觉得还挺多的)里面的数据。认证只需不到24h,很方便!

我的tushareID:480696

下面进入代码部分。前期准备:

import os, sys
import pandas as pd
import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
from matplotlib.pylab import date2num
import datetime
import mplfinance as mpf
import numpy as np
from matplotlib.font_manager import FontProperties
import csv
from pandas.core.frame import DataFrame
import numpy as np
from functools import reduce
from scipy.optimize import minimize
from tkinter import *
import glob
import time
import shutilplt.rcParams['font.sans-serif']=['SimHei'] #中文
plt.rcParams['axes.unicode_minus'] = False
pro = ts.pro_api('这里输入你的token')#投资组合中的股票数量和股票代码
l=4
mycode=['000001','000002','600519','600522']

清洗数据:

#查找完整股票代码
full=[]
for scode in mycode:dat1 = pro.query('stock_basic', fields='ts_code,symbol,name')code = list(dat1.loc[dat1['symbol'] == scode].ts_code)code=','.join(code)tscode=full.append(code)
full1=','.join(full)#提取股票日交易信息
def get_trade_price(stock_code):df = pro.daily(ts_code=stock_code, start_date='20190128', end_date='20190222')df.to_csv('.\daily.csv')return df
get_trade_price(full1)#csv编辑
#删除多余列
d=pd.read_csv('.\daily.csv',index_col=0)
d=d.drop(['open','high','low','pre_close','change','close','vol','amount'],axis=1)
d.to_csv('.\Drop.csv',index=False,encoding="utf-8")# 分类保存
# 按股票分类
if os.path.exists("分类数据"):shutil.rmtree('分类数据')
if not os.path.exists("分类数据"):os.makedirs("分类数据")with open('.\Drop.csv') as fin:csvin = csv.DictReader(fin)outputs = {}for row in csvin:td = row['ts_code']if td not in outputs:fout = open('.\分类数据\{}.csv'.format(td), 'w',newline="")dw = csv.DictWriter(fout, fieldnames=csvin.fieldnames)outputs[td] = fout, dwdw1 = csv.writer(fout)dw1.writerow(['ts_code','date',td])outputs[td][1].writerow(row)for fout, _ in outputs.values():fout.close()#保存日期序列
s1=full[1]
date=pd.read_csv('.\分类数据\{}.csv'.format(s1))
date=date.drop(['ts_code',s1],axis=1)
date.to_csv('.\date.csv',index=False,encoding="utf-8")#删除股票代码列
for i in range(0,len(full)):stock=full[i]print(stock)d=pd.read_csv('.\分类数据\{}.csv'.format(stock))d=d.drop(['ts_code'],axis=1)d.to_csv('.\分类数据\{}.csv'.format(stock),index=False,encoding="utf-8")#股票合并为最终csv
outputfile='.\date.csv'
csv_list = glob.glob('.\分类数据\*.csv')
print(u'共发现%s个CSV文件'%len(csv_list))
filepath = csv_list[0]
for i in range(0,len(csv_list)):filepath = csv_list[i]df1 = pd.read_csv(filepath, encoding='utf-8')df2 = pd.read_csv(outputfile, encoding='utf-8')outfile = pd.merge(df1, df2, on='date',how='right')outfile.to_csv('.\date.csv', index=False,encoding='utf-8')

再绘制投资组合可行集:

#获取收益率的dataframe
#构建有效边界
tmp_list=[]
with open('.\date.csv', 'r') as f:reader=csv.reader(f)for row in reader: #每个row是一个列表tmp_list.append(row[1:])
print('\n')
df=pd.DataFrame(tmp_list[1:], columns=tmp_list[0])
df=df.apply(pd.to_numeric, errors='coerce').fillna(0) #转换为数值
df=df/100
print(df)#四支股票的风险溢价和协方差矩阵
mean=df.mean()
cov=df.cov()
print(mean)#找到最大和最小均值
def cut(num,c):c=10**(-c)return (num//c)*c
max_mean=cut(float(np.format_float_positional(max(mean),precision=2,fractional=False,trim='-')),3)
min_mean=cut(float(np.format_float_positional(min(mean),precision=2,fractional=False,trim='-'))+0.001,3)
print(max_mean,min_mean)#定义用来计算组合风险溢价、标准差的函数
weight=np.random.rand(l)
weight/=sum(weight)
def risk_prem(w):return np.dot(w,mean)
def std_dev(w):return np.sqrt(reduce(np.dot,[w,cov,w.T]))#根据收益-方差对找出所有可行组合
rtn=[]
sds=[]
for i in range(80000):weight=np.random.rand(l)weight=weight/sum(weight)rtn.append(risk_prem(weight))sds.append(std_dev(weight))
plt.scatter(sds,rtn,cmap='YlGnBu', marker='o', edgecolor='none',s=10, alpha=0.3)
plt.colorbar()plt.title('投资组合可行集')
plt.xlabel('组合标准差')
plt.ylabel('组合期望收益')
plt.show()

最终得到的投资组合可行集如下图所示:

利用tushare绘制投资组合可行集python代码相关推荐

  1. 绘制小猪佩奇的python代码

    一个很有意思的代码,可以绘制出小猪佩奇,代码来源 github.com """ 绘制小猪佩奇 """ from turtle import ...

  2. 【目标检测】将目标检测数据集划分为训练集、验证集与测试集 python代码

    文件结构 数据集data_dir文件结构: ├── data_dir: 数据集图片所在目录(可包含其他合适文件,本脚本只对图片进行统计)├── 1.jpg: 图片1├── 2.jpg: 图片2└── ...

  3. NLP实战一 利用OpenAI Codex实现中文转python代码

    OpenAI Codex 是 GPT-3 的后代:它的训练数据包含自然语言和来自公开来源的数十亿行源代码,包括公共 GitHub 存储库中的代码.OpenAI Codex 最擅长 Python,但它也 ...

  4. Python Matplotlib绘制漂亮的K线图,利用Tushare绘制K线图

    1 引言 做量化分析,难免要将自己的某些指标等绘制在K线图上,或者对某些指标进行改造观察K线图和指标对应的走势关系.那么用Python如何绘制和炒股软件类似的效果呢. 2 准备工具 (1)数据源:Tu ...

  5. 【数据可视化应用】绘制极坐标(附Python代码)

    折扇图 先从简单的折扇图开始, 此图在新冠疫情期间很火, 其实就是极坐标系下的柱状图,我这里随便编了几个数据.自动计算坐标,无论长度如何. 文字标签坐标是柱子中线顶点向外偏移200个单位. # 编造数 ...

  6. 快速傅里叶变换及python代码实现

    文章来源:https://www.cnblogs.com/LXP-Never/p/11558302.html 快速傅里叶变换及python代码实现 目录 一.前言   傅里叶变换相关函数   基于傅里 ...

  7. 分形几何python代码_Python, Cython绘制美妙绝伦的Mandelbrot集, 曼德博集分形图案

    上世纪60-70年代,美籍数学家曼德博 - Benoit B. Mandelbrot几乎单枪匹马的创立了一个新的数学分支,即分形几何学 - fractal geometry.这个新的数学分支有助于人类 ...

  8. 科研初体验之Linux服务器的入门使用,关于分配了Linux账号之后怎么用,以及怎么利用Linux服务器来跑我们的python代码

    前情提要 如果有人看了我之前发的乱七八糟的博客的话,应该就能了解到,我之前是计算机专业大三的学生,好不容易get到了保研的名额,前段时间就一直在操练LeetCode,到处报夏令营啊,预推免什么的,最后 ...

  9. python量化:如何利用tushare构造FF三因子模型?

    Python量化:如何利用tushare构造FF三因子模型? FF三因子模型介绍 代码实现 从tushare调取数据 利用数据构建因子 总结 笔者是一枚大二菜狗,最近刚上完学院开的python金融量化 ...

最新文章

  1. 样式超出设定宽度显示显示省略号
  2. AAAI21最佳论文Runners Up!Transformer的归因探索!
  3. 【脚本整理】docker-compose 部署prometheus + grafana
  4. CentOs6系统安装及前期为安装Cdh4准备
  5. SAP CRM 中间件里的发布-订阅者模式
  6. 前端 圆形进度图_CSS3+JS实现静态圆形进度条
  7. POJ2594 Treasure Exploration
  8. android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar
  9. C语言volatile关键字—最易变的关键字
  10. wxAdditions使用小结
  11. linux配置libpng环境变量_不同操作系统下 jdk 的配置
  12. 【dfs+简单贪心】Leaf Sets【Codeforces Round #510 (Div. 2)】
  13. 幻方矩阵(魔方矩阵)
  14. C语言中不同类型之间的混合运算
  15. Excel表格转换为Word表格,并且保留Excel表格中公式不发生变化
  16. 多线程概念以及线程同步
  17. java.lang.AbstractMethodError: dm.jdbc.driver.DmdbConnection.isValid(I)Z
  18. 武侠末世(真香游戏V2.0)
  19. Scratch课程设计(三)
  20. 对话驻云创始人 | 七问技术创业者(合辑)

热门文章

  1. 课题:shell脚本安装httpd
  2. php手册下载打开没有内容,word保存了但是再打开就没有了怎么办
  3. C语言给小学生出题(随机1~99进行四则运算)
  4. 派森学python_2019 年 1月 26 日 随笔档案 - 派森学python - 博客园
  5. 江苏省一级计算机ms,计算机一级六大MS题型介绍
  6. ARMV8体系结构简介:AArch64系统级体系结构之Self-hosted debug
  7. [NAS] Synology (群晖) DSM7.0 使用自定义供应商DDNS
  8. Java(实验三)类与对象-定义并实现一个长方体类(Cube),包含长(length)、宽(width)与高(height)等三个属性
  9. 修建道路(最小生成树)
  10. 溜溜TC Games手游助手,无需模拟器,高清流畅不卡顿功能介绍