Максимальный коэффициент диверсификации и python - PullRequest
0 голосов
/ 17 апреля 2020

Я изучаю максимальный портфель диверсификации в области финансов, и я написал несколько кодов об этом. Но когда я вычисляю доходность, я нахожу доходность 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```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...