def foo(config): print('Running...') asset = EURUSD(generate_data(100000)) account = Account(initial_balance=1000) slow_period = 45 fast_period = 35 sma = np.zeros((asset.data.shape[0],2)) sma[(slow_period-1):,0] = moving_average(asset.data[:,1],slow_period) sma[(fast_period-1):,1] = moving_average(asset.data[:,1],fast_period) risk_man = ConstantRate(config['lot_size'],on='free_margin') strategy = MACross(RiskManagement=risk_man,rate=config['rate']) strategy = asset.register(strategy) result = BackTest(account,strategy).run(assets=asset,exog=sma) tune.track.log(mean_accuracy=result.Account.balance)
if stock not in selected.index: self.selected_to_close.append(stock) del self.past_data[0] return order.asset_id in self.selected_to_close # close if the order is selected for close else: return False else: return order.asset_id in self.selected_to_close # close if the order is selected for close def decide_short_close(self, order, spot_price, timestamp, Account, exog): return False stocks = [ Stock(generate_data(10000, freq='1h'), name=f'stock_{i}', short_name=f'STCK_{i}') for i in range(20) ] # randomly generate stock prices account = Account( initial_balance=1000) # initialize an account with 1000 USD balance risk_man = ConstantRate(0.05) # constant lot size with 5% of balance each time strategy = CustomAllocation(RiskManagement=risk_man, id=45450, name='custom_buyer') for stock in stocks: strategy = stock.register( strategy) # allow strategy to use all of them, either one or multiple sim = BackTest(Account=account, Strategy=strategy).run(stocks) print(sim.Account.balances)
# TO DO: simplify the code class Random(ParamSearch): def __init__(self,q,*args,**kwargs): super().__init__(*args,**kwargs) if not 0 < q < 1: raise ValueError('q must be in (0,1)') self.q = q def run(self,*args,**kwargs): params = list(dict_product(self._paramset)) size = len(params) self.n = int(size*self.q) idxs = np.random.randint(0,size,self.n,dtype=int) params = [params[i] for i in idxs] list(map(lambda s: self._run(s,*args,**kwargs),params)) return self if __name__ == '__main__': from strategy_tester.utils import generate_data, dict_product from strategy_tester.account import Account from strategy_tester.strategy import Strategy from strategy_tester.risk_management import ConstantRate data = generate_data(100000) account = Account(balance=1000) paramset = {'RiskManagement':[ConstantRate(0.05),ConstantRate(0.1),ConstantRate(0.2)]} sim = Random(0.7,account,Strategy,paramset).run(data.values) print(sim.output)
'strike_price': spot_price[asset_id] } output[asset_id] = args return output def decide_long_close(self, order, spot_price, timestamp, Account, exog): return exog[0] < exog[1] def decide_short_close(self, order, spot_price, timestamp, Account, exog): return exog[0] > exog[1] np.random.seed(123) aapl = AAPL(generate_data(100000)) account = Account(initial_balance=1000) risk_man = ConstantRate(0.01, on='free_margin') strategy = MACross(RiskManagement=risk_man, id=45450, name='ma_cross_trader') strategy = aapl.register(strategy) slow_period = 45 fast_period = 35 sma = np.zeros((aapl.data.shape[0], 2)) sma[(slow_period - 1):, 0] = moving_average(aapl.data[:, 1], slow_period) sma[(fast_period - 1):, 1] = moving_average(aapl.data[:, 1], fast_period) sim = BackTest(Account=account, Strategy=strategy, track=(ROI, sharpe_ratio)).run(aapl, exog=sma) print(sim.tracked_results) print(sim.Account.balances) print(sim.Account.equities)
self.q = q def run(self, *args, **kwargs): params = list(dict_product(self._paramset)) size = len(params) self.n = int(size * self.q) idxs = np.random.randint(0, size, self.n, dtype=int) params = [params[i] for i in idxs] list(map(lambda s: self._run(s, *args, **kwargs), params)) return self if __name__ == "__main__": from strategy_tester.utils import generate_data, dict_product from strategy_tester.account import Account from strategy_tester.strategy import Strategy from strategy_tester.risk_management import ConstantRate data = generate_data(100000) account = Account() paramset = { "RiskManagement": [ ConstantRate(0.05), ConstantRate(0.1), ConstantRate(0.2), ] } sim = Random(0.7, account, Strategy, paramset).run(data.values) print(sim.output)
import sys import numpy as np import pandas as pd sys.path.insert(0, '../') from strategy_tester.account import Account from strategy_tester.asset import EURUSD from strategy_tester.strategy import Strategy from strategy_tester.risk_management import ConstantRate, KellyCriterion from strategy_tester.simulate import BackTest from strategy_tester.utils import generate_data eurusd = EURUSD(generate_data(100000)) account = Account(initial_balance=1000) strategy_1 = Strategy(RiskManagement=ConstantRate(0.05), id=23030, name='noise_trader_1') strategy_2 = Strategy(RiskManagement=KellyCriterion(n=20), id=23031, name='noise_trader_2') strategy_1, strategy_2 = eurusd.register(strategy_1, strategy_2) sim = BackTest(Account=account, Strategy=[strategy_1, strategy_2]).run(eurusd) print(sim.Account.balances)
"strike_price": ticker.price, } output[ticker.aid] = args return output def decide_long_close(self, order, tickers, Account, exog): return exog[0] < exog[1] def decide_short_close(self, order, tickers, Account, exog): return exog[0] > exog[1] np.random.seed(123) aapl = Stock(price=generate_data(100000), base="AAPL") account = Account() risk_man = ConstantRate(0.01, on="free_margin") strategy = MACross(RiskManagement=risk_man, id=45450, name="ma_cross_trader") strategy = aapl.register(strategy) slow_period = 55 fast_period = 35 def convert_ticker_data(tickers, fields=None): output = [] for ticker in tickers: output.append(ticker.to_dict(fields)) return pd.DataFrame(output)
import sys import numpy as np import pandas as pd sys.path.insert(0,'../') from strategy_tester.account import Account from strategy_tester.asset import EURUSD, GBPUSD from strategy_tester.strategy import Strategy from strategy_tester.risk_management import ConstantRate from strategy_tester.simulate import BackTest from strategy_tester.utils import generate_data eurusd = EURUSD(data=generate_data(100000)) gbpusd = GBPUSD(data=generate_data(100000)) account = Account(initial_balance=1000) risk_man = ConstantRate(0.1) strategy_1 = Strategy(RiskManagement=risk_man,id=23030,name='noise_trader') strategy_2 = Strategy(RiskManagement=risk_man,id=23031,name='noise_trader2') strategy_1,strategy_2 = eurusd.register(strategy_1,strategy_2) strategy_1 = gbpusd.register(strategy_1) sim = BackTest(Account=account,Strategy=[strategy_1,strategy_2]).run(assets=(eurusd,gbpusd)) print(sim.Account.balances)