def _load_datafeed(cerebro: bt.Cerebro): """Load all feeds into backtrader""" # Datas are in a subfolder of the samples. Need to find where the script is located # because it could have been called from anywhere modpath = os.path.dirname(os.path.abspath(sys.argv[0])) feeds = [ f for f in listdir(DATA_FEED_PATH) if isfile(join(DATA_FEED_PATH, f)) and DATA_SUFFIX in f ] for feed in feeds: data_path = os.path.join(modpath, f'{DATA_FEED_PATH}{feed}') # Data Feed data = bt.feeds.YahooFinanceCSVData( dataname=data_path, # DO NOT PASS VALUES BEFORE THIS DATE fromdate=settings.FROM_DATE, # DO NOT PASS VALUES AFTER THIS DATE todate=settings.TO_DATE, reverse=False) cerebro.adddata(data) print(f"Added {len(feeds)} data feeds files")
def test_ordered_optimize(cerebro: bt.Cerebro): cerebro.optstrategy(bt.strategies.MA_CrossOver, slow=[20], fast=[5, 10, 20]) res = cerebro.run(optreturn=True) def df(optresults): a = [x.analyzers.tradeanalyzer.get_analysis() for x in optresults] return sum([x.pnl.gross.total if 'pnl' in x else 0 for x in a]) usercolumns = { 'Profit & Loss': df, } b = Bokeh(style='bar', output_mode=_output_mode) browser = OptBrowser(b, res, usercolumns=usercolumns, sortcolumn='Profit & Loss') model = browser.build_optresult_model() # browser.start() def count_children(obj): numo = 1 if hasattr(obj, "children"): numo = count_children(obj.children) if hasattr(obj, '__len__'): numo += len(obj) return numo num = count_children(model) assert num == 3
def test_optimize_no_optreturn(cerebro_no_optreturn: bt.Cerebro): cerebro_no_optreturn.optstrategy(bt.strategies.MA_CrossOver, slow=[5, 10, 20], fast=[5, 10, 20]) res = cerebro_no_optreturn.run() s = backtrader_plotting.schemes.Blackly() b = Bokeh(style='bar', output_mode=_output_mode, scheme=s) browser = OptBrowser(b, res) model = browser.build_optresult_model() #browser.start() def count_children(obj): numo = 1 if hasattr(obj, "children"): numo = count_children(obj.children) if hasattr(obj, '__len__'): numo += len(obj) return numo num = count_children(model) assert num == 3
def test_std_backtest(cerebro: bt.Cerebro): cerebro.addstrategy(bt.strategies.MA_CrossOver) cerebro.run() s = backtrader_plotting.schemes.Blackly() b = Bokeh(style='bar', scheme=s, output_mode=_output_mode) figs = cerebro.plot(b) assert len(figs) == 1 assert_num_tabs(figs, 3) assert_num_figures(figs, 4)
def test_optimize_2strat(cerebro: bt.Cerebro): cerebro.optstrategy(bt.strategies.MA_CrossOver, slow=[5, 10, 20], fast=[5, 10, 20]) cerebro.optstrategy(ToggleStrategy, modbuy=[12, 15], modsell=[17, 19]) res = cerebro.run() b = Bokeh(style='bar', output_mode=_output_mode) browser = OptBrowser(b, res) with pytest.raises(RuntimeError): browser.build_optresult_model()
def test_simple(self): cerebro = Cerebro() cerebro.addstrategy(TestStrategy) # 'apiKey' and 'secret' are skipped config = { 'enableRateLimit': True, 'nonce': lambda: str(int(time.time() * 1000)) } feed = CCXTFeed( exchange='binance', dataname='BNB/USDT', # valid values are: # ticks, microseconds, seconds, minutes, daily, weekly, monthly timeframe=TimeFrame.Minutes, fromdate=dt.datetime(2019, 1, 28, 3, 30), todate=dt.datetime(2019, 1, 28, 10, 00), compression=15, ohlcv_limit=2, # required to make calls to binance exchange work currency='BNB', config=config, retries=5, # drop_newest=True, # historical=False, debug=True, ) # Add the feed cerebro.adddata(feed) # Run the strategy cerebro.run()
def add_symbol(cerebro: bt.Cerebro, data_path: str, start_date: str, end_date: str): data = DOHLCVPData( dataname=data_path, headers=True, fromdate=datetime.strptime(start_date, "%Y-%m-%d"), todate=datetime.strptime(end_date, "%Y-%m-%d"), reverse=False, ) data.plotinfo.plot = False data.plotinfo.subplot = False data_name = data_path.split("/")[-1][:-4] cerebro.adddata(data, name=data_name) return data
def test_std_backtest_ind_on_line(cerebro: bt.Cerebro): '''In the past it crashed when creating indicators with specific lines case LineSeriesStub was not handled correctly''' class TestStrategy(bt.Strategy): def __init__(self): self._sma = bt.indicators.SMA(self.data.close) cerebro.addstrategy(TestStrategy) cerebro.run() s = backtrader_plotting.schemes.Blackly() b = Bokeh(style='bar', scheme=s, output_mode=_output_mode) figs = cerebro.plot(b) assert len(figs) == 1 assert_num_tabs(figs, 3) assert_num_figures(figs, 3)
def run_bt_multiple(): cerebro = Cerebro() df = get_pickle('tiingo', 'SPY') data = PandasData(dataname=df) cerebro.adddata(data) cerebro.addanalyzer(Returns) cerebro.optstrategy(StrategyFetcher, idx=[0, 1]) results = cerebro.run() strats = [x[0] for x in results] for i, strat in enumerate(strats): rets = strat.analyzers.returns.get_analysis() print('Strategy {} Name {}:\n - analyzer: {}\n'.format( i, strat.__class__.__name__, rets))
def run(symbol, prices, strategy): # initialize the Cerebro engine cerebro = Cerebro() cerebro.broker.setcash(100000) # add OHLC data feed feed = bt.feeds.PandasData(dataname=prices) cerebro.adddata(feed) cerebro.addstrategy(strategy=strategy, ticker=symbol) cerebro.run()
def test_std_backtest_ind_subplot(cerebro: bt.Cerebro): cerebro.addstrategy(bt.strategies.MA_CrossOver) cerebro.run() plotconfig = { '#:i-0': { 'subplot': True, } } s = backtrader_plotting.schemes.Blackly() b = Bokeh(style='bar', scheme=s, output_mode=_output_mode, plotconfig=plotconfig) figs = cerebro.plot(b) assert_num_tabs(figs, 3) assert_num_figures(figs, 5)
def addPandasData(codes, cerebro: bt.Cerebro, pandas_data_type=PandasDataBase): be = get_data_backend() start = get_start_date() end = get_current_date() freq = get_current_freq() if isinstance(codes, str): # 统一转换成list类型 codes = [codes] dflist = [] if hasattr(be, 'get_dataFrames'): dflist = be.get_dataFrames(codes, start, end, freq) # else: # todo 调用be.get_price # for code in codes: # data=be.get_price(codes, start, end, freq) # df= pd.Dataframe(data) # dflist.append(df) for i, data in enumerate(dflist): pdf = pandas_data_type(dataname=data) cerebro.adddata(pdf)
def test_backtest_2strats(cerebro: bt.Cerebro): cerebro.addstrategy(bt.strategies.MA_CrossOver) cerebro.addstrategy(ToggleStrategy) cerebro.run() b = Bokeh(style='bar', output_mode=_output_mode) figs = cerebro.plot(b) assert len(figs) == 2 assert_num_tabs(figs, 3, 3) assert_num_figures(figs, 4, 3)
def test_optimize(cerebro: bt.Cerebro): cerebro.optstrategy(bt.strategies.MA_CrossOver, slow=[5, 10, 20], fast=[5, 10, 20]) res = cerebro.run(optreturn=True) b = Bokeh(style='bar', output_mode=_output_mode) browser = OptBrowser(b, res) model = browser.build_optresult_model() # browser.start() def count_children(obj): numo = 1 if hasattr(obj, "children"): numo = count_children(obj.children) if hasattr(obj, '__len__'): numo += len(obj) return numo num = count_children(model) assert num == 3
def backtesting(config): cerebro = Cerebro() cerebro.addstrategy(TestStrategy) cerebro.adddata(CCXTFeed(exchange='binance', dataname='BNB/USDT', timeframe=TimeFrame.Minutes, fromdate=datetime(2019, 1, 1, 0, 0), todate=datetime(2019, 1, 1, 0, 2), compression=1, ohlcv_limit=2, currency='BNB', config=config, retries=5)) finished_strategies = cerebro.run() return finished_strategies
def test_std_backtest_2datas(cerebro: bt.Cerebro): datapath = getdatadir('nvda-1999-2014.txt') data = bt.feeds.YahooFinanceCSVData( dataname=datapath, fromdate=datetime.datetime(1998, 1, 1), todate=datetime.datetime(2000, 12, 31), reverse=False, swapcloses=True, ) cerebro.adddata(data) cerebro.addstrategy(bt.strategies.MA_CrossOver) cerebro.run() s = backtrader_plotting.schemes.Blackly() b = Bokeh(style='bar', scheme=s, output_mode=_output_mode, merge_data_hovers=True) figs = cerebro.plot(b) assert len(figs) == 1 assert_num_tabs(figs, 3) assert_num_figures(figs, 5)
import os, sys, argparse import pandas import backtrader from backtrader import Cerebro from strategies.BuyAndHold import BuyAndHold from strategies.GoldenCross import GoldenCross cerebro = backtrader.Cerebro() pricesData = pandas.read_csv('SPY.csv', index_col='Date', parse_dates=True) # initializing Cerebro cerebro = Cerebro() cerebro.broker.setcash(100000) feed = backtrader.feeds.PandasData(dataname=pricesData) # add data feed cerebro.adddata(feed) strategies = {"golden_cross": GoldenCross, "buy_hold": BuyAndHold} parser = argparse.ArgumentParser() # parse command line arguments parser.add_argument("strategy", help="Which strategy to run", type=str) args = parser.parse_args() if not args.strategy in strategies: print("Invalid strategy, must select one of {}".format(strategies.keys())) sys.exit() cerebro.addstrategy(strategy=strategies[args.strategy]) cerebro.run() cerebro.plot() # plot the chart
from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Тестирование на меньшем временнОм интервале (Replay) symbol = 'TQBR.GAZP' store = QKStore(Host='192.168.1.7') data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, compression=5 ) # Исторические данные по самому меньшему временному интервалу cerebro.replaydata( data, timeframe=TimeFrame.Days ) # На графике видим большой интервал, прогоняем ТС на меньшем cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему cerebro.run() # Запуск торговой системы cerebro.plot( ) # Рисуем график. Требуется matplotlib версии 3.2.2 (pip install matplotlib==3.2.2)
cerebro = bt.Cerebro() symbol = 'TSLA' #CLDR' prices = get_data(symbol, "01-01-2020", "09-15-2020") print(prices.head()) prices = pd.read_csv(f'../datasets/data_1yr_sep/{symbol}.csv', index_col='Date', parse_dates=True) print(prices.head()) # initialize the Cerebro engine cerebro = Cerebro() cerebro.broker.setcash(100000) # add OHLC data feed feed = bt.feeds.PandasData(dataname=prices) cerebro.adddata(feed) strategies = { "golden_cross": GoldenCross, "buy_hold": BuyHold, "macd": MacdStrat, "macd_opt": MacdStrat, "moving_avg": MovingAverage, "sar": Sar, "adx_macd": AdxMacd }
import os, sys, argparse import pandas as pd import backtrader as bt from backtrader import Cerebro #from strageties.buyHold import BuyHold from strageties.GoldenCross import GoldenCross cerebro = bt.Cerebro() cerebro = Cerebro() cerebro.broker.setcash(1000000) spy_prices = pd.read_csv('oracle.csv', index_col='Date', parse_dates=True) feed = bt.feeds.PandasData(dataname=spy_prices) cerebro.adddata(feed) cerebro.addstrategy(GoldenCross) cerebro.run() cerebro.plot()
# ("FNV", yearly, six_month),# BBB* # ("GOLD", yearly, six_month),# BBB* ) now = datetime.datetime.now() print(f"#################### STARTING {now.strftime('%H:%M:%S')} ##############\n\n") # sel_stocks = (("DECK")) # ("TTSH"), ("TSLA")) for devfactor in [2.0]: #[1.9, 2.0, 2.1, 2.5, 3.0]: print(f'%%%%%%%%%%%%% Devfactor {devfactor} %%%%%%%%%%%%%%%%') for yearly in [9]: #[6,7,8,9,10,11,12,15,18,20,22,25,30,32,35,40,45,50]: for sel_stock in sel_stocks: avg_roi = 0 buy_or_sell = "" for strat in ['bbands1']: # initialize the Cerebro engine cerebro = Cerebro() START_VALUE = 1000 cerebro.broker.setcash(START_VALUE) # add OHLC data feed # feed = bt.feeds.PandasData(dataname=prices) strategies = { "golden_cross": GoldenCross, "buy_hold": BuyHold, "strategy": TestStrategy, "rsi_mean": RSIMean, "bbands": BBands, "stop_loss": ManualStopOrStopTrail, "sma_cross": SmaCross,
from datetime import datetime from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK # from BackTraderQuik.QKData import QKData # Данные QUIK для вызвова напрямую (не рекомендуется) import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Один тикер, один временной интервал # symbol = 'TQBR.GAZP' symbol = 'SPBFUT.SiM1' # data = QKData(dataname=symbol, timeframe=TimeFrame.Days, Host='192.168.1.7') # Можно вызывать данные напрямую (не рекомендуется) store = QKStore(Host='192.168.1.7') # Хранилище QUIK # data = store.getdata(dataname=symbol, timeframe=TimeFrame.Days, fromdate=datetime(2018, 1, 1), LiveBars=False) # Исторические дневные бары с заданной даты # data = store.getdata(dataname=symbol, timeframe=TimeFrame.Minutes, compression=1, LiveBars=False) # Исторические минутные бары за все время data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, fromdate=datetime(2021, 3, 16, 7, 0), compression=1, LiveBars=True) # Исторические и новые минутные бары за все время cerebro.adddata(data) # Добавляем данные cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему cerebro.run() # Запуск торговой системы # cerebro.plot() # Рисуем график. Требуется matplotlib версии 3.2.2 (pip install matplotlib==3.2.2)
from datetime import datetime from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader symbols = ( 'TQBR.SBER', 'TQBR.GAZP', 'TQBR.LKOH', 'TQBR.GMKN', ) # Кортеж тикеров store = QKStore() # Хранилище QUIK (QUIK на локальном компьютере) # store = QKStore(Host='<Ваш IP адрес>') # Хранилище QUIK (К QUIK на удаленном компьютере обращаемся по IP или названию) for symbol in symbols: # Пробегаемся по всем тикерам data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, compression=1, fromdate=datetime(2021, 10, 4), LiveBars=True) # Исторические и новые бары по первому тикеру cerebro.adddata(data) # Добавляем данные cerebro.addstrategy( ts.PrintStatusAndBars, name="One Ticker", symbols=('TQBR.SBER', )) # Добавляем торговую систему по одному тикеру cerebro.addstrategy(ts.PrintStatusAndBars, name="Two Tickers", symbols=( 'TQBR.GAZP',
from datetime import datetime from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Несколько временнЫх интервалов: получение большего временнОго интервала из меньшего (Resample) symbol = 'TQBR.GAZP' store = QKStore(Host='192.168.1.7') data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, compression=15, fromdate=datetime( 2018, 1, 1)) # Исторические данные по самому меньшему временному интервалу cerebro.adddata(data) # Добавляем данные cerebro.resampledata( data, timeframe=TimeFrame.Days ) # Можно добавить больший временной интервал кратный меньшему (добавляется автоматом) cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему cerebro.run() # Запуск торговой системы cerebro.plot( ) # Рисуем график. Требуется matplotlib версии 3.2.2 (pip install matplotlib==3.2.2)
from datetime import datetime from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Несколько временнЫх интервалов, прямая загрузка symbol = 'TQBR.GAZP' store = QKStore(Host='192.168.1.7') data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, compression=1, fromdate=datetime(2020, 1, 1) ) # Исторические данные по малому временнОму интервалу (должен идти первым) cerebro.adddata(data) # Добавляем данные data = store.getdata( dataname=symbol, timeframe=TimeFrame.Days, fromdate=datetime( 2020, 1, 1)) # Исторические данные по большому временнОму интервалу cerebro.adddata(data) # Добавляем данные cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему cerebro.run() # Запуск торговой системы cerebro.plot( ) # Рисуем график. Требуется matplotlib версии 3.2.2 (pip install matplotlib==3.2.2)
parser.add_argument("--historical", action='store_true', help="only run backfill, no live") parser.add_argument("--no-backfill", action='store_true', help="skip backfill, only live") parser.add_argument("--loglevel", default="INFO", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR']) parser.add_argument("--plot", action="store_true") args = parser.parse_args() logging.basicConfig(level=getattr(logging, args.loglevel)) # Create a cerebro entity cerebro = Cerebro() # Set our desired cash start cerebro.broker.setcash(100000.0) # Set our sizer cerebro.addsizer(PercentSizer, percents=90) # Load the Kraken data pair = args.long + args.short datafeed = KrakenData(dataname=pair, timeframe=getattr(TimeFrame, args.timeframe), compression=args.compression, refresh_period=args.refresh, historical=args.historical, backfill_start=not args.no_backfill)
from datetime import datetime from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Несколько временнЫх интервалов: получение большего временнОго интервала из меньшего (Resample) symbol = 'TQBR.GAZP' store = QKStore() # Хранилище QUIK (QUIK на локальном компьютере) # store = QKStore(Host='<Ваш IP адрес>') # Хранилище QUIK (К QUIK на удаленном компьютере обращаемся по IP или названию) data = store.getdata( dataname=symbol, timeframe=TimeFrame.Minutes, compression=1, fromdate=datetime( 2021, 11, 19)) # Исторические данные по самому меньшему временному интервалу cerebro.adddata(data) # Добавляем данные из QUIK для проверки исходников cerebro.resampledata( data, timeframe=TimeFrame.Minutes, compression=5, boundoff=1 ) # Можно добавить больший временной интервал кратный меньшему (добавляется автоматом) data1 = store.getdata(dataname=symbol, timeframe=TimeFrame.Minutes, compression=5, fromdate=datetime(2021, 11, 19)) cerebro.adddata( data1 ) # Добавляем данные из QUIK для проверки правильности работы Resample cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему
if options.data is not None: data_list = options.data.strip() else: data_list = input("Stocks to evaluate >").strip() if data_list == "": raise ValueError("You must input tickers") elif not (data_list in [n.split('.')[0] for n in os.listdir("Data")]): raise ValueError("Tickers must part part of {}".format( [n.split('.')[0] for n in os.listdir("Data")])) if options.percent is not None: percent = float(options.percent) else: percent = float(input("Percent of money you are investing >")) strategies_dict[strategy_key].params.ticker = data_list strategies_dict[strategy_key].params.order_percentage = percent cerebro = Cerebro() cerebro.broker.set_cash(100000) data = pd.read_csv("Data/{}.csv".format(data_list), index_col="date", parse_dates=True) feed = bt.feeds.PandasData(dataname=data, name=data_list) cerebro.adddata(feed) cerebro.addstrategy(strategies_dict[strategy_key]) cerebro.run() cerebro.plot()
from backtrader import Cerebro, TimeFrame from BackTraderQuik.QKStore import QKStore # Хранилище QUIK import Strategy as ts # Торговые системы if __name__ == '__main__': # Точка входа при запуске этого скрипта cerebro = Cerebro() # Инициируем "движок" BackTrader # Склейка фьючерсов (Rollover) symbols = ['SPBFUT.SiH9', 'SPBFUT.SiM9', 'SPBFUT.SiU9', 'SPBFUT.SiZ9', 'SPBFUT.SiH0', 'SPBFUT.SiM0', 'SPBFUT.SiU0', 'SPBFUT.SiZ0', 'SPBFUT.SiH1', 'SPBFUT.SiM1', 'SPBFUT.SiU1', 'SPBFUT.SiZ1'] # Тикеры для склейки store = QKStore() # Хранилище QUIK (QUIK на локальном компьютере) # store = QKStore(Host='<Ваш IP адрес>') # Хранилище QUIK (К QUIK на удаленном компьютере обращаемся по IP или названию) data = [store.getdata(dataname=symbol, timeframe=TimeFrame.Minutes, compression=5) for symbol in symbols] # Получаем по ним исторические данные cerebro.rolloverdata(name='Si', *data, checkdate=True, checkcondition=True) # Склеенный тикер cerebro.addstrategy(ts.PrintStatusAndBars) # Добавляем торговую систему cerebro.run() # Запуск торговой системы cerebro.plot() # Рисуем график. Требуется matplotlib версии 3.2.2 (pip install matplotlib==3.2.2)
import datetime as dt from backtrader import Cerebro, TimeFrame from backtrader_binance import BinanceStore from .strategy import RSIStrategy if __name__ == '__main___': cerebro = Cerebro(quicknotify=True) store = BinanceStore( api_key='YOUR_BINANCE_KEY', api_secret='YOUR_BINANCE_SECRET', coin_refer='BTC', coin_target='USDT') broker = store.getbroker() cerebro.setbroker(broker) from_date = dt.datetime.utcnow() - dt.timedelta(minutes=1261) data = store.getdata( dataname='BTCUSDT', fromdate=from_date, timeframe=TimeFrame.Minutes, compression=60) cerebro.addstrategy(RSIStrategy) cerebro.adddata(data) cerebro.run()