Я изучаю максимальный портфель диверсификации в области финансов, и я написал несколько кодов об этом. Но когда я вычисляю доходность, я нахожу доходность 3300% через 10 лет для 350 акций, что почти невозможно. Я хотел бы чтобы понять, что не так в том, как я написал код для вычисления совокупного дохода или веса.
Большое спасибо
Есть код:
import numpy as np
from scipy.optimize import minimize
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
import statsmodels.api as sm
import seaborn as sns
sns.set_style('darkgrid')
A=pd.read_excel('/Users/elyes/Desktop/SP500.xlsx',index_col='Date')
C1=pd.read_excel('/Users/elyes/Desktop/SP500_qarm_project.xlsx',index_col='Date')
C3=pd.read_excel('/Users/elyes/Desktop/Nikkei225_qarm_project.xlsx',index_col='Date')
C4=pd.read_excel('/Users/elyes/Desktop/Hangseng_qarm_project.xlsx',index_col='Date')
T=A.columns
d=A
r=d.pct_change()
interest_rates= pd.DataFrame()
interest_rates=wb.DataReader('^TNX',data_source='yahoo',start='2000-01-03')['Adj Close']
C=C1.join([C3,C4]).fillna(0).loc['2001-01-03':]
returns = C.pct_change()
Cumulative_returns_comparators=(1+C.pct_change()).cumprod()
G=252
D=0
listf=[]
Weights={}
Returns={}
K=252
H=K+126
for t in range(len((r.resample('6M').mean()).iloc[2:,])):
cov_matrix=np.array(r.iloc[D:G,:].cov().fillna(0)*252)
cov_matrix=cov_matrix.reshape((len(T),len(T)))
RM_basis_mean = r.iloc[D:G,:].mean().fillna(0) *252
rstd=r.iloc[D:G,:].std()*252**(1/2)
rstd=rstd.fillna(0)
def most_div(w):
global p_volatility,w_volatility,cov_matrix
std=np.array(rstd)
std=std.reshape((len(T),1))
w_volatility = np.dot(w,std)
p_volatility = np.sqrt(np.dot(w,np.dot(cov_matrix,w.T)))
diversification_ratio = w_volatility/p_volatility
return -diversification_ratio
def check_sum(w):
return np.sum(w) - 1
def maximiser(w0):
global res
cons = ({'type':'eq','fun':check_sum})
bnds = tuple((0, 1) for s in T)
res = minimize(most_div,w0,method='SLSQP',options={'disp': False,'maxiter':10},bounds=bnds,constraints=cons)
return res
w0 = (1/len(T))*np.ones(len(T))
maximiser(w0)
Weights[t]=res.x
Returns[t]=Weights[t]*r.iloc[K:H]
listf.append(-res.fun)
D=D+126
G=G+126
K=K+126
H=H+126
returns=pd.concat(Returns).droplevel(0)
Cumulative_returns=(returns.sum(axis=1)+1).cumprod()
Cumulative_returns```