Browse Source

feat: an example

pull/14/head
QuentinN42 1 year ago
parent
commit
81cb8658d3
Signed by: number42 GPG Key ID: 2CD7D563712B3A50
  1. 9
      auto_trading/broker/backtest.py
  2. 3
      auto_trading/main.py
  3. 3
      auto_trading/predictor/mean_agg.py
  4. 11
      auto_trading/strat/all_in.py
  5. 24
      main.py

9
auto_trading/broker/backtest.py

@ -1,3 +1,4 @@
from os import curdir
import pandas as pd
from ..interfaces import Broker
@ -8,10 +9,10 @@ class Backtest(Broker):
Backtest Broker
"""
def __init__(self, f_name: str) -> None:
def __init__(self, f_name: str, **kwargs) -> None:
"""Read the csv file and store it into a dataframe"""
self.data = pd.read_csv(f_name)
self.curcor = -1
self.data = pd.read_csv(f_name, **kwargs)
self.curcor = 0
def __bool__(self):
return self.curcor < len(self.data)
@ -19,4 +20,4 @@ class Backtest(Broker):
def next(self):
"""Return the next row of the dataframe"""
self.curcor += 1
return self.data.iloc[:self.curcor]
return self.data.iloc[:self.curcor].copy()

3
auto_trading/main.py

@ -23,7 +23,8 @@ class Bot:
def run_once(self):
"""run the bot once"""
data = self.broker.next()
self.strategy.run(self.ptf, self.predictor.predict(data), data)
current_conversion_rate = data.iloc[-1].to_dict()
self.strategy.run(self.ptf, self.predictor.predict(data), current_conversion_rate)
def print_results(self):
"""print the results"""

3
auto_trading/predictor/mean_agg.py

@ -13,4 +13,5 @@ class MeanAggregator(Predictor):
def predict(self, data: pd.DataFrame) -> dict:
"""Predict from others predictors."""
return pd.DataFrame([cls.predict(data) for cls in self.predictors]).mean().to_dict()
preds = [cls.predict(data) for cls in self.predictors]
return pd.DataFrame(preds).mean().to_dict()

11
auto_trading/strat/all_in.py

@ -10,12 +10,13 @@ class AllIn(Strategy):
"""Run the strategy"""
# first sell all the stocks
money = 0
for stock, amount in filter(lambda kv: kv[1], ptf.content().items()):
money += current_conversion_rate[stock]*amount
ptf.widraw(stock, amount)
for stock, amount in ptf.content().items():
#print(f"{stock}: {amount}")
if amount > 0:
money += current_conversion_rate[stock]*amount
ptf.widraw(amount, stock)
# after get the greatest result
greatest = max(result, key=lambda k: result[k])
# then buy all the greatest result
ptf.deposit(amount/current_conversion_rate[greatest], greatest)
ptf.deposit(money/current_conversion_rate[greatest], greatest)

24
main.py

@ -0,0 +1,24 @@
from auto_trading.broker.backtest import Backtest
from auto_trading.strat.all_in import AllIn
from auto_trading.ptf.in_memory import InMemoryPortfolio
from auto_trading.predictor.mean_agg import MeanAggregator
from auto_trading.predictor.random_predictor import RandomPredictor
from auto_trading.main import Bot
if __name__ == '__main__':
csv = "data/price_history.csv"
with open(csv, 'r') as f:
head = f.readline().replace("\n", "").split(",")[1:]
pred = MeanAggregator([RandomPredictor() for _ in range(4)])
bot = Bot(
ptf=InMemoryPortfolio({k:1 for k in head}),
strategy=AllIn(),
broker=Backtest(csv, index_col=0, skiprows=1600, names=head),
predictor=pred
)
bot.run()
bot.print_results()
Loading…
Cancel
Save