def __init__(self, configFile, startTickDate=0, startTradeDate=0, endTradeDate=None, cash=150000, symbolLists=None): LOG.debug("Loading config from %s" % configFile) self.__config = PyConfig() self.__config.setSource(configFile) self.__cash = cash self.__mCalculator = MetricManager() self.__symbolLists = symbolLists self.__accounts = [] self.__startTickDate = startTickDate self.__startTradeDate = startTradeDate self.__endTradeDate = endTradeDate self.__firstSaver = None
def __init__(self, configFile, startTickDate = 0, startTradeDate = 0, endTradeDate = None, cash = 150000, symbolLists = None): LOG.debug("Loading config from %s" % configFile) self.__config = PyConfig() self.__config.setSource(configFile) self.__cash = cash self.__mCalculator = MetricManager() self.__symbolLists = symbolLists self.__accounts = [] self.__startTickDate = startTickDate self.__startTradeDate = startTradeDate self.__endTradeDate = endTradeDate self.__firstSaver = None
class BackTester(object): ''' back testing ''' def __init__(self, configFile, startTickDate=0, startTradeDate=0, endTradeDate=None, cash=150000, symbolLists=None): LOG.debug("Loading config from %s" % configFile) self.__config = PyConfig() self.__config.setSource(configFile) self.__cash = cash self.__mCalculator = MetricManager() self.__symbolLists = symbolLists self.__accounts = [] self.__startTickDate = startTickDate self.__startTradeDate = startTradeDate self.__endTradeDate = endTradeDate self.__firstSaver = None def setup(self): ''' setup ''' appGlobal[TRADE_TYPE] = self.__config.getOption( CONF_ULTRAFINANCE_SECTION, CONF_TRADE_TYPE) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_INIT_CASH, self.__cash) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_START_TRADE_DATE, self.__startTradeDate) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_END_TRADE_DATE, self.__endTradeDate) self._setupLog() LOG.debug(self.__symbolLists) if not self.__symbolLists: self._loadSymbols() def _setupLog(self): ''' setup logging ''' if self.__config.getSection("loggers"): logging.config.fileConfig(self.__config.getFullPath()) def _runOneTest(self, symbols): ''' run one test ''' LOG.debug("Running backtest for %s" % symbols) runner = TestRunner(self.__config, self.__mCalculator, self.__accounts, symbols, self.__startTickDate, self.__endTradeDate, self.__cash) runner.runTest() def _loadSymbols(self): ''' find symbols''' symbolFile = self.__config.getOption(CONF_ULTRAFINANCE_SECTION, CONF_SYMBOL_FILE) assert symbolFile is not None, "%s is required in config file" % CONF_SYMBOL_FILE LOG.info("loading symbols from %s" % os.path.join(self.__config.getDir(), symbolFile)) if not self.__symbolLists: self.__symbolLists = [] with open(os.path.join(self.__config.getDir(), symbolFile), "r") as f: for symbols in f: if symbols not in self.__symbolLists: self.__symbolLists.append( [symbol.strip() for symbol in symbols.split()]) assert self.__symbolLists, "None symbol provided" def runTests(self): ''' run tests ''' for symbols in self.__symbolLists: try: self._runOneTest(symbols) except KeyboardInterrupt: LOG.error("User Interrupted") sys.exit("User Interrupted") except BaseException as excp: LOG.error("Unexpected error when backtesting %s -- except %s, traceback %s" \ % (symbols, excp, traceback.format_exc(8))) def getMetrics(self): ''' get all metrics ''' return self.__mCalculator.getMetrics() def printMetrics(self): ''' print metrics ''' LOG.info(self.getMetrics())
class BackTester(object): ''' back testing ''' def __init__(self, configFile, startTickDate = 0, startTradeDate = 0, endTradeDate = None, cash = 150000, symbolLists = None): LOG.debug("Loading config from %s" % configFile) self.__config = PyConfig() self.__config.setSource(configFile) self.__cash = cash self.__mCalculator = MetricManager() self.__symbolLists = symbolLists self.__accounts = [] self.__startTickDate = startTickDate self.__startTradeDate = startTradeDate self.__endTradeDate = endTradeDate self.__firstSaver = None def setup(self): ''' setup ''' appGlobal[TRADE_TYPE] = self.__config.getOption(CONF_ULTRAFINANCE_SECTION, CONF_TRADE_TYPE) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_INIT_CASH, self.__cash) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_START_TRADE_DATE, self.__startTradeDate) self.__config.override(CONF_ULTRAFINANCE_SECTION, CONF_END_TRADE_DATE, self.__endTradeDate) self._setupLog() LOG.debug(self.__symbolLists) if not self.__symbolLists: self._loadSymbols() def _setupLog(self): ''' setup logging ''' if self.__config.getSection("loggers"): logging.config.fileConfig(self.__config.getFullPath()) def _runOneTest(self, symbols): ''' run one test ''' LOG.debug("Running backtest for %s" % symbols) runner = TestRunner(self.__config, self.__mCalculator, self.__accounts, symbols, self.__startTickDate, self.__endTradeDate, self.__cash) runner.runTest() def _loadSymbols(self): ''' find symbols''' symbolFile = self.__config.getOption(CONF_ULTRAFINANCE_SECTION, CONF_SYMBOL_FILE) assert symbolFile is not None, "%s is required in config file" % CONF_SYMBOL_FILE LOG.info("loading symbols from %s" % os.path.join(self.__config.getDir(), symbolFile)) if not self.__symbolLists: self.__symbolLists = [] with open(os.path.join(self.__config.getDir(), symbolFile), "r") as f: for symbols in f: if symbols not in self.__symbolLists: self.__symbolLists.append([symbol.strip() for symbol in symbols.split()]) assert self.__symbolLists, "None symbol provided" def runTests(self): ''' run tests ''' for symbols in self.__symbolLists: try: self._runOneTest(symbols) except KeyboardInterrupt: LOG.error("User Interrupted") sys.exit("User Interrupted") except BaseException as excp: LOG.error("Unexpected error when backtesting %s -- except %s, traceback %s" \ % (symbols, excp, traceback.format_exc(8))) def getMetrics(self): ''' get all metrics ''' return self.__mCalculator.getMetrics() def printMetrics(self): ''' print metrics ''' LOG.info(self.getMetrics())