-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
65 lines (41 loc) · 2.37 KB
/
main.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
import math
import numpy as np
import pandas as pd
import pickle
import os
from portfolio_management.portfolio import Portfolio
from portfolio_management.portfolio_manager import PortfolioManager
from asset_classes.equities.equities_strategy import EquitiesStrategy
from asset_classes.fixed_income.fixed_income_strategy import FixedIncomeStrategy
from asset_classes.forex.forex_strategy import ForexStrategy
from trading.trader import Trader
from trading.broker import AlpacaAPI
trading = True
portfolio: Portfolio
portfolio_manager = PortfolioManager(assets=['equities'])
trader = Trader()
broker = AlpacaAPI('PKBHECRAUKBSKI23DYTW', 'LDWQZ3y8Goa27QWDFgla4TbbYgLNn2n7dtbNvQjO')
if os.path.exists('data/portfolio.pf'):
with open('data/portfolio.pf','rb') as pf:
portfolio = pickle.load(pf) # unpickle the Portfolio object stored in data/portfolio.pf
else:
portfolio = Portfolio(cash=1_000_000) # start off with 1000000 cash if no portfolio already exists
while trading:
# get portfolio manager to decide which assets to buy/sell and return instructions in dict format
# TODO: instruction format can be perhaps a target value of holdings of each asset (and maybe each risk category in each asset type)
# TODO; can include cash buffer to acocunt for slippage. instructions can adjust buffer if it gets too low/high
portfolio_targets:dict = portfolio_manager.evaluate(portfolio)
# get strategies to convert instructions to orders (to fulfil the increase/reduction in their respective assets as outlined by instructions)
orders = EquitiesStrategy(portfolio, broker).get_trades(portfolio_targets['equities']) + \
FixedIncomeStrategy(portfolio, broker).get_trades(portfolio_targets['fixed income']) + \
ForexStrategy(portfolio, broker).get_trades(portfolio_targets['forex'])
# get trader to execute orders (after cost optimisation) and return successful trades
# TODO: cost optimisation must ensure relative
filled_orders = trader.execute(orders)
# update portfolio with successful trades
portfolio.update(filled_orders) # add new positions or update existing positions with newly filled orders
# if some condition is True: halt trading and save current portfolio to a file
if False:
with open('data/portfolio.pf','wb') as pf:
pickle.dump(portfolio, pf)
trading=False