예제 #1
0
파일: main.py 프로젝트: davidlyu/QingYun
    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
예제 #2
0
    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')
예제 #3
0
#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:
예제 #4
0
        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
예제 #5
0
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'])
예제 #6
0
#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
예제 #7
0
#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: