-
Notifications
You must be signed in to change notification settings - Fork 0
/
bayesian_regression.py
134 lines (114 loc) · 4.14 KB
/
bayesian_regression.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- coding: utf-8 -*-
import numpy as np
import bigfloat as bg
from numpy.linalg import norm
from sklearn import linear_model
from sklearn.cluster import KMeans
def generate_timeseries(prices, n):
m = len(prices) - n
ts = np.empty((m, n + 1))
for i in range(m):
ts[i, :n] = prices[i:i + n]
ts[i, n] = prices[i + n] - prices[i + n - 1]
return ts
def find_cluster_centers(timeseries, k):
k_means = KMeans(n_clusters=k)
k_means.fit(timeseries)
return k_means.cluster_centers_
def choose_effective_centers(centers, n):
return centers[np.argsort(np.ptp(centers, axis=1))[-n:]]
def predict_dpi(x, s):
num = 0
den = 0
for i in range(len(s)):
y_i = s[i, len(x)]
x_i = s[i, :len(x)]
exp = bg.exp(-0.25 * norm(x - x_i) ** 2)
num += y_i * exp
den += exp
return num / den
def linear_regression_vars(prices, v_bid, v_ask, s1, s2, s3):
X = np.empty((len(prices) - 721, 4))
Y = np.empty(len(prices) - 721)
for i in range(720, len(prices) - 1):
dp = prices[i + 1] - prices[i]
dp1 = predict_dpi(prices[i - 180:i], s1)
dp2 = predict_dpi(prices[i - 360:i], s2)
dp3 = predict_dpi(prices[i - 720:i], s3)
r = (v_bid[i] - v_ask[i]) / (v_bid[i] + v_ask[i])
X[i - 720, :] = [dp1, dp2, dp3, r]
Y[i - 720] = dp
return X, Y
def find_parameters_w(X, Y):
clf = linear_model.LinearRegression()
clf.fit(X, Y)
w0 = clf.intercept_
w1, w2, w3, w4 = clf.coef_
return w0, w1, w2, w3, w4
def predict_dps(prices, v_bid, v_ask, s1, s2, s3, w):
dps = []
w0, w1, w2, w3, w4 = w
for i in range(720, len(prices) - 1):
dp1 = predict_dpi(prices[i - 180:i], s1)
dp2 = predict_dpi(prices[i - 360:i], s2)
dp3 = predict_dpi(prices[i - 720:i], s3)
r = (v_bid[i] - v_ask[i]) / (v_bid[i] + v_ask[i])
dp = w0 + w1 * dp1 + w2 * dp2 + w3 * dp3 + w4 * r
dps.append(float(dp))
return dps
def evaluate_performanceSNYTH(prices, dps, t, step):
"""Use the third time period to evaluate the performance of the algorithm.
Args:
prices: A numpy array of floats representing prices over the third time
period.
dps: A numpy array of floats generated by predict_dps().
t: A number representing a threshold.
step: An integer representing time steps (when we make trading decisions).
Returns:
A number representing the bank balance.
"""
bank_balance = 0
position = 0
for i in range(720, len(prices) - 1, step):
# long position - BUY
if dps[i - 720] > t and position <= 0:
position += 1
bank_balance -= prices[i]
# short position - SELL
if dps[i - 720] < -t and position >= 0:
position -= 1
bank_balance += prices[i]
# sell what you bought
if position == 1:
bank_balance += prices[len(prices) - 1]
# pay back what you borrowed
if position == -1:
bank_balance -= prices[len(prices) - 1]
return bank_balance
def live_trade(prices, v_bid, v_ask, s1, s2, s3, w, t, step):
dps = []
w0, w1, w2, w3, w4 = w
dp1 = predict_dpi(prices[(len(prices) - 1) - 180:(len(prices) - 1)], s1)
dp2 = predict_dpi(prices[(len(prices) - 1) - 360:(len(prices) - 1)], s2)
dp3 = predict_dpi(prices[(len(prices) - 1) - 720:(len(prices) - 1)], s3)
r = (v_bid[len(prices) - 1] - v_ask[len(prices) - 1]) / (v_bid[len(prices) - 1] + v_ask[len(prices) - 1])
dp = w0 + w1 * dp1 + w2 * dp2 + w3 * dp3 + w4 * r
#bank_balance = 0
#position = 0
#for i in range(720, len(prices) - 1, step):
# long position - BUY
# if dps[i - 720] > t and position <= 0:
# position += 1
# bank_balance -= prices[i]
# short position - SELL
# if dps[i - 720] < -t and position >= 0:
# position -= 1
# bank_balance += prices[i]
# sell what you bought
#if position == 1:
# bank_balance += prices[len(prices) - 1]
# pay back what you borrowed
#if position == -1:
# bank_balance -= prices[len(prices) - 1]
#return bank_balance
return dp