Skip to content

Instantly share code, notes, and snippets.

@kirarpit
Created December 3, 2018 07:47
Show Gist options
  • Save kirarpit/6921f1fa8a86258349b89448e09ddebd to your computer and use it in GitHub Desktop.
Save kirarpit/6921f1fa8a86258349b89448e09ddebd to your computer and use it in GitHub Desktop.
Online gradient descent algorithm for portfolio management
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