Merge branch 'develop' of http://khuhub.khu.ac.kr/2017103989/stock_chatbot into develop
Showing
1 changed file
with
83 additions
and
4 deletions
| 1 | -def GMM(): | 1 | +import datetime |
| 2 | - pass | 2 | +import pandas as pd |
| 3 | +import numpy as np | ||
| 4 | +import FinanceDataReader as fdr | ||
| 5 | +from scipy.optimize import minimize | ||
| 6 | +import json | ||
| 3 | 7 | ||
| 4 | -def backtest(): | ||
| 5 | - pass | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 8 | +class c_Models: | ||
| 9 | + #Input 값으로, 자산 list, 사용자 포트폴리오 비중, 시작일, 마지막일 | ||
| 10 | + def __init__(self, assets, assets_w, start, end): | ||
| 11 | + self.result = None | ||
| 12 | + self.graph = None | ||
| 13 | + | ||
| 14 | + data = pd.DataFrame() | ||
| 15 | + # 전체 자산 data들을 가지고 온 후, 정리함 | ||
| 16 | + for asset in assets: #total_list: | ||
| 17 | + tmp = fdr.DataReader(asset,start,end).Close | ||
| 18 | + tmp.rename(columns={'Close': asset}, inplace=True) | ||
| 19 | + data = pd.concat([data, tmp], axis=1) | ||
| 20 | + | ||
| 21 | + if data.isnull().values.any() == True: #불러온 data에 오류가 있다면 | ||
| 22 | + return "No Data",'' | ||
| 23 | + | ||
| 24 | + else: | ||
| 25 | + data = data.resample('M').mean() #일별 데이터를 월별 데이터로 만들어줌 | ||
| 26 | + data = data.pct_change() #월별 주가 데이터를 이용해 수익률 데이터로 변환 | ||
| 27 | + data.dropna(inplace=True) #결측치 제외(첫 row) | ||
| 28 | + | ||
| 29 | + self.data = data | ||
| 30 | + self.assets_w = assets_w | ||
| 31 | + self.mu = data.mean() * 12 | ||
| 32 | + self.cov = data.cov() * 12 | ||
| 33 | + | ||
| 34 | + #GMV 최적화 : 제약 조건은 비중합=1, 공매도 불가능 | ||
| 35 | + def gmv_opt(self): | ||
| 36 | + n_assets = len(self.data.columns) | ||
| 37 | + w0 = np.ones(n_assets) / n_assets | ||
| 38 | + fun = lambda w: np.dot(w.T, np.dot(self.cov, w)) | ||
| 39 | + constraints = ({'type':'eq', 'fun':lambda x: np.sum(x)-1}) | ||
| 40 | + bd = ((0,1),) * n_assets | ||
| 41 | + #cov = data.cov() * 12 | ||
| 42 | + | ||
| 43 | + gmv = minimize(fun, w0, method = 'SLSQP', constraints=constraints, bounds=bd) | ||
| 44 | + return gmv.x | ||
| 45 | + | ||
| 46 | + #Max Sharp ratio : risk free rate은 0.8%로 지정했고, | ||
| 47 | + def ms_opt(self): | ||
| 48 | + n_assets = len(self.data.columns) | ||
| 49 | + w0 = np.ones(n_assets) / n_assets | ||
| 50 | + fun = lambda w: -(np.dot(w.T, self.mu) - 0.008) / np.sqrt(np.dot(w.T, np.dot(self.cov, w))) | ||
| 51 | + bd = ((0,1),) * n_assets | ||
| 52 | + constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1}) | ||
| 53 | + maxsharp = minimize(fun, w0, method ='SLSQP', constraints=constraints, bounds=bd) | ||
| 54 | + return maxsharp.x | ||
| 55 | + | ||
| 56 | + def rp_opt(self): | ||
| 57 | + def RC(cov, w): | ||
| 58 | + pfo_std = np.sqrt(np.dot(w.T, np.dot(self.cov, w))) | ||
| 59 | + mrc = 1/pfo_std * (np.dot(self.cov, w)) | ||
| 60 | + rc = mrc * w | ||
| 61 | + rc = rc / rc.sum() | ||
| 62 | + return rc | ||
| 63 | + | ||
| 64 | + | ||
| 65 | + def RP_objective(x): | ||
| 66 | + pfo_std = np.sqrt(np.dot(x.T, np.dot(self.cov, x))) | ||
| 67 | + mrc = 1/pfo_std * (np.dot(self.cov, x)) | ||
| 68 | + rc = mrc * x | ||
| 69 | + rc = rc / rc.sum() | ||
| 70 | + | ||
| 71 | + a = np.reshape(rc, (len(rc),1)) | ||
| 72 | + differs = a - a.T | ||
| 73 | + objective = np.sum(np.square(differs)) | ||
| 74 | + | ||
| 75 | + return objective | ||
| 76 | + | ||
| 77 | + n_assets = len(self.data.columns) | ||
| 78 | + w0 = np.ones(n_assets) / n_assets | ||
| 79 | + constraints = [{'type':'eq', 'fun': lambda x: np.sum(x) -1}] | ||
| 80 | + bd = ((0,1),) * n_assets | ||
| 81 | + | ||
| 82 | + rp = minimize(RP_objective, w0, constraints=constraints, bounds = bd, method='SLSQP') | ||
| 83 | + | ||
| 84 | + return rp.x #, RC(self.cov, rp.x) | ... | ... |
-
Please register or login to post a comment