рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╢реБрд░реБрдЖрдд (рдФрд░ рди рдХреЗрд╡рд▓) рдирд┐рд╡реЗрд╢рдХ рдЕрдХреНрд╕рд░ рдЖрд╢реНрдЪрд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЖрджрд░реНрд╢ рдЕрдиреБрдкрд╛рдд рдХреИрд╕реЗ рдЪреБрдирдирд╛ рд╣реИред рдЕрдХреНрд╕рд░ (рдпрд╛ рдмрд╣реБрдд рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рджрд▓рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ), рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд▓рдЧреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдкреЛрд╕реНрдЯ рдкрд╛рдпрдерди рдФрд░ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╡рдЬрд╝рди рдХреЗ рдРрд╕реЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдЧрд╛:

  • рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рднрдкреНрд░рджрддрд╛ рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рд╕реНрддрд░ рдХреЗ рдЬреЛрдЦрд┐рдо рд╡рд╛рд▓рд╛ рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ;
  • рд╕реНрдерд╛рдкрд┐рдд рдЬреЛрдЦрд┐рдо рдкрд░ рдЕрдзрд┐рдХрддрдо рд▓рд╛рднрдкреНрд░рджрддрд╛ рдХреЗ рд╕рд╛рде рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ;
  • рдЕрдзрд┐рдХрддрдо рдЙрдкрдЬ рдХреЗ рд╕рд╛рде рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ

рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрдирд╡рд░реА 2020 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд▓рд╛рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдиреМ рд╕реНрдЯреЙрдХ рд▓реЗ рд▓реЗрдВрдЧреЗ рдФрд░ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рднрд╛рд░ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: 'ATVI', 'BA', 'CNP', 'CMA', 'STZ', 'рдЬреАрдкреАрдПрди', 'рдПрдордкреАрд╕реА', 'рдПрдирдИрдПрдо' рдФрд░ 'рдкреАрдХреЗрдЖрдИ'ред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд┐рдЫрд▓реЗ рддреАрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдХ рдбреЗрдЯрд╛ рд▓реЗрдВрдЧреЗред

# 

import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

#    
ticker = ['ATVI','BA','CNP','CMA', 'STZ','GPN','MPC','NEM', 'PKI']

stock = yf.download(ticker,'2017-01-01', '2019-01-31') 


рдпрджрд┐ рдЖрдк рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд╢реЗрдпрд░реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд░рд╛рд╢рд┐ рдПрдХ (рдпрд╛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░) рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

#    
all_adj_close = stock[['Adj Close']]

#  
all_returns = all_adj_close.pct_change()

#       
mean_returns = all_returns.mean()
cov_matrix = all_returns.cov()

рдЕрдм рдЖрдк рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╡рдЬрди рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рддреАрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреА рд▓рд╛рднрдкреНрд░рджрддрд╛ рдФрд░ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

#    
robot = np.array([0.0441, 0.1030, 0.1086, 0.2070, 0.1525, 0.0714, 0.0647, 0.1828, 0.0661])

# ,     
portfolio_return_robot = np.sum(mean_returns * robot)
portfolio_std_dev_robot = np.sqrt(np.dot(robot.T,np.dot(cov_matrix, robot)))
sharpo_robot = portfolio_return_robot/portfolio_std_dev_robot

#         
robot_result = np.array([portfolio_return_robot, portfolio_std_dev_robot, sharpo_robot])
robot_result = np.array([portfolio_return_robot, portfolio_std_dev_robot, sharpo_robot])
robot_result = np.concatenate((robot_result, robot), axis=0)
robot_sim_result = pd.DataFrame(robot_result, columns=['Robot'], index=['ret','stdev','sharpe',ticker[0],ticker[1],ticker[2],ticker[3],ticker[4],ticker[5],ticker[6],ticker[7],ticker[8]])

print(robot_sim_result) 

рдЫрд╡рд┐

рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕рд┐рдореБрд▓реЗрд╢рди


рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реЗрдпрд░реЛрдВ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рдЬрди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЙрдкрдЬ рдФрд░ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВред рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рдЬрди рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ (рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдпреЛрдЧ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рд╕рдм рдХреБрдЫ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ - рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдФрд░ рдмрдЪрддред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдордп, рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рдХреНрд╖рдорддрд╛, рдФрд░ рдЬреЛрдЦрд┐рдореЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдЬреЛ рдирд┐рд╡реЗрд╢рдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдиреНрдпреВрдирддрдо рдиреБрдХрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХрддрдо рд╢рд╛рд░реНрдк рдЕрдиреБрдкрд╛рдд рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10,000 рдЧрдгрдирд╛рдПрдБ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

#   
num_iterations = 10000
simulation_res = np.zeros((4+len(ticker)-1,num_iterations))

#  
for i in range(num_iterations):
        #    ,    1
        weights = np.array(np.random.random(9))
        weights /= np.sum(weights)
        
        #    
        portfolio_return = np.sum(mean_returns * weights)
        portfolio_std_dev = np.sqrt(np.dot(weights.T,np.dot(cov_matrix, weights)))
        
        #     
        simulation_res[0,i] = portfolio_return
        simulation_res[1,i] = portfolio_std_dev
        
        #    
        simulation_res[2,i] = simulation_res[0,i] / simulation_res[1,i]
        
        # 
        for j in range(len(weights)):
                simulation_res[j+3,i] = weights[j]

#     DataFrame     .
sim_frame = pd.DataFrame(simulation_res.T,columns=['ret','stdev','sharpe',ticker[0],ticker[1],ticker[2],ticker[3],ticker[4],ticker[5],ticker[6],ticker[7],ticker[8]])

рдЕрдм рдЖрдк рдЕрдзрд┐рдХрддрдо рд╢рд╛рд░реНрдк рдЕрдиреБрдкрд╛рдд рдпрд╛ рдиреНрдпреВрдирддрдо рдЬреЛрдЦрд┐рдо рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

#   Sharpe Ratio
max_sharpe = sim_frame.iloc[sim_frame['sharpe'].idxmax()]

#    
min_std = sim_frame.iloc[sim_frame['stdev'].idxmin()]

print ("The portfolio for max Sharpe Ratio:\n", max_sharpe)
print ("The portfolio for min risk:\n", min_std)

рдЫрд╡рд┐

рдЫрд╡рд┐

рдЬрдм рдЖрдк рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

fig, ax = plt.subplots(figsize=(10, 10))

#    scatter plot        x      y

plt.scatter(sim_frame.stdev,sim_frame.ret,c=sim_frame.sharpe,cmap='RdYlBu')
plt.xlabel('Standard Deviation')
plt.ylabel('Returns')
plt.ylim(0,.0015)
plt.xlim(0.007,0.012)

plt.scatter(max_sharpe[1],max_sharpe[0],marker=(5,1,0),color='r',s=600)

plt.scatter(min_std[1],min_std[0],marker=(5,1,0),color='b',s=600)

plt.scatter(portfolio_std_dev_robot, portfolio_return_robot,marker=(5,1,0),color='g',s=600)

plt.show()

рдЫрд╡рд┐

рдЕрдзрд┐рдХрддрдо рд╢рд╛рд░реНрдк рдЕрдиреБрдкрд╛рдд рд╡рд╛рд▓рд╛ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рд▓рд╛рд▓ рд╕рд┐рддрд╛рд░рд╛, рдиреАрд▓рд╛ - рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдиреНрдпреВрдирддрдо рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдФрд░ рд╣рд░рд╛ - рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░реЛрдмреЛрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдЗрди рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╡реЗрд╢рдХ рдХреЛ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдореИрдВ рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рддреБрд▓рдирд╛рддреНрдордХ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рдкрд╕реА рд╣реЛред рдФрд░ рдЕрдм рд╕рднреА рддреАрди рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдбреНрд░реЙрдбрд╛рдЙрди рдореЗрдВ рд╣реИрдВред

All Articles