1+ import numpy as np
2+ import pandas as pd
3+ import matplotlib .pyplot as plt
4+ from Investar import Analyzer
5+
6+ mk = Analyzer .MarketDB ()
7+ stocks = ['삼성전자' , 'SK하이닉스' , '현대자동차' , 'NAVER' ]
8+ df = pd .DataFrame ()
9+ for s in stocks :
10+ df [s ] = mk .get_daily_price (s , '2016-01-04' , '2018-04-27' )['close' ]
11+
12+ daily_ret = df .pct_change ()
13+ annual_ret = daily_ret .mean () * 252
14+ daily_cov = daily_ret .cov ()
15+ annual_cov = daily_cov * 252
16+
17+ port_ret = []
18+ port_risk = []
19+ port_weights = []
20+ sharpe_ratio = []
21+
22+ for _ in range (20000 ):
23+ weights = np .random .random (len (stocks ))
24+ weights /= np .sum (weights )
25+
26+ returns = np .dot (weights , annual_ret )
27+ risk = np .sqrt (np .dot (weights .T , np .dot (annual_cov , weights )))
28+
29+ port_ret .append (returns )
30+ port_risk .append (risk )
31+ port_weights .append (weights )
32+ sharpe_ratio .append (returns / risk ) # ①
33+
34+ portfolio = {'Returns' : port_ret , 'Risk' : port_risk , 'Sharpe' : sharpe_ratio }
35+ for i , s in enumerate (stocks ):
36+ portfolio [s ] = [weight [i ] for weight in port_weights ]
37+ df = pd .DataFrame (portfolio )
38+ df = df [['Returns' , 'Risk' , 'Sharpe' ] + [s for s in stocks ]] # ②
39+
40+ max_sharpe = df .loc [df ['Sharpe' ] == df ['Sharpe' ].max ()] # ③
41+ min_risk = df .loc [df ['Risk' ] == df ['Risk' ].min ()] # ④
42+
43+ df .plot .scatter (x = 'Risk' , y = 'Returns' , c = 'Sharpe' , cmap = 'viridis' ,
44+ edgecolors = 'k' , figsize = (11 ,7 ), grid = True ) # ⑤
45+ plt .scatter (x = max_sharpe ['Risk' ], y = max_sharpe ['Returns' ], c = 'r' ,
46+ marker = '*' , s = 300 ) # ⑥
47+ plt .scatter (x = min_risk ['Risk' ], y = min_risk ['Returns' ], c = 'r' ,
48+ marker = 'X' , s = 200 ) # ⑦
49+ plt .title ('Portfolio Optimization' )
50+ plt .xlabel ('Risk' )
51+ plt .ylabel ('Expected Returns' )
52+ plt .show ()
0 commit comments