Project : QQQ Price Predict
Machine Learning2021. 10. 5. 19:50
반응형
다중 선형 회귀를 사용해 QQQ의 가격을 예측해보도록 하겠다.
Feature Data는 RSI, BTC, 10년 채권 수익률, 거래량, Vix 지수를 사용하였고, 데이터는 인베스팅 닷컴에서 구했다.
아래의 데이터를 정제 후 사용하였다.
결론부터 미리 말하자면, predict의 결과는 매우 무의미한 예측이다.
사용한 특성은 qqq와 동시에 움직이기 때문에, 특성으로 사용하기에는 부족하다,
다만, 시장에 존재하는 지표들을 적절히 활용하면, 비슷하게 예측이 가능할지도 모르겠다.
예측의 결과와 실제의 패턴이 비슷한 듯 보이지만,
실제로는 예측의 결과가 실제를 흉내 내는 것에 불과하다고 생각한다.
이번 프로젝트를 하며 퀀트전략들을 제대로 공부해보고, 직접 알고리즘 매매를 시도해보고 싶어졌다.
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [3]:
import pandas as pd
import numpy as np
#QQQ 데이터(price, rsi, 거래량)와 btc, 10년물, vix지수를 불러온다.
dt = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/project/csv/qqq.csv', encoding= 'unicode_escape')
btc = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/project/csv/btc.csv', encoding= 'unicode_escape')
ten = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/project/csv/ten_year.csv', encoding= 'unicode_escape')
vix = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/project/csv/vix.csv', encoding= 'unicode_escape')
In [4]:
#불러온 데이터들을 tmp 하나로 묶는다.
tmp = pd.merge(dt,btc, on = 'Date', how = "left")
tmp = pd.merge(tmp,ten, on = 'Date', how = "left")
tmp = pd.merge(tmp,vix, on = 'Date', how = "left")
# x0 절편 값 추가
tmp['intercept'] = 1
#key 순서 변경
tmp = tmp[['Date' , 'intercept' , 'vol' , 'rsi' , 'btc_price' , 'rate' , 'vix' , 'price']]
#tmp data를 csv 파일로 저장
tmp.to_csv('/content/drive/MyDrive/Colab Notebooks/project/data.csv')
#tmp 요소 수와 특징 수를 구한다.
m,n = tmp.shape
# 특징 별 평균을 구한다.
mean = tmp.mean(axis = 0)
print(mean)
intercept 1.000000e+00
vol 4.033209e+07
rsi 5.812302e+01
btc_price 3.717503e+04
rate 1.258615e+00
vix 2.130718e+01
price 3.285765e+02
dtype: float64
In [5]:
# Feature Scaling 과정
def feature_scaling(X ,n):
mean = X.mean(axis = 0)
std = X.std(axis = 0)
#intercept 특징은 Feature Scaling 과정이 필요 없기에 1부터 시작
for i in range(1,n-2):
#각 특징 별 평균과 표준편차를 구한다.
m = mean[i]
s = std[i]
#Feature Scaling
X.iloc[: ,i] = (X.iloc[: ,i] - m) / s
return X
X = feature_scaling(tmp.iloc[: ,1:n-1] ,n)
# Y의 type이 series 1차원 형태이므로 2차원 형식으로 변환한다.
Y = tmp['price'].values.reshape(m,1)
X.head()
Out[5]:
intercept | vol | rsi | btc_price | rate | vix | |
---|---|---|---|---|---|---|
0 | 1 | 0.950962 | -0.664661 | -1.783955 | -1.983057 | 1.050015 |
1 | 1 | -0.697593 | -0.773213 | -1.774005 | -2.006169 | 1.067218 |
2 | 1 | 0.475250 | -0.556110 | -1.778371 | -1.890609 | 1.088722 |
3 | 1 | 0.508832 | -0.121905 | -1.788853 | -1.913721 | 1.159686 |
4 | 1 | 1.846928 | -0.990315 | -1.792100 | -1.831178 | 1.359676 |
In [6]:
#Set theta
#theta를 1로 초기화
theta = np.ones((6,1))
In [7]:
#CostFunction
def cost_reg(X,Y,theta,ramda=0):
m,n = X.shape
J = (1 / (2 * m) * np.sum(X.dot(theta) - Y)**2) + sum(ramda*(theta[1:]**2))
# theta와 X를 내적함으로 각 요소의 예측값을 구하고, sum으로 모든 error값을 더한다.
return J
J = cost_reg(X,Y,theta,100)
J
Out[7]:
0 1.352110e+07
dtype: float64
In [9]:
#Gradient Descent
def grad_reg(alpha, epoch, X, Y, theta, lamda = 0):
#반복 수 별로 비용함수의 값을 저장
m,n = X.shape
J_history = np.zeros(epoch)
for i in range(epoch):
predict = X.dot(theta)
error = predict - Y
delta = (1 / m) * error.T.dot(X)
delta = delta.to_numpy()
#내적으로 동시에 특징 별 delta를 동시에 구한다.
temp = theta[0,:]
theta = theta*(1-alpha*lamda/m) - alpha * delta.T
#theta 0은 정규화 하지 않으므로, 따로 theta를 수정한다.
theta[0,0] = temp - alpha * delta[0,0]
J_history[i] = cost_reg(X,Y,theta,lamda)
return theta, J_history
#train data의 범위를 정함 (70%)
cut = int(m*0.7)
X_train = X.iloc[:cut ,:]
Y_train = Y[:cut]
X_test = X.iloc[cut: ,:]
Y_test = Y[cut:]
#경사하강의 파라미터를 정함
alpha = 0.03
epoch = 1000
theta = np.ones((6,1))
theta , J_history = grad_reg(alpha, epoch, X_train, Y_train, theta, lamda = 0.05)
theta
Out[9]:
array([[ 3.16919927e+02],
[-2.41404844e+00],
[ 7.61935372e+00],
[ 7.63880358e+00],
[ 8.71047009e+00],
[ 6.18842882e-02]])
In [10]:
import matplotlib.pyplot as plt
#비용함수가 줄어든 것을 확인 할 수 있다.
plt.plot(J_history, '-b', lw=2)
Out[10]:
[<matplotlib.lines.Line2D at 0x7fae83cce090>]
In [29]:
#비교 시각화
predict = X_test.dot(theta)
predict = predict.to_numpy()
plt.plot(Y_test, 'orange', lw=2,label = 'Test')
plt.plot(predict, 'blue', lw=2,label = 'Predict')
plt.title('QQQ Price Predict')
plt.xlabel('Timeflow')
plt.ylabel('Price')
plt.legend(loc=(1.0, 0.85))
plt.ylim([250, 450])
plt.show()
참고한 블로그 List
pandas data merge
add : x0 col
feature order
pandas key index 접근
반응형
'Machine Learning' 카테고리의 다른 글
[프로그래머를 위한 선형대수] Review (3~4) (79) | 2022.02.08 |
---|---|
지금까지 캐글을 시작하지 못햇던 이유 (34) | 2022.02.07 |
[프로그래머를 위한 선형대수] Review (2) (6) | 2022.02.05 |
[프로그래머를 위한 선형대수] Review (1) (34) | 2022.01.30 |
금융데이터와 머신러닝의 결합 실패 이유 - Qraft Technoledge (34) | 2022.01.08 |
댓글()