# -*- coding: utf-8 -*- """ G.T.2019 cours M2 ISF """ import numpy as np import pandas as pd import matplotlib.pyplot as plt #%matplotlib qt #%% import os os.chdir('C:/Users/gturinici/Desktop/coursM2_isf_P20') os.listdir() #%% data2=pd.read_csv('cac40_30.csv',sep=';') data2.head() data2.hist(bins=30) returns= pd.DataFrame() cac40codes= data2.columns[1:] for item in cac40codes: returns[item]=np.log(data2[item]/ data2[item].shift(1)) data2.hist(bins=30) returns.hist(bins=30) #%% #TODO n=30 #choisir n actifs au hasard parmi les "cac40codes" sans repetition actifs= np.random.choice(cac40codes,n,replace=False) no_portf=1000 #calcul des rendements returns_jour= pd.DataFrame() returns_an= pd.DataFrame() for item in actifs: returns_jour[item]=np.log(data2[item]/ data2[item].shift(1)) returns_an=returns_jour*250.0 rendements_an=np.array(returns_an.mean()) rendements_an=rendements_an[:,None] cov_an=np.array(returns_an.cov()) inverse_cov=np.linalg.inv(cov_an) # tirer au hasard M portefeuilles avec 100% actifs risques # plot rendement/risque #%% rendements_portef=[] volatilite_portef=[] for portefeuile in range(no_portf): poids = np.random.rand(n,1) poids = poids + (1-np.sum(poids))/n rendement=np.float(poids.T @ rendements_an) volatilite=np.sqrt(np.float(poids.T @ cov_an @ poids)) rendements_portef.append(rendement) volatilite_portef.append(volatilite) plt.figure(5) plt.xlabel('Volatilite') plt.ylabel('Rendement') plt.title('Perf des portef., n='+str(n)) plt.plot(volatilite_portef,rendements_portef,'.b') #TODO: calculer a,b et +/- frontiere eff et la dessiner sur figure 5 onesM = np.ones_like(rendements_an) a= np.float(onesM.T @ inverse_cov @ onesM) b= np.float(onesM.T @ inverse_cov @ rendements_an) print("a=",a,"b=",b) fact_normalisation=np.sqrt(np.float( (rendements_an-b*onesM/a).T @ inverse_cov @ (rendements_an-b*onesM/a))) volatility_range= np.linspace(1/np.sqrt(a)+1e-6,2*max(volatilite_portef)) optimalvol = b/a + np.sqrt(volatility_range**2 - 1/a)*fact_normalisation plt.plot(volatility_range,optimalvol,'-g', volatility_range,-optimalvol,'-g') plt.show() # placer le portefeuille de marche sur les graphiques # placer 100 portefeuilles de marche calcules avec cov_an et rendements_an # perturbes # cov_an_perturbee = cov_an.copy() inverse_cov_an_perturbee = np.linalg.inv(cov_an_perturbee) rendements_an_perturbe = rendements_an.copy() R0=0.00# taux interet sans risque portef_marche = inverse_cov_an_perturbee @ (rendements_an_perturbe- R0*onesM) portef_marche /= np.sum(portef_marche) rendementPiM=np.float(portef_marche.T @ rendements_an) volatilitePiM=np.sqrt(np.float(portef_marche.T @ cov_an @ portef_marche)) plt.plot(volatilitePiM,rendementPiM,'*r') for _ in range(100): cov_an_perturbee = cov_an.copy()*(1+0.2*(-0.5+np.random.rand(n,n))) cov_an_perturbee= 0.5* (cov_an_perturbee.T + cov_an_perturbee) inverse_cov_an_perturbee = np.linalg.inv(cov_an_perturbee) rendements_an_perturbe = rendements_an.copy()*( 1+0.15*(-0.5+np.random.rand(n,1))) R0=0.00# taux interet sans risque portef_marche = inverse_cov_an_perturbee @ (rendements_an_perturbe- R0*onesM) portef_marche /= np.sum(portef_marche) rendementPiM=np.float(portef_marche.T @ rendements_an) volatilitePiM=np.sqrt(np.float(portef_marche.T @ cov_an @ portef_marche)) plt.plot(volatilitePiM,rendementPiM,'*r') plt.savefig("optimalCAC40_n"+str(n)+".pdf")