尽管最优化的方法是理论上最优解,但我认为还是蒙特卡洛方法来看简单,也更真实一些。
另外,数据处理和清洗其实是这段代码花的时间最长的部分。尽管数据是从相应的网站copy下来的,但是数据还是有不少的奇异值,需要处理。如果你不亲身经历的话,就不会知道经历了什么。

需要说明的是,收益率和波动,需要严格的日期对齐,并不象随机数一样,简单,活不少。

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 22 08:34:18 2019@author: songroom
"""#https://blog.csdn.net/weixin_42018258/article/details/80953809
#https://blog.csdn.net/itcastcpp/article/details/75807811
# Pyfolio
# https://www.jianshu.com/p/4cc811402477
# import pandas as pd  # https://blog.csdn.net/asialee_bird/article/details/89417750
#
import matplotlib.pyplot as plt
import pandas as pd
import os
import numpy as np
import time as t
import datetime as dt
from datetime import timedeltastocks = ["YUM","DIS","RIO","COST","FCN","PEP","TAL","GOOG","OKE","NKE","FB","CELG","BABA","ICE","BAX"]
stocks = ["YUM","DIS","RIO","COST","FCN","PEP","TAL","GOOG","OKE","NKE","FB","BABA","ICE","BAX"]
stocks = ["YUM","DIS","RIO","COST","FCN","PEP","TAL","GOOG","OKE","NKE","BABA","ICE","BAX"]
stocks = ["YUM","DIS","RIO","COST","FCN","PEP","TAL","GOOG","NKE","BABA","ICE","BAX"]
stocks = ["YUM","DIS","COST","FCN","PEP","TAL","NKE","ICE","BAX"]
path   = r"S:\data"
output_path = r"C:\Users\Administrator\Desktop\output"
nowtime = dt.datetime.now().strftime("%Y%m%d_%H%M%S")
port_best_weight ={
"YUM":  0.023756235171897618,"DIS" :0.03014070796771593,"COST": 0.08892953965680671,"FCN" :0.1876235028458973,"PEP": 0.07380931812203975,"TAL": 0.20264458091189966,"NKE": 0.2257260573355881,"ICE": 0.037347140266800055,"BAX": 0.13002291772135482}def best_portfolio():passdef read_sp500_source():path_stock = os.path.join(path,"sp500.csv")df = pd.read_csv(path_stock,sep=',',index_col= 0,encoding='utf-8')df.index = [dt.datetime.strptime(day,'%Y/%m/%d') for day in df.index]return df
def read_csv_stocks_source():data =[]for stock in stocks:path_stock = os.path.join(path,stock+".csv")print("stock=>",stock)df = pd.read_csv(path_stock,sep=',',index_col= 0,encoding='utf-8')df.index = [dt.datetime.strptime(day,'%Y/%m/%d') for day in df.index]data.append(df)return data#close    open    high    low volume  pct
def etl_index_data(sp500,common_start_dt):df = sp500.iloc[sp500.index >= common_start_dt,:]df = df.sort_index(ascending=True)return df.closedef etl_stock_data(data,common_start_dt):new_data =[]i =0for d in data:df = d.iloc[d.index >= common_start_dt,:]df2 = df.sort_index(ascending=True)new_data.append(df2)print("etl=>i:",i, "stock:",stocks[i],"len:",len(df2))i = i+1return new_datadef get_common_dates_array(data,sp500):length = len(data)dates ={}i = 1for d in data[1:length]:for date in sp500.index:if date not in d.index:breakelse:dates[stocks[i]] = datei = i+1return datesdef put_stocks_df_data_together(sort_data):data = pd.DataFrame()for df in sort_data:if len(data)==0:data = df.closeelse:data = pd.concat([data,df.close],axis=1)data.columns = stocksreturn datadef price2ret(stocks_close_price):stocks_returns_raw = stocks_close_price.pct_change()#dropna(how='all',axis=0)# row stocks_returns = stocks_returns_raw.iloc[1:,:]return stocks_returnsdef get_portfolio_random_weight(count):random_weights = np.random.random(count)portfolio_weights = np.array(random_weights/sum(random_weights))return portfolio_weightsdef get_portfolio_returns(stock_returns,portfolio_weights):weighted_returns = stock_returns.mul(portfolio_weights, axis=1)portfolio_returns = weighted_returns.sum(axis=1)return portfolio_returnsdef get_portfolio_cumprod_return(portfolio_returns):portfolio_cumprod_returns = (1+portfolio_returns).cumprod()-1return portfolio_cumprod_returnsdef get_porfolio_gain_return(portfolio_returns):portfolio_cumprod_returns = get_portfolio_cumprod_return(portfolio_returns)length = len(portfolio_cumprod_returns)gained_portfolio_return = portfolio_cumprod_returns[length-1]return (gained_portfolio_return/length)*252def get_std(portfolio_returns):portfolio_std = np.std(portfolio_returns)* np.sqrt(252)return portfolio_stddef get_max_drawdown_value(portfolio_returns):passdef get_sharpe_ratio(portfolio_returns,expect_market_annual_return):'''计算公式为:SharpeRatio=[ E(Rp)-Rf ] / σpE(Rp):投资组合预期报酬率(平均回报率):Rf: 无风险利率(通常用国债利率来代替)σp:投资组合的标准差'''gained_portfolio_return = get_porfolio_gain_return(portfolio_returns)portfolio_std     = get_std(portfolio_returns)sharpe_ratio      = (gained_portfolio_return-expect_market_annual_return) / portfolio_stdprint("gained_return: ",gained_portfolio_return," std: ",portfolio_std," sharp ratio: ",sharpe_ratio)return sharpe_ratiodef get_stock_beta_value(stock_returns,index_returns):'''beta = 个股与市场的相关性corr* 个股标准差std /指数的标准差 std'''codes = stock_returns.columnsstock_stds = stock_returns.std()*np.sqrt(252) # seriesindex_std = index_returns.std()*np.sqrt(252) # valuestocks_beta =[]for code in codes:corr = stock_returns[code].corr(index_returns)beta = corr*stock_stds[code]/index_stdstocks_beta.append(beta)print("code: ",code , "beta:",beta,"corr:",corr)return stocks_betadef get_portfolio_beta(stocks_beta,weights):beta =0for i in range(len(stocks_beta)):beta = beta + stocks_beta[i]*weights[i]return beta#def get_sp500_close_price():
#    sp500 = read_sp500_source()
#    sort_index_data = etl_index_data(sp500,common_start_dt)if __name__ == '__main__':# 数据准备t0 = t.time()count = len(stocks)print("including sp500, stock counts:",count)sp500 = read_sp500_source()stocks_data = read_csv_stocks_source()dates = get_common_dates_array(stocks_data,sp500)add_days = 1800common_start_dt = np.max(list(dates.values()))+timedelta(days =add_days)print("common_start_dt:",common_start_dt)sort_stock_data = etl_stock_data(stocks_data,common_start_dt)sort_index_data = etl_index_data(sp500,common_start_dt)stocks_close_price = put_stocks_df_data_together(sort_stock_data)stock_returns = price2ret(stocks_close_price)index_returns = (sort_index_data-sort_index_data.shift(1))/sort_index_data.shift(1)index_returns = index_returns.dropna()print("=>")print(len(index_returns))simu_counts = 100expect_market_annual_return = 0.02best_sharp_ratio = -10000best_weights =[]best_return = 0.0for i in range(simu_counts):portfolio_weights = get_portfolio_random_weight(count)portfolio_returns = get_portfolio_returns(stock_returns,portfolio_weights)sharp_ratio_value = get_sharpe_ratio(portfolio_returns,expect_market_annual_return)print("now simu : ",i,"sharpe ratio:",sharp_ratio_value)if sharp_ratio_value > best_sharp_ratio:best_sharp_ratio = sharp_ratio_valuebest_weights = portfolio_weightsprint("simu get better sharp ratio: ",sharp_ratio_value)t1 = t.time()print("simu process is over,cost time:",t1-t0,'s')j = 0for w in best_weights:print("stock:",stocks[j],"weights:",w)j =j+1best_simulation_returns =get_portfolio_returns(stock_returns,best_weights)print("start_dt:",common_start_dt,"end_dt:2019-10-21")print("return:",get_porfolio_gain_return(best_simulation_returns))print("best sharpe ratio:",best_sharp_ratio)# corrprint("stocks corr:")print(stock_returns.corr())# cov:print("stocks cov:")corr_df =stock_returns.corr()print(corr_df)#df.to_csv(file,index = False,encoding = 'utf_8_sig')corr_df.to_csv(output_path+"\\corr_matrix_"+nowtime+".csv",index = True,encoding = 'utf_8_sig')# stock stdprint("stocks std:")print(stock_returns.std()*np.sqrt(252))# stock beta and portfolio betastocks_beta = get_stock_beta_value(stock_returns,index_returns)portfolio_beta = get_portfolio_beta(stocks_beta,best_weights)print("portfolio beta: ",portfolio_beta)best_simulation_cumprod_return = get_portfolio_cumprod_return(best_simulation_returns)best_simulation_cumprod_return.plot()print("----------best portfolio-----------")best_portfolio_returns_used = get_portfolio_returns(stock_returns,list(port_best_weight.values()))best_portfolio_returns_used.to_frame().to_csv(output_path+"\\portfolio_return_"+nowtime+".csv")best_portfolio_cumprod_return_used = get_portfolio_cumprod_return(best_portfolio_returns_used)best_portfolio_cumprod_return_used.to_frame().to_csv(output_path+"\\cumprod_portfolio_return_"+nowtime+".csv")sp500_cumprod_return = get_portfolio_cumprod_return(index_returns)sp500_cumprod_return.to_frame().to_csv(output_path+"\\cumprod_sp500_return_"+nowtime+".csv")pd.DataFrame.from_dict(port_best_weight,orient='index').to_csv(output_path+"\\weights_"+nowtime+".csv")best_port_beta = get_portfolio_beta(stocks_beta,list(port_best_weight.values()))print("best_risk_portfolio_beta:", best_port_beta)best_sharp_ratio_value_used = get_sharpe_ratio(best_portfolio_returns_used,expect_market_annual_return)print("best portfolio sharp-ratio value:",best_sharp_ratio_value_used)

Python: 组合管理与蒙特卡洛方法实现相关推荐

  1. python学习之 利用蒙特卡洛方法计算PI值

    使用环境为python IDLE3.5. #利用蒙特卡洛方法计算PI值 from random import random from math import sqrt from time import ...

  2. Cap21_项目组合管理

    21 项目组合管理 21.1 项目组合管理概述 21.1.1 项目组合 项目组合是将项目.项目集,以及其他方面的工作内容组合起来进行有效管理,以保证满足组织的战略性的业务目标. 21.1.2 项目组合 ...

  3. 用蒙特卡洛方法计算派-python和R语言

    用蒙特卡洛方法算pi-基于python和R语言 最近follow了MOOC上一门python课,开始学Python.同时,买来了概率论与数理统计,准备自学一下统计.(因为被鄙视过不是统计专业却想搞数据 ...

  4. CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法

    之前有的朋友问我,CentOS版本怎么安装python的pip,我之前给出的Ubuntu下apt-get的方法 ubuntu 需要先安装下pip吧, apt-get install python-pi ...

  5. 3 随机数与蒙特卡洛方法及Python实现

    0 建议学时 4学时 1 引入 1.1 随机数与采样 客观世界的某些行为,结果具有随机性: 掷骰子.投硬币: 等待公交车的时间: 种子发芽的比例: 1.2 随机数函数 1.2.1 random模块 P ...

  6. 怎样用python计算π的值_IV.python初探日记:python实现蒙特卡洛方法计算π值

    早上中级微观经济学课上复习泰勒展开和麦克劳林展开,顺带讲到了用蒙特卡洛方法实现计算π值,于是下午着手用python尝试着实现了一下,并用matplotlib输出了一部分数据. 完整的代码在文末,本文适 ...

  7. 蒙特卡洛python求解派_用蒙特卡洛方法计算派-python和R语言

    标签: 用蒙特卡洛方法算pi-基于python和R语言 最近follow了MOOC上一门python课,开始学Python.同时,买来了概率论与数理统计,准备自学一下统计.(因为被鄙视过不是统计专业却 ...

  8. python 组合数字和字符_python无限生成不重复(字母,数字,字符)组合的方法

    python无限生成不重复(字母,数字,字符)组合的方法 使用python自带的itertools模块 调用其product函数 传入我们想组合生成的字符数据 便会源源不断的生成组合 而且不会重复 r ...

  9. Python开发多媒体管理软件实现方法

    软件开发环境 python 3.7.3 pycharm Community 2020 PYQT5 教师端控制界面 下拉列表显示全部已经连接的客户端ip地址 对选中的设备进行查看设备信息,重启电脑,关闭 ...

  10. python 统计组合用什么库_Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法...

    本文实例讲述了Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法.分享给大家供大家参考,具体如下: 统计两个红球和蓝球,哪个组合最多,显示前19组数据 #!/usr/bin/python ...

最新文章

  1. iOS 多线程的四种技术方案
  2. 高效掌握新技能的「树型思维」
  3. python语音合成并播放_使用Python实现文字转语音并生成wav文件的例子
  4. 区块链BAAS平台:公共或私人区块链编程以用于各种用途
  5. 自监督学习在CV领域研究进展总结
  6. 【精华】Asp优化之缓存技术
  7. pytorch的余弦退火学习率
  8. Linux学习一天一个命令(1)[ls命令]
  9. 常用工具软件使用【2】
  10. ofd软件linux,数科和福昕OFD软件同银河麒麟桌面操作系统完成互相兼容认证
  11. 多玩YY瞄准在线教育
  12. 深度学习 DEEP LEARNING 1-2章
  13. 人工智能与大数据就业前景_人工智能就业方向及发展前景
  14. sql server触发器写法
  15. swal 弹窗html页面,SweetAlert - 演示6种不同的提示框效果
  16. Android————一个简单记账本(Bookkeeping)
  17. Win11安装VMware虚拟机+win10教程(主要遇到蓝屏重启问题)
  18. 【大众点评评论爬虫】一键获取大众点评完整评论工具批量爬取保存为excel数据
  19. 完美卸载VS2019(亲测有效)
  20. 如何修改Linux的锁屏时间,调整Kali Linux的锁屏时间

热门文章

  1. vue.js 首屏优化
  2. SmtpClient 类
  3. 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布
  4. DevComponents.AdvTree 相关笔记
  5. iphone多线程事件循环
  6. CE驱动程序快速入门(转)
  7. DDL、DML、TCL
  8. mysql时间加减运算
  9. Redis 锁的实现方案
  10. 廖雪峰js教程笔记11 操作DOM(包含作业)