def __init__(self, bars=None, strategy=None, port=None, broker=None, start_date=None, end_date=None): if bars is None: bars = CoinDataHandler(self, ['okcoinUSD']) if strategy is None: strategy = BuyAndHoldStrategy(bars, self) if port is None: port = NaivePortfolio(bars, self, '2017-1-1') if broker is None: broker = SimulatedExecutionHandler(self) self.bars = bars self.strategy = strategy self.port = port self.broker = broker self.__event_queue = Queue() self.__thread = Thread(target=self.__run) self.__active = False self.__handlers = { 'MARKET': [self.__filte_market_event], 'SIGNAL': [port.update_signal], 'ORDER': [broker.execute_order], 'FILL': [port.update_fill] } if start_date is not None: try: sd = datetime.datetime.strptime(start_date + " 00:00:00", "%Y-%m-%d %H:%M:%S") except ValueError: print( "Parameter start_date can't be parsed by datetime.strptime," "start_date will equal to None.") sd = None if end_date is not None: try: ed = datetime.datetime.strptime(end_date + " 00:00:00", "%Y-%m-%d %H:%M:%S") except ValueError: print( "Parameter end_date can't be parsed by datetime.strptime," "end_date will equal to None.") ed = None self.__start_date = sd self.__end_date = ed
def test_bnh_strategy(self): events_queue = queue.Queue(100) bars = HistoricCSVDataHandler( events_queue, './tests/datasets/', ['BTC_ETC'], ['open', 'high', 'low', 'close'] ) strategy = BuyAndHoldStrategy(bars, events_queue) bars.update_bars() event = events_queue.get(False) strategy.calculate_signals(event) signal = events_queue.get(False) self.assertEqual(signal.symbol, 'BTC_ETC') self.assertEqual(signal.strategy_id, 'BUY_AND_HOLD') self.assertEqual(signal.signal_type, 'LONG')
#PYTHON from queue import Queue import time #PROJECT from events import (MarketEvent, SignalEvent, OrderEvent, FillEvent) from data import HistoricCSVDataHandler from strategy import BuyAndHoldStrategy from portfolio import BacktestPortfolio from broker import BacktestBroker #MODULE event_queue = Queue() data = HistoricCSVDataHandler(event_queue, ["AAPL", "BRK-B", "CVX", "KO"]) strategy = BuyAndHoldStrategy(data, event_queue) portfolio = BacktestPortfolio(event_queue, data, "2015-01-01", 10000) broker = BacktestBroker(event_queue) while True: if data.continue_backtest is True: data.update_latest_data() else: break while True: try: event = event_queue.get(block=False) except: break if event is not None:
symbol_list=av_list, key=conf.keys['alpha vantage']['key'], url=conf.keys['alpha vantage']['url']).take_csv(outputsize='full') events = queue.Queue() start_date = conf.values['date']['start_date'] bars = HistoricCSVDataHandler(events, dir_path, symbol_list, start_date) port = NaivePortfolio_add_founds( bars, events, start_date, initial_capital=conf.values['money']['initial_capital'], buy_quantity=10.0, add_funds=conf.values['money']['add_funds']) strategy = BuyAndHoldStrategy(bars, events, port) broker = SimulatedExecutionHandler(events) while True: # Обновляем бары (код для бэктестинга, а не живой торговли) if bars.continue_backtest == True: bars.update_bars() else: break # Обрабатываем события while True: try: event = events.get(False) except queue.Empty: break
from cybos import * import pandas as pd import matplotlib.pyplot as plt from strategy import BollingerStrategy, BuyAndHoldStrategy from barfeed import dataframefeed from datetime import date targetStock = getBarsFromCybos("A000660", date(2015, 1, 1), date(2016, 12, 29)) targetStock.index = targetStock['Date'] initialCash = 200000 feed = dataframefeed.Feed() feed.addBarsFromDf('targetStock', targetStock) buyandhold = BuyAndHoldStrategy(feed, 'targetStock', initialCash) buyandhold.run() print "Buy and Hold: Final portfolio value: $%.2f" % buyandhold.getBroker( ).getEquity() feed.reset() myStrategy = BollingerStrategy(feed, 'targetStock', initialCash, 20, 1.8) myStrategy.run() print "Bollinger Band: Final portfolio value: $%.2f" % myStrategy.getBroker( ).getEquity() plotData = pd.DataFrame(data={'Close':targetStock['Close'], 'Upper': list(reversed(myStrategy.upper)), \ 'Lower': list(reversed(myStrategy.lower)), \ 'Middle': list(reversed(myStrategy.middle))}, index= targetStock['Date'])
#MYMODULES from queue import Queue from events import (MarketEvent, SignalEvent, OrderEvent, FillEvent) from data import HistoricCSVDataHandler from strategy import BuyAndHoldStrategy from portfolio import NaivePortfolio from execution import SimulatedExecutionHandler #INSTANTIATIONS event_queue = Queue() CSV_dir = 'INCLUDE DIRECTORY OF CSV FILES HERE' data = HistoricCSVDataHandler(event_queue, CSV_dir, ['AAPL', 'CVX']) #Input a list of stock names here strategy = BuyAndHoldStrategy(data, event_queue) start_date = datetime.date(14, 12, 1) portfolio = NaivePortfolio(event_queue, data, start_date) broker = SimulatedExecutionHandler(event_queue) #outer loop: mimicking the drip-feed of live data while True: if data.continue_backtest is True: data.update_data() #drip-feed new line of data else: break #inner loop: handles events in the queue. Breaks when the queue is empty to get new data while True: try: event = event_queue.get_nowait() #gets new event but does not wait for queue to fill again if it is empty
#from data import DataHandler #actually a subclass of DataHandler import os os.chdir("/home/taylor/backtester/") import Queue import time from data import HistoricCSVDataHandler from strategy import BuyAndHoldStrategy from portfolio import NaivePortfolio from execution import SimulatedExecutionHandler start_date = '2015-03-13' #figure out better solution for this events = Queue.Queue(maxsize=100) bars = HistoricCSVDataHandler(events, "/home/taylor/backtester/csv/", ['yhoo']) strategy = BuyAndHoldStrategy(bars, events) port = NaivePortfolio(bars, events, start_date, initial_capital=100000.) broker = SimulatedExecutionHandler(events) while True: # Update the bars (specific backtest code, as opposed to live trading) if bars.continue_backtest == True: bars.update_bars() else: break # Handle the events while True: try: event = events.get(False) except Queue.Empty: