-
-
Save markusrenepae/cae604d4c12493a55966b47e1d8bc65b to your computer and use it in GitHub Desktop.
import pandas as pd | |
import numpy as np | |
import datetime as dt | |
import math | |
import warnings | |
warnings.filterwarnings("ignore") | |
prices = pd.read_csv("adjclose.csv", index_col="Date", parse_dates=True) | |
volumechanges = pd.read_csv("volume.csv", index_col="Date", parse_dates=True).pct_change()*100 | |
today = dt.date(2000, 1, 15) | |
simend = dt.date(2019, 12, 31) | |
tickers = [] | |
transactionid = 0 | |
money = 1000000 | |
portfolio = {} | |
activelog = [] | |
transactionlog = [] | |
def getprice(date, ticker): | |
global prices | |
return prices.loc[date][ticker] | |
def transaction(id, ticker, amount, price, type, info): | |
global transactionid | |
if type == "buy": | |
exp_date = today + dt.timedelta(days=14) | |
transactionid += 1 | |
else: | |
exp_date = today | |
if type == "sell": | |
data = {"id": id, "ticker": ticker, "amount": amount, "price": price, "date": today, "type": type, | |
"exp_date": exp_date, "info": info} | |
elif type == "buy": | |
data = {"id": transactionid, "ticker": ticker, "amount": amount, "price": price, "date": today, "type": type, | |
"exp_date": exp_date, "info": info} | |
activelog.append(data) | |
transactionlog.append(data) | |
def buy(interestlst, allocated_money): | |
global money, portfolio | |
for item in interestlst: | |
price = getprice(today, item) | |
if not np.isnan(price): | |
quantity = math.floor(allocated_money/price) | |
money -= quantity*price | |
portfolio[item] += quantity | |
transaction(0, item, quantity, price, "buy", "") | |
def sell(): | |
global money, portfolio, prices, today | |
itemstoremove = [] | |
for i in range(len(activelog)): | |
log = activelog[i] | |
if log["exp_date"] <= today and log["type"] == "buy": | |
tickprice = getprice(today, log["ticker"]) | |
if not np.isnan(tickprice): | |
money += log["amount"]*tickprice | |
portfolio[log["ticker"]] -= log["amount"] | |
transaction(log["id"], log["ticker"], log["amount"], tickprice, "sell", log["info"]) | |
itemstoremove.append(i) | |
else: | |
log["exp_date"] += dt.timedelta(days=1) | |
itemstoremove.reverse() | |
for elem in itemstoremove: | |
activelog.remove(activelog[elem]) | |
def simulation(): | |
global today, volumechanges, money | |
start_date = today - dt.timedelta(days=14) | |
series = volumechanges.loc[start_date:today].mean() | |
interestlst = series[series > 100].index.tolist() | |
sell() | |
if len(interestlst) > 0: | |
#moneyToAllocate = 500000/len(interestlst) | |
moneyToAllocate = currentvalue()/(2*len(interestlst)) | |
buy(interestlst, moneyToAllocate) | |
def getindices(): | |
global tickers | |
f = open("symbols.txt", "r") | |
for line in f: | |
tickers.append(line.strip()) | |
f.close() | |
def tradingday(): | |
global prices, today | |
return np.datetime64(today) in list(prices.index.values) | |
def currentvalue(): | |
global money, portfolio, today, prices | |
value = money | |
for ticker in tickers: | |
tickprice = getprice(today, ticker) | |
if not np.isnan(tickprice): | |
value += portfolio[ticker]*tickprice | |
return int(value*100)/100 | |
def main(): | |
global today | |
getindices() | |
for ticker in tickers: | |
portfolio[ticker] = 0 | |
while today < simend: | |
while not tradingday(): | |
today += dt.timedelta(days=1) | |
simulation() | |
currentpvalue = currentvalue() | |
print(currentpvalue, today) | |
today += dt.timedelta(days=7) | |
main() |
Hi,
how to get adjclose.csv and volume.csv? is there any place to download or should we scrap?
BTW, Mark discusses how to get the files, but here is a short version...
- download the symbols.txt file from his git hub.
- Run this code to generate the files...
import pandas_datareader as web
stocks=[]
f = open("symbols.txt","r")
for line in f:
stocks.append(line.strip())
f.close()
web.DataReader(stocks,"yahoo",start="2000-1-1",end="2019-12-31")["Adj Close"].to_csv("prices.csv")
web.DataReader(stocks,"yahoo",start="2000-1-1",end="2019-12-31")["Volume"].to_csv("volume.csv")
Hi. I tried to run the main () function but instead got this syntax.
line 124, in main
portfolio[ticker] = 0
TypeError: list indices must be integers or slices, not str
The main() function is written exactly the same, and getindices() is almost the same except for the fact that I assigned a specific file path in f = open('xxx/symbols.txt', r).
Anyone knows how to solve this?
Hi,
how to get adjclose.csv and volume.csv? is there any place to download or should we scrap?