-
[금융경제] 유가증권 - 수익률 계산__Data Analysis/교육 2021. 6. 8. 21:23
-
-
-
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime, timedelta from matplotlib import font_manager, rc font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name() rc('font', family=font_name) plt.rcParams['axes.unicode_minus'] = False import warnings warnings.filterwarnings(action='ignore') from pandas_datareader import data as pdr import FinanceDataReader as fdr import yfinance as yf from pykrx import stock
함수 정의¶
- 차트
# 강사님 차트 함수 def myplot(df, nrows=5, kind='line', title='제목', labels=False): # if nrows > 0: # print(df.head(nrows)) # else: # print(df.tail(nrows)) if labels: cols = df.columns for i, col in enumerate(cols): df[col].plot(label=labels[i], kind=kind) else : df.plot(kind=kind) plt.title(title) plt.legend() plt.show()
# 강사님 차트 함수 def myplotmix(df1, df2, y1='ylabel-1', y2='ylabel-2', kind1='bar', kind2='line', title='제목', nrows1=5, nrows2=5, labels=False): ytl=['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] if nrows1 > 0: print(df1.head(nrows1)) elif nrows1 < 0: print(df1.tail(nrows1)) if nrows2 > 0: print(df2.head(nrows2)) else: print(df2.tail(nrows2)) fig, ax1 = plt.subplots(figsize=(12, 4)) ax2=ax1.twinx() if kind1 == 'line': df1.plot(kind=kind1, ax=ax2, marker='d',color='#e35f62') #color='y', df2.plot(kind=kind2, ax=ax1) #bar else: df1.plot(kind=kind1, ax=ax1,color='#bcbd22') df2.plot(kind=kind2, ax=ax2) #color='y', # df['date'] = df['date'].dt.strftime('%Y-%m-%d') # ax1.set_xticklabels(df['date']) ax1.yaxis.tick_right() ax2.yaxis.tick_left() ax1.set_ylabel(y1) #, color='red') ax2.set_ylabel(y2) #, color='red') ax1.legend(loc=1) ax2.legend(loc=2) plt.title(title) ax1.grid(False) plt.show()
- 종목코드 찾기
def codefind(name): krx = fdr.StockListing('KRX') search = list(krx['Name']) for i in range(len(krx)): if (search[i]==name): print(krx['Symbol'][i]) return
# 연간변동률 구하기 위해 2년치 데이터 가져오기 df_ss = fdr.DataReader('005930','2018-01-01', '2019-12-31') # y_finanace와 차이점 발견, yf는 '005930.KS'
df_ss.drop(pd.to_datetime('2018-01-02'),inplace=True)
데이터 확인¶
df_ss.info() df_ss
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 489 entries, 2018-01-03 to 2019-12-30 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Open 489 non-null int64 1 High 489 non-null int64 2 Low 489 non-null int64 3 Close 489 non-null int64 4 Volume 489 non-null int64 5 Change 489 non-null float64 dtypes: float64(1), int64(5) memory usage: 26.7 KB
Out>Open High Low Close Volume Change Date 2018-01-03 52540 52560 51420 51620 200270 0.011760 2018-01-04 52120 52180 50640 51080 233909 -0.010461 2018-01-05 51300 52120 51200 52120 189623 0.020360 2018-01-08 52400 52520 51500 52020 167673 -0.001919 2018-01-09 51460 51720 49980 50400 360272 -0.031142 ... ... ... ... ... ... ... 2019-12-23 56100 56400 55100 55500 9839252 -0.008929 2019-12-24 55600 55700 54800 55000 11868463 -0.009009 2019-12-26 54700 55400 54400 55400 9645034 0.007273 2019-12-27 55700 56900 55500 56500 12313056 0.019856 2019-12-30 56200 56600 55700 55800 8356767 -0.012389 489 rows × 6 columns
Out>0
- 주가 확인(종가)¶
plt.figure(figsize=(9, 6)) # plt.subplot(2, 1, 1) plt.title('Samsung') plt.plot(df_ss.index, df_ss['Close'], label='samsung') plt.grid() plt.legend() plt.show()
Out>- 종가를 원자료 상태로 차트 그렸다.
- 종가를 그대로 출력하면 지수가 달라 다른 상품과 비교하기 어렵다.
예) 애플 140(달러) - 삼성 78000(원) 차트에서 출력 시 애플주가는 마치 0인 것처럼 보일 것이다.
- FinanceDataReader로 데이터를 불러오면 변동률이 들어있다.
- 다른 방법으로는 변동률은 '종가'를 이용해 구할 수 있다.
전일종가는 종가를 shift한 값으로 얻을 수 있다.
shift(1) 의 파라미터 1은 하루(1일)을 의미한다.
변동률 공식 = (종가-전일종가)/전일종가 * 100# 변동률 계산방법 1 last_day = df_ss['Close'].shift(1) today = df_ss['Close'] df_ss['Var_daily_price']= today - last_day df_ss['Var_daily_ratio']= ((today- last_day)/last_day)*100 # 변동률 계산방법 2 df_ss['Var_daily_ratio2']= df_ss['Close'].pct_change(periods=1) * 100 df_ss.head()
Out>Open High Low Close Volume Change Var_daily_price Var_daily_ratio Var_daily_ratio2 Date 2018-01-03 52540 52560 51420 51620 200270 0.011760 NaN NaN NaN 2018-01-04 52120 52180 50640 51080 233909 -0.010461 -540.0 -1.046106 -1.046106 2018-01-05 51300 52120 51200 52120 189623 0.020360 1040.0 2.036022 2.036022 2018-01-08 52400 52520 51500 52020 167673 -0.001919 -100.0 -0.191865 -0.191865 2018-01-09 51460 51720 49980 50400 360272 -0.031142 -1620.0 -3.114187 -3.114187 plt.figure(figsize=(9, 6)) # plt.subplot(2, 1, 1) plt.title('Samsung') plt.plot(df_ss.index, df_ss['Var_daily_ratio'], label='samsung') plt.grid() plt.legend() plt.show()
Out>- 변동률 자체로 차트를 그리지도 않는다. -> 누적합을 구해 추이를 봐야한다.
한주의 변동을 보려면 각 일자의 변동값을 모두 더하기 때문 (-1 +2 +3 -5 +4 => 한주의 변동=3)주가 상승/하락 추이 확인¶
# 일간변동률 누적합 df_ss['Var_daily_ratio'].cumsum()[:5]
Out>Date 2018-01-03 NaN 2018-01-04 -1.046106 2018-01-05 0.989916 2018-01-08 0.798051 2018-01-09 -2.316136 Name: Var_daily_ratio, dtype: float64
plt.figure(figsize=(9, 6)) # plt.subplot(2, 1, 1) plt.title('Samsung Elec.') plt.plot(df_ss.index, df_ss['Var_daily_ratio'].cumsum(), label='samsung') plt.legend()
Out>def daily_ratio(day=1): df_ss['dayline_'+str(day)] = df_ss['Close'].rolling(day).mean() # day: 5 => 5일 평균선인지. # 몇개씩 묶어와. 5개씩 묶어와 => rolling
df_ss
Out>Open High Low Close Volume Change Var_daily_price Var_daily_ratio Var_daily_ratio2 Date 2018-01-03 52540 52560 51420 51620 200270 0.011760 NaN NaN NaN 2018-01-04 52120 52180 50640 51080 233909 -0.010461 -540.0 -1.046106 -1.046106 2018-01-05 51300 52120 51200 52120 189623 0.020360 1040.0 2.036022 2.036022 2018-01-08 52400 52520 51500 52020 167673 -0.001919 -100.0 -0.191865 -0.191865 2018-01-09 51460 51720 49980 50400 360272 -0.031142 -1620.0 -3.114187 -3.114187 ... ... ... ... ... ... ... ... ... ... 2019-12-23 56100 56400 55100 55500 9839252 -0.008929 -500.0 -0.892857 -0.892857 2019-12-24 55600 55700 54800 55000 11868463 -0.009009 -500.0 -0.900901 -0.900901 2019-12-26 54700 55400 54400 55400 9645034 0.007273 400.0 0.727273 0.727273 2019-12-27 55700 56900 55500 56500 12313056 0.019856 1100.0 1.985560 1.985560 2019-12-30 56200 56600 55700 55800 8356767 -0.012389 -700.0 -1.238938 -1.238938 489 rows × 9 columns
n_list = [3,5,10] for n in n_list: daily_ratio(n)
# myplot(df_ss[f'dayline_{5}']) # 5일 평균선 # myplot(df_ss[['Close','dayline_5','dayline_10']],title='이동평균선', labels=['종가','5일평균선','10일평균선']) # 100건만 가져오기 myplot(df_ss.iloc[:100][['Close','dayline_5','dayline_10']],title='이동평균선', labels=['종가','5일평균선','10일평균선'])
# 이평선은 변동성이 완화된 것처럼 보인다.
이동변동가(지수)¶
def price_change(day=1): # 변동지수 / 가격변동 df_ss[f'chg_{day}']= df_ss['Close'].pct_change(periods=day) * 100
n=3 # 3일치 (지금 기준, 이틀 전의 값 불러오기) price_change(n)
df_ss.head()
Out>Open High Low Close Volume Change Var_daily_price Var_daily_ratio Var_daily_ratio2 dayline_3 dayline_5 dayline_10 chg_3 Date 2018-01-03 52540 52560 51420 51620 200270 0.011760 NaN NaN NaN NaN NaN NaN NaN 2018-01-04 52120 52180 50640 51080 233909 -0.010461 -540.0 -1.046106 -1.046106 NaN NaN NaN NaN 2018-01-05 51300 52120 51200 52120 189623 0.020360 1040.0 2.036022 2.036022 51606.666667 NaN NaN NaN 2018-01-08 52400 52520 51500 52020 167673 -0.001919 -100.0 -0.191865 -0.191865 51740.000000 NaN NaN 0.774893 2018-01-09 51460 51720 49980 50400 360272 -0.031142 -1620.0 -3.114187 -3.114187 51513.333333 51448.0 NaN -1.331245 수익률 구하기¶
- 가격 변동을 보고, 오늘 기준으로 N일과 비교해서 증감 금액 구하기
보유기간수익률¶
- 투자자산을 보유한 기간동안 몇 %의 수익률을 올렸는지를 측정하는 것으로 단순한 성과 비교용으로 사용
- 보유기간수익률(%) = [{기말의 투자자산(매도가) / 기초의 투자자산(매수가)} -1 ] * 100
df_ss.index.max(), df_ss.index.min()
Out>(Timestamp('2019-12-30 00:00:00'), Timestamp('2018-01-03 00:00:00'))
# # 보유기간수익률 1년 계산하기 # from datetime import datetime, timedelta # start = pd.to_datetime('2018-01-02') # 1년: 252일로 가정 오늘날짜는 어떻게 구하는지 # today = start + timedelta(days=364)
# 강사님 코드 수정(강사님 노트북 확인 필요, 결과값이 다름 - 시작날짜가 다름) start_price = int(df_ss.loc[df_ss.index.min(),'Close']) today_price = int(df_ss.iloc[252:253]['Close']) # 강사님은 252:253인데 다른 이유? print('기초 매수가',start_price) print('기말 매도가',today_price) 보유기간수익률 = (today_price/start_price-1)*100 print(보유기간수익률)
기초 매수가 51620 기말 매도가 41100 -20.379697791553664
# 블로그 예시로 보유기간 수익률 계산 기초투자금 = 5000 #3년전 연간배당금 = [250,300,400] # 1년차,2년차,3년차 기말투자금 = 5500 배당수익금 = np.sum(연간배당금) 보유기간수익률 = (배당수익금 + (기말투자금-기초투자금)) / 기초투자금 보유기간수익률 # 0.29 = 29%
Out>0.29
기대수익률¶
- 기대수익률 = 호황 수익률 + 보통 수익률 + 불황 * 수익률
# parameter 호황 30% 보통 40% 불황 30% / 예상주가 12000 10800 9600 / 수익률 20% 8% -4% # 두 리스트 요소 연산하기 zip(리스트1,리스트2) 경기상황 = [30/100, 40/100, 30/100] 수익률 = [0.2,0.08,-0.04] 기대수익률 = np.sum([i * j for i, j in zip(경기상황, 수익률)]) print(기대수익률)
0.08
# # 또는 for문 # 기대수익률 = 0 # for i in range(0,len(prices)): # 기대수익률 = 기대수익률 + 경기상황[i] * 수익률[i] # 기대수익률
# 또는 np.array np.dot ( 강사님 코드 보기편하게 수정 : 강사님 결과와 동일함. 근데 왜 0.33333? ) price = np.array([12000, 10800, 9600]) eco_rate = np.array([30/100 , 40/100 , 30/100]) price_sum = np.sum(price) price_weight = np.array(price/price_sum) # eco_rate = eco_rate.reshape(-1,1) 기대수익률 = np.dot(price_weight, eco_rate) 기대수익률
Out>0.3333333333333333
가중평균수익률¶
- 개별 자산들을 하나로 묶은 전체 포트폴리오(주식, 채권, 부동산 등)의 수익률
- 각 자산별 기대수익률의 총 합
# 각 자산 기대수익률
<예시>
투자대상 = [주식펀드,채권펀드,부동산투자신탁]
기초투자금 = [4000,4000,2000,10000]
기말투자금액 = [5000,4200,2200,11400]
연간수익률 = (기말/기초-1)*100 = [25%,5%,10%,-]
가중수익률 = 기초투자금액 * 연간수익률
정리하면
* 연간수익률 = ((기말/기초) -1) * 100
* 가중수익률 = 기초 * 연간수익률 = (기말 - 기초) * 100기초투자금 = [4000,4000,2000,10000] 기말투자금 = [5000,4200,2200,11400] 연말수익률 = [(j/i-1)*100 for i,j in zip(기초투자금,기말투자금)] 가중수익률 = [(j-i)*100 for i,j in zip(기초투자금,기말투자금)] 가중수익률
Out>[100000, 20000, 20000, 140000]
연말수익률
Out>[25.0, 5.000000000000004, 10.000000000000009, 13.99999999999999]
연말수익률 = [0.25, 0.05, 0.1, 0] 가중수익률 = [i*j/100 for i,j in zip(기초투자금,연말수익률)] 가중수익률
Out>[10.0, 2.0, 2.0, 0.0]
변동계수¶
변동계수 = df_ss.loc['2018-01-03':,'Close'].std() / df_ss.loc['2018-01-03':,'Close'].mean() 변동계수
Out>0.07742367927506001
df_ss.head()
Out>Open High Low Close Volume Change Var_daily_price Var_daily_ratio Var_daily_ratio2 dayline_3 dayline_5 dayline_10 chg_3 Date 2018-01-03 52540 52560 51420 51620 200270 0.011760 NaN NaN NaN NaN NaN NaN NaN 2018-01-04 52120 52180 50640 51080 233909 -0.010461 -540.0 -1.046106 -1.046106 NaN NaN NaN NaN 2018-01-05 51300 52120 51200 52120 189623 0.020360 1040.0 2.036022 2.036022 51606.666667 NaN NaN NaN 2018-01-08 52400 52520 51500 52020 167673 -0.001919 -100.0 -0.191865 -0.191865 51740.000000 NaN NaN 0.774893 2018-01-09 51460 51720 49980 50400 360272 -0.031142 -1620.0 -3.114187 -3.114187 51513.333333 51448.0 NaN -1.331245 결측치 확인 및 제거¶
df_ss.isna().sum()
>Open 0 High 0 Low 0 Close 0 Volume 0 Change 0 Var_daily_price 1 Var_daily_ratio 1 Var_daily_ratio2 1 dayline_3 2 dayline_5 4 dayline_10 9 chg_3 3 dtype: int64
- 불필요한 컬럼 삭제
df_ss.drop(['Volume','Change','dayline_10','Var_daily_ratio2'], axis=1, inplace=True)
- 결측치 제거
df_ss.dropna(axis=0,inplace=True)
학습 전, 타겟 데이터(close) 분리¶
y = df_ss['Close'] X = df_ss.drop('Close',axis=1)
X
Out>Open High Low Var_daily_price Var_daily_ratio dayline_3 dayline_5 chg_3 Date 2018-01-09 51460 51720 49980 -1620.0 -3.114187 51513.333333 51448.0 -1.331245 2018-01-10 50500 50520 48640 -1560.0 -3.095238 50420.000000 50892.0 -6.293170 2018-01-11 48200 49260 48020 -600.0 -1.228501 49160.000000 50324.0 -7.266436 2018-01-12 48240 48480 46760 -40.0 -0.082919 48426.666667 49540.0 -4.365079 2018-01-15 48800 48980 47920 340.0 0.705394 48326.666667 48844.0 -0.614251 ... ... ... ... ... ... ... ... ... 2019-12-23 56100 56400 55100 -500.0 -0.892857 55833.333333 56100.0 -1.420959 2019-12-24 55600 55700 54800 -500.0 -0.900901 55500.000000 55760.0 -1.785714 2019-12-26 54700 55400 54400 400.0 0.727273 55300.000000 55580.0 -1.071429 2019-12-27 55700 56900 55500 1100.0 1.985560 55633.333333 55680.0 1.801802 2019-12-30 56200 56600 55700 -700.0 -1.238938 55900.000000 55640.0 1.454545 485 rows × 8 columns
데이터 스케일링(Scaling)¶
- MinMaxScaler 사용
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # X normalizing X_scaled = scaler.fit_transform(X)
# y normalizing y.shape # 1차원 y= y.values.reshape(-1,1) # 2차원 y_scaled = scaler.fit_transform(y)
학습/테스트 데이터 분리¶
- 시계열 데이터이므로 데이터를 shuffle하면 안된다.
- 아래 주석처리한 코드는 실수로 random_state를 설정했고, 데이터가 shuffle되서 예측 결과가 좋지 못했다.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2,shuffle=False) # X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=336)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
>(388, 8) (97, 8) (388, 1) (97, 1)
Rolling ¶
- window size = 5 (5일 단위)
def my_dataset_window(xdata, ydata, window_size=5): window_size = 5 xlist= [] ylist = [] # for i in range(train_scaler.shape[0] - window_size) : #range(377) for i in range(window_size, xdata.shape[0]) : #5,377 xvar = xdata[i-window_size: i] #[0:5] 0,1,2,3,4 yvar = ydata[i] #Close xlist.append(xvar) ylist.append(yvar) xlist = np.array(xlist) ylist = np.array(ylist) return xlist, ylist X_train, y_train = my_dataset_window(X_train, y_train) X_test, y_test = my_dataset_window(X_test, y_test)
print(X_train.shape) print(y_train.shape)
>
(383, 5, 8) (383, 1)
모델 생성 ¶
- LSTM
# 라이브러리 불러오기 from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense, LSTM, Dropout model = Sequential() model.add(LSTM(units=50, activation="relu", return_sequences=True, input_shape = (X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.2)) model.add(LSTM(units=60, activation="relu", return_sequences=True)) model.add(Dropout(0.3)) model.add(LSTM(units=80, activation="relu", return_sequences=True)) model.add(Dropout(0.4)) model.add(LSTM(units=120, activation="relu")) model.add(Dropout(0.5)) model.add(Dense(units = 1)) # MODEL SUMMARY 출력 model.summary() model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mse'])
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm (LSTM) (None, 5, 50) 11800 _________________________________________________________________ dropout (Dropout) (None, 5, 50) 0 _________________________________________________________________ lstm_1 (LSTM) (None, 5, 60) 26640 _________________________________________________________________ dropout_1 (Dropout) (None, 5, 60) 0 _________________________________________________________________ lstm_2 (LSTM) (None, 5, 80) 45120 _________________________________________________________________ dropout_2 (Dropout) (None, 5, 80) 0 _________________________________________________________________ lstm_3 (LSTM) (None, 120) 96480 _________________________________________________________________ dropout_3 (Dropout) (None, 120) 0 _________________________________________________________________ dense (Dense) (None, 1) 121 ================================================================= Total params: 180,161 Trainable params: 180,161 Non-trainable params: 0 _________________________________________________________________
학습 ¶
- EarlyStopping 설정
from keras.callbacks import EarlyStopping stop = EarlyStopping(monitor='val_loss', patience=10) history = model.fit(X_train, y_train, epochs=200, batch_size=16, validation_split=0.1, callbacks=[stop])
>Epoch 1/200 22/22 [==============================] - 13s 149ms/step - loss: 0.1681 - mse: 0.1681 - val_loss: 0.0159 - val_mse: 0.0159 Epoch 2/200 22/22 [==============================] - 0s 18ms/step - loss: 0.0320 - mse: 0.0320 - val_loss: 0.0034 - val_mse: 0.0034 Epoch 3/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0279 - mse: 0.0279 - val_loss: 0.0029 - val_mse: 0.0029 Epoch 4/200 22/22 [==============================] - 1s 26ms/step - loss: 0.0148 - mse: 0.0148 - val_loss: 0.0091 - val_mse: 0.0091 Epoch 5/200 22/22 [==============================] - 1s 23ms/step - loss: 0.0156 - mse: 0.0156 - val_loss: 0.0026 - val_mse: 0.0026 Epoch 6/200 22/22 [==============================] - 0s 20ms/step - loss: 0.0113 - mse: 0.0113 - val_loss: 0.0028 - val_mse: 0.0028 Epoch 7/200 22/22 [==============================] - 1s 24ms/step - loss: 0.0136 - mse: 0.0136 - val_loss: 0.0027 - val_mse: 0.0027 Epoch 8/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0128 - mse: 0.0128 - val_loss: 0.0048 - val_mse: 0.0048 Epoch 9/200 22/22 [==============================] - ETA: 0s - loss: 0.0144 - mse: 0.014 - 0s 22ms/step - loss: 0.0141 - mse: 0.0141 - val_loss: 0.0048 - val_mse: 0.0048 Epoch 10/200 22/22 [==============================] - 0s 18ms/step - loss: 0.0108 - mse: 0.0108 - val_loss: 0.0027 - val_mse: 0.0027 Epoch 11/200 22/22 [==============================] - 1s 27ms/step - loss: 0.0116 - mse: 0.0116 - val_loss: 0.0044 - val_mse: 0.0044 Epoch 12/200 22/22 [==============================] - 1s 26ms/step - loss: 0.0111 - mse: 0.0111 - val_loss: 0.0026 - val_mse: 0.0026 Epoch 13/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0118 - mse: 0.0118 - val_loss: 0.0033 - val_mse: 0.0033 Epoch 14/200 22/22 [==============================] - 0s 20ms/step - loss: 0.0122 - mse: 0.0122 - val_loss: 0.0026 - val_mse: 0.0026 Epoch 15/200 22/22 [==============================] - 1s 27ms/step - loss: 0.0090 - mse: 0.0090 - val_loss: 0.0043 - val_mse: 0.0043 Epoch 16/200 22/22 [==============================] - 1s 27ms/step - loss: 0.0114 - mse: 0.0114 - val_loss: 0.0034 - val_mse: 0.0034 Epoch 17/200 22/22 [==============================] - 0s 21ms/step - loss: 0.0097 - mse: 0.0097 - val_loss: 0.0035 - val_mse: 0.0035 Epoch 18/200 22/22 [==============================] - 0s 23ms/step - loss: 0.0099 - mse: 0.0099 - val_loss: 0.0026 - val_mse: 0.0026 Epoch 19/200 22/22 [==============================] - 1s 28ms/step - loss: 0.0086 - mse: 0.0086 - val_loss: 0.0035 - val_mse: 0.0035 Epoch 20/200 22/22 [==============================] - 1s 32ms/step - loss: 0.0081 - mse: 0.0081 - val_loss: 0.0028 - val_mse: 0.0028 Epoch 21/200 22/22 [==============================] - 1s 27ms/step - loss: 0.0087 - mse: 0.0087 - val_loss: 0.0027 - val_mse: 0.0027 Epoch 22/200 22/22 [==============================] - 1s 38ms/step - loss: 0.0095 - mse: 0.0095 - val_loss: 0.0022 - val_mse: 0.0022 Epoch 23/200 22/22 [==============================] - 1s 39ms/step - loss: 0.0080 - mse: 0.0080 - val_loss: 0.0022 - val_mse: 0.0022 Epoch 24/200 22/22 [==============================] - 1s 33ms/step - loss: 0.0085 - mse: 0.0085 - val_loss: 0.0030 - val_mse: 0.0030 Epoch 25/200 22/22 [==============================] - 1s 32ms/step - loss: 0.0070 - mse: 0.0070 - val_loss: 0.0023 - val_mse: 0.0023 Epoch 26/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0075 - mse: 0.0075 - val_loss: 0.0039 - val_mse: 0.0039 Epoch 27/200 22/22 [==============================] - 1s 36ms/step - loss: 0.0094 - mse: 0.0094 - val_loss: 0.0019 - val_mse: 0.0019 Epoch 28/200 22/22 [==============================] - 1s 37ms/step - loss: 0.0077 - mse: 0.0077 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 29/200 22/22 [==============================] - 1s 30ms/step - loss: 0.0064 - mse: 0.0064 - val_loss: 0.0031 - val_mse: 0.0031 Epoch 30/200 22/22 [==============================] - 1s 30ms/step - loss: 0.0089 - mse: 0.0089 - val_loss: 0.0031 - val_mse: 0.0031 Epoch 31/200 22/22 [==============================] - 1s 40ms/step - loss: 0.0081 - mse: 0.0081 - val_loss: 0.0017 - val_mse: 0.0017 Epoch 32/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0078 - mse: 0.0078 - val_loss: 0.0016 - val_mse: 0.0016 Epoch 33/200 22/22 [==============================] - 1s 44ms/step - loss: 0.0077 - mse: 0.0077 - val_loss: 0.0024 - val_mse: 0.0024 Epoch 34/200 22/22 [==============================] - 1s 44ms/step - loss: 0.0075 - mse: 0.0075 - val_loss: 0.0029 - val_mse: 0.0029 Epoch 35/200 22/22 [==============================] - 1s 29ms/step - loss: 0.0072 - mse: 0.0072 - val_loss: 0.0016 - val_mse: 0.0016 Epoch 36/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0079 - mse: 0.0079 - val_loss: 0.0021 - val_mse: 0.0021 Epoch 37/200 22/22 [==============================] - 1s 33ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 38/200 22/22 [==============================] - 1s 41ms/step - loss: 0.0072 - mse: 0.0072 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 39/200 22/22 [==============================] - 1s 39ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0020 - val_mse: 0.0020 Epoch 40/200 22/22 [==============================] - 1s 44ms/step - loss: 0.0059 - mse: 0.0059 - val_loss: 0.0015 - val_mse: 0.0015 Epoch 41/200 22/22 [==============================] - 1s 34ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0027 - val_mse: 0.0027 Epoch 42/200 22/22 [==============================] - 1s 38ms/step - loss: 0.0076 - mse: 0.0076 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 43/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0062 - mse: 0.0062 - val_loss: 0.0019 - val_mse: 0.0019 Epoch 44/200 22/22 [==============================] - 1s 42ms/step - loss: 0.0061 - mse: 0.0061 - val_loss: 0.0015 - val_mse: 0.0015 Epoch 45/200 22/22 [==============================] - 1s 36ms/step - loss: 0.0054 - mse: 0.0054 - val_loss: 0.0020 - val_mse: 0.0020 Epoch 46/200 22/22 [==============================] - 1s 41ms/step - loss: 0.0070 - mse: 0.0070 - val_loss: 0.0017 - val_mse: 0.0017 Epoch 47/200 22/22 [==============================] - 1s 37ms/step - loss: 0.0058 - mse: 0.0058 - val_loss: 0.0014 - val_mse: 0.0014 Epoch 48/200 22/22 [==============================] - 1s 40ms/step - loss: 0.0060 - mse: 0.0060 - val_loss: 0.0013 - val_mse: 0.0013 Epoch 49/200 22/22 [==============================] - 1s 30ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0014 - val_mse: 0.0014 Epoch 50/200 22/22 [==============================] - 1s 38ms/step - loss: 0.0067 - mse: 0.0067 - val_loss: 0.0019 - val_mse: 0.0019 Epoch 51/200 22/22 [==============================] - 1s 32ms/step - loss: 0.0064 - mse: 0.0064 - val_loss: 0.0015 - val_mse: 0.0015 Epoch 52/200 22/22 [==============================] - 1s 24ms/step - loss: 0.0057 - mse: 0.0057 - val_loss: 0.0024 - val_mse: 0.0024 Epoch 53/200 22/22 [==============================] - 1s 32ms/step - loss: 0.0048 - mse: 0.0048 - val_loss: 0.0017 - val_mse: 0.0017 Epoch 54/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0020 - val_mse: 0.0020 Epoch 55/200 22/22 [==============================] - 1s 28ms/step - loss: 0.0061 - mse: 0.0061 - val_loss: 0.0017 - val_mse: 0.0017 Epoch 56/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0046 - mse: 0.0046 - val_loss: 0.0020 - val_mse: 0.0020 Epoch 57/200 22/22 [==============================] - 1s 29ms/step - loss: 0.0058 - mse: 0.0058 - val_loss: 0.0025 - val_mse: 0.0025 Epoch 58/200 22/22 [==============================] - 1s 29ms/step - loss: 0.0056 - mse: 0.0056 - val_loss: 0.0013 - val_mse: 0.0013 Epoch 59/200 22/22 [==============================] - 1s 32ms/step - loss: 0.0045 - mse: 0.0045 - val_loss: 0.0035 - val_mse: 0.0035 Epoch 60/200 22/22 [==============================] - 1s 30ms/step - loss: 0.0055 - mse: 0.0055 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 61/200 22/22 [==============================] - 0s 20ms/step - loss: 0.0065 - mse: 0.0065 - val_loss: 0.0017 - val_mse: 0.0017 Epoch 62/200 22/22 [==============================] - 1s 29ms/step - loss: 0.0051 - mse: 0.0051 - val_loss: 0.0013 - val_mse: 0.0013 Epoch 63/200 22/22 [==============================] - 1s 35ms/step - loss: 0.0067 - mse: 0.0067 - val_loss: 0.0052 - val_mse: 0.0052 Epoch 64/200 22/22 [==============================] - 0s 21ms/step - loss: 0.0064 - mse: 0.0064 - val_loss: 0.0027 - val_mse: 0.0027 Epoch 65/200 22/22 [==============================] - 1s 23ms/step - loss: 0.0050 - mse: 0.0050 - val_loss: 0.0012 - val_mse: 0.0012 Epoch 66/200 22/22 [==============================] - 1s 28ms/step - loss: 0.0055 - mse: 0.0055 - val_loss: 0.0015 - val_mse: 0.0015 Epoch 67/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0053 - mse: 0.0053 - val_loss: 0.0014 - val_mse: 0.0014 Epoch 68/200 22/22 [==============================] - 0s 20ms/step - loss: 0.0046 - mse: 0.0046 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 69/200 22/22 [==============================] - 1s 27ms/step - loss: 0.0045 - mse: 0.0045 - val_loss: 0.0011 - val_mse: 0.0011 Epoch 70/200 22/22 [==============================] - 1s 31ms/step - loss: 0.0054 - mse: 0.0054 - val_loss: 0.0015 - val_mse: 0.0015 Epoch 71/200 22/22 [==============================] - 0s 23ms/step - loss: 0.0066 - mse: 0.0066 - val_loss: 0.0060 - val_mse: 0.0060 Epoch 72/200 22/22 [==============================] - 0s 18ms/step - loss: 0.0051 - mse: 0.0051 - val_loss: 0.0018 - val_mse: 0.0018 Epoch 73/200 22/22 [==============================] - 1s 24ms/step - loss: 0.0060 - mse: 0.0060 - val_loss: 0.0014 - val_mse: 0.0014 Epoch 74/200 22/22 [==============================] - 1s 26ms/step - loss: 0.0049 - mse: 0.0049 - val_loss: 0.0025 - val_mse: 0.0025 Epoch 75/200 22/22 [==============================] - 0s 21ms/step - loss: 0.0040 - mse: 0.0040 - val_loss: 0.0014 - val_mse: 0.0014 Epoch 76/200 22/22 [==============================] - 0s 21ms/step - loss: 0.0043 - mse: 0.0043 - val_loss: 0.0022 - val_mse: 0.0022 Epoch 77/200 22/22 [==============================] - 1s 25ms/step - loss: 0.0041 - mse: 0.0041 - val_loss: 0.0012 - val_mse: 0.0012 Epoch 78/200 22/22 [==============================] - 1s 24ms/step - loss: 0.0056 - mse: 0.0056 - val_loss: 0.0020 - val_mse: 0.0020 Epoch 79/200 22/22 [==============================] - 0s 19ms/step - loss: 0.0045 - mse: 0.0045 - val_loss: 0.0017 - val_mse: 0.0017
학습 결과 확인 ¶
- loss 확인
plt.plot(history.history['loss'], label='loss') plt.plot(history.history['val_loss'], label= 'val_loss')
Out>예측 ¶
pred = model.predict(X_test)
plt.plot(pred, label='pred') plt.plot(y_test, label= 'y_test')
Out>- 얼추 비슷하게 예측했으나, 80번째 이후로는 격차가 크게 벌어짐을 볼 수 있다.
- 지수화 되어 있어 실제 차이값을 알 수 없으나, loss가 클 것으로 추측된다.
- 모델 수정이 필요하다.
(06.11 셔플했을 때 나온 예측 결과 추가)
728x90'__Data Analysis > 교육' 카테고리의 다른 글
[금융경제] 볼린저밴드(Bollinger Bands) 투자 기법 (0) 2021.06.08 [금융경제] 파생상품 - 옵션(Option) (0) 2021.05.31 [금융경제] 파생상품 - 선물(Futures) (0) 2021.05.29 [금융경제] 실습2 - 환율 (0) 2021.05.26 [금융경제] 주가데이터 지수화(Indexing), 변동률 구하기, 주가데이터 불러오기 (0) 2021.05.18