Created
December 3, 2018 07:47
-
-
Save kirarpit/6921f1fa8a86258349b89448e09ddebd to your computer and use it in GitHub Desktop.
Online gradient descent algorithm for portfolio management
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import csv | |
import numpy as np | |
import matplotlib.pyplot as plt | |
def read_file(filename): | |
lines = [] | |
csvreader = csv.reader(open(filename)) | |
for line in csvreader: | |
lines.append(line) | |
lines.pop(0) | |
return np.array(lines) | |
data = read_file('data.csv') | |
data = data[:, 1:] | |
data = data.astype(np.float) | |
orig_data = np.copy(data) | |
prev_row = None | |
for idx, row in enumerate(data): | |
if prev_row is not None: | |
this_row = np.copy(row) | |
data[idx] = row/prev_row | |
prev_row = this_row | |
else: | |
prev_row = row | |
R = data[1:, :] | |
np.random.seed(0) | |
X = np.array([np.random.uniform(0, 1) for _ in range(R.shape[1])]) | |
X = X/X.sum() | |
learning_rate = 0.00005 | |
factors = [] | |
for _ in range(50): | |
for row in R: | |
factor = np.dot(row.T, X) | |
if len(factors) != 0: | |
factor *= factors[-1] | |
factors.append(factor) | |
#gradient descent | |
X = X + learning_rate * row | |
X = X - np.min(X) | |
X = X/np.sum(X) | |
factors.append(1) | |
plt.plot(factors) | |
print("Final %gain by the end of 1000th day is {}".format(factors[-2])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment