def main(): import coloredlogs coloredlogs.install(level='DEBUG', fmt='[%(asctime)s] %(levelname)s %(message)s') # Load the yahoo feed from CSV files. feed = yahoofeed.Feed() feed.addBarsFromCSV("aeti", "./tests/data/aeti-2011-yahoofinance.csv") feed.addBarsFromCSV("egan", "./tests/data/egan-2011-yahoofinance.csv") feed.addBarsFromCSV("glng", "./tests/data/glng-2011-yahoofinance.csv") feed.addBarsFromCSV("simo", "./tests/data/simo-2011-yahoofinance.csv") # Evaluate the strategy with the feed's bars. myStrategy = MyStrategy(feed) # Attach returns and sharpe ratio analyzers. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) # Run the strategy myStrategy.run() # Print the results. print("Final portfolio value: $%.2f" % myStrategy.getResult()) print("Anual return: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100)) print("Average daily return: %.2f %%" % (stats.mean(retAnalyzer.getReturns()) * 100)) print("Std. dev. daily return: %.4f" % (stats.stddev(retAnalyzer.getReturns()))) print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0)))
def main(): strat = thrSMA instrument = '600288' paras = [2, 20, 60, 10] feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare") strat = strat(feeds, instrument, *paras) retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() strat.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() strat.attachAnalyzer(tradesAnalyzer) plter = plotter.StrategyPlotter(strat, True, True, True) strat.run() plter.plot() # 夏普率 sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05) # 最大回撤 maxdd = drawDownAnalyzer.getMaxDrawDown() # 收益率 return_ = retAnalyzer.getCumulativeReturns()[-1] # 收益曲线 return_list = [] for item in retAnalyzer.getCumulativeReturns(): return_list.append(item)
def testCumulativeReturn(self): initialCash = 33.06 barFeed = yahoofeed.Feed() barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = position_test.MyTestStrategy(barFeed, AnalyzerTestCase.TestInstrument, initialCash) strat.addPosEntry(datetime.datetime(2001, 1, 12), strat.enterLong, AnalyzerTestCase.TestInstrument, 1) # 33.06 strat.addPosExitMarket(datetime.datetime(2001, 11, 27)) # 14.32 stratAnalyzer = returns.Returns(maxLen=10) strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue( round(strat.getBroker().getCash(), 2) == round( initialCash + (14.32 - 33.06), 2)) self.assertTrue( round(33.06 * (1 + stratAnalyzer.getCumulativeReturns()[-1]), 2) == 14.32) self.assertEqual(len(stratAnalyzer.getCumulativeReturns()), 10) self.assertEqual(len(stratAnalyzer.getReturns()), 10)
def testFirstBar(self): initialCash = 1000 barFeed = yahoofeed.Feed() barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.MyTestStrategy(barFeed, initialCash) strat.addOrder(datetime.datetime(2001, 1, 2), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1, False) # 2001-01-03 Open: 25.25 Close: 32.00 stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertEqual(stratAnalyzer.getReturns()[0], 0) self.assertEqual(stratAnalyzer.getReturns()[1], (32.00 - 25.25) / 1000) # Check date times. datetimes = barFeed[AnalyzerTestCase.TestInstrument].getDateTimes() for i in [0, -1]: self.assertEqual(stratAnalyzer.getReturns().getDateTimes()[i], datetimes[i]) self.assertEqual( stratAnalyzer.getCumulativeReturns().getDateTimes()[i], datetimes[i])
def testOneBarReturn(self): initialCash = 1000 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 7), datetime.datetime(2001, 12, 7))) barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.MyTestStrategy(barFeed, initialCash) # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56 # Manually place the orders to get them filled on the first (and only) bar. order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1, False) # Open: 15.74 strat.getBroker().submitOrder(order) order = strat.getBroker().createMarketOrder( broker.Order.Action.SELL, AnalyzerTestCase.TestInstrument, 1, True) # Close: 15.91 strat.getBroker().submitOrder(order) stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getCash() == initialCash + (15.91 - 15.74)) finalValue = 1000 - 15.74 + 15.91 rets = (finalValue - initialCash) / float(initialCash) self.assertEqual(stratAnalyzer.getReturns()[-1], rets)
def main(): # 2.读取csv文件. feed = GenericBarFeed(Frequency.DAY, None, None) feed.addBarsFromCSV("a", "a.csv") feed.addBarsFromCSV("b", "b.csv") feed.addBarsFromCSV("c", "c.csv") feed.addBarsFromCSV("d", "d.csv") strat = MyStrategy(feed) # 3.加入分析器 retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) # 4.运行策略 strat.run() # 5.输出结果 # 最终的投资组合价值 print("Final portfolio value: $%.2f" % strat.getResult()) # 年化平均收益率 print("Anual return: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100)) # 平均日收益 print("Average daily return: %.2f %%" % (stats.mean(retAnalyzer.getReturns()) * 100)) # 每日收益标准开发 print("Std. dev. daily return: %.4f" % (stats.stddev(retAnalyzer.getReturns()))) # 夏普比率 print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0)))
def testStrategy(): instrument = '600288' frequency = bar.Frequency.TRADE fromDate = '20160815' toDate = '20160820' strat = OrderBook paras = [5, 20] plot = True from mooquant.tools import tushare feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare") strat = strat(feeds, instrument, *paras) retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() strat.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() strat.attachAnalyzer(tradesAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, True, True, True) strat.run() if plot: plt.plot() # 夏普率 sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05) # 最大回撤 maxdd = drawDownAnalyzer.getMaxDrawDown() # 收益率 return_ = retAnalyzer.getCumulativeReturns()[-1] # 收益曲线 return_list = [] for item in retAnalyzer.getCumulativeReturns(): return_list.append(item)
def main(): # Load the orders file. ordersFile = OrdersFile("./tests/data/orders.csv") print("First date", ordersFile.getFirstDate()) print("Last date", ordersFile.getLastDate()) print("Symbols", ordersFile.getInstruments()) # Load the data from QSTK storage. QS environment variable has to be defined. if os.getenv("QS") is None: raise Exception("QS environment variable not defined") feed = yahoofeed.Feed() feed.setBarFilter( csvfeed.DateRangeFilter(ordersFile.getFirstDate(), ordersFile.getLastDate())) feed.setDailyBarTime( datetime.time(0, 0, 0) ) # This is to match the dates loaded with the ones in the orders file. for symbol in ordersFile.getInstruments(): feed.addBarsFromCSV( symbol, os.path.join(os.getenv("QS"), "QSData", "Yahoo", symbol + ".csv")) # Run the strategy. cash = 1000000 useAdjustedClose = True myStrategy = MyStrategy(feed, cash, ordersFile, useAdjustedClose) # Attach returns and sharpe ratio analyzers. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) myStrategy.run() # Print the results. print("Final portfolio value: $%.2f" % myStrategy.getResult()) print("Anual return: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100)) print("Average daily return: %.2f %%" % (stats.mean(retAnalyzer.getReturns()) * 100)) print("Std. dev. daily return: %.4f" % (stats.stddev(retAnalyzer.getReturns()))) print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0)))
def testMultipleInstrumentsInterleaved(self): barFeed = yahoofeed.Feed() barFeed.addBarsFromCSV( "spy", common.get_data_file_path("spy-2010-yahoofinance.csv"), marketsession.NYSE.getTimezone()) barFeed.addBarsFromCSV( "nikkei", common.get_data_file_path("nikkei-2010-yahoofinance.csv"), marketsession.TSE.getTimezone()) strat = strategy_test.MyTestStrategy(barFeed, 1000) stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.marketOrder("spy", 1) strat.run() # The cumulative return should be the same if we load nikkei or not. self.assertEqual(round(stratAnalyzer.getCumulativeReturns()[-1], 5), 0.01338)
def testGoogle2011(self): initialValue = 1000000 barFeed = yahoofeed.Feed() barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("goog-2011-yahoofinance.csv")) strat = strategy_test.MyTestStrategy(barFeed, initialValue) order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1654, True) # 2011-01-03 close: 604.35 strat.getBroker().submitOrder(order) stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() finalValue = strat.getBroker().getEquity() self.assertEqual( round(stratAnalyzer.getCumulativeReturns()[-1], 4), round((finalValue - initialValue) / float(initialValue), 4))
def run_strategy(): # Load the yahoo feed from the CSV file feed = GenericBarFeed(Frequency.DAY, None, None) feed.addBarsFromCSV("orcl", "2000.csv") # commission broker_commission = broker.backtesting.TradePercentage(0.002) broker_brk = floatBroker(500000, feed, broker_commission) # Evaluate the strategy with the feed. myStrategy = MyStrategy(feed, "orcl", broker_brk) returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) # Attach the plotter to the strategy. plt = plotter.StrategyPlotter(myStrategy) # Include the SMA in the instrument's subplot to get it displayed along # with the closing prices. plt.getInstrumentSubplot("orcl").addDataSeries("SMA60", myStrategy.getSMA(60)) plt.getInstrumentSubplot("orcl").addDataSeries("SMA10", myStrategy.getSMA(10)) plt.getInstrumentSubplot("orcl").addDataSeries("SMA30", myStrategy.getSMA(30)) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getReturns()) myStrategy.run() print( "Final portfolio value: $%.2f %.2f %.2f" % (myStrategy.getBroker().getEquity(), myStrategy.getBroker().getCash(), myStrategy.getBroker().getShares('orcl'))) myStrategy.totalEnd() # myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult()) # Plot the strategy. plt.plot() print(myStrategy.getJSL())
def testStrategy(): strat = thrSMA instrument = '600288' market = 'SH' fromDate = '20150101' toDate = '20150601' frequency = bar.Frequency.MINUTE plot = True paras = [2, 20, 60, 10] feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare") strat = strat(feeds, instrument, *paras) retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() strat.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() strat.attachAnalyzer(tradesAnalyzer) strat.run() # 夏普率 sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05) # 最大回撤 maxdd = drawDownAnalyzer.getMaxDrawDown() # 收益率 return_ = retAnalyzer.getCumulativeReturns()[-1] # 收益曲线 return_list = [] for item in retAnalyzer.getCumulativeReturns(): return_list.append(item)
def testTwoBarReturns_OpenClose(self): initialCash = 15.61 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 6), datetime.datetime(2001, 12, 7))) barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.MyTestStrategy(barFeed, initialCash) # 2001-12-06,15.61,16.03,15.50,15.90,66944900,15.55 # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56 # Manually place the entry order, to get it filled on the first bar. order = strat.getBroker().createMarketOrder( broker.Order.Action.BUY, AnalyzerTestCase.TestInstrument, 1, False) # Open: 15.61 strat.getBroker().submitOrder(order) strat.addOrder(datetime.datetime(2001, 12, 6), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, AnalyzerTestCase.TestInstrument, 1, True) # Close: 15.91 stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getCash() == initialCash + (15.91 - 15.61)) # First day returns: Open vs Close self.assertTrue(stratAnalyzer.getReturns()[0] == (15.90 - 15.61) / 15.61) # Second day returns: Close vs Prev. day's close self.assertTrue(stratAnalyzer.getReturns()[1] == (15.91 - 15.90) / 15.90)
from mooquant import plotter from mooquant.analyzer import returns from mooquant.tools import tushare from samples import sma_crossover if __name__ == '__main__': instrument = '600016' feeds = tushare.build_feed([instrument], 2016, 2018, './histdata/tushare') strat = sma_crossover.SMACrossOver(feeds, instrument, 20) # Attach a returns analyzers to the strategy. returnsAnalyzer = returns.Returns() strat.attachAnalyzer(returnsAnalyzer) # Attach the plotter to the strategy. plt = plotter.StrategyPlotter(strat) # Include the SMA in the instrument's subplot to get it displayed along with the closing prices. plt.getInstrumentSubplot("orcl").addDataSeries("SMA", strat.getSMA()) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns()) # Run the strategy. strat.run() strat.info("Final portfolio value: $%.2f" % strat.getResult()) # Plot the strategy. plt.plot()
def testStrategy(): from mooquant import bar from mooquant import plotter strat = fourSMA instrument = '600288' market = 'SH' fromDate = '20150101' toDate = '20150601' frequency = bar.Frequency.MINUTE paras = [2, 20, 60, 10] plot = True # path set ############################33 # if frequency == bar.Frequency.MINUTE: # path = os.path.join('..', 'histdata', 'minute') # elif frequency == bar.Frequency.DAY: # path = os.path.join('..', 'histdata', 'day') # filepath = os.path.join(path, instrument + market + ".csv") # don't change ############################33 # barfeed = Feed(frequency) # barfeed.setDateTimeFormat('%Y-%m-%d %H:%M:%S') # barfeed.loadBars(instrument, market, fromDate, toDate, filepath) # mooquant_id = instrument + '.' + market # strat = strat(barfeed, mooquant_id, *paras) from mooquant.tools import tushare feeds = tushare.build_feed([instrument], 2016, 2017, "histdata/tushare") strat = strat(feeds, instrument, *paras) retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() strat.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() strat.attachAnalyzer(tradesAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, True, True, True) strat.run() if plot: plt.plot() # 夏普率 sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05) # 最大回撤 maxdd = drawDownAnalyzer.getMaxDrawDown() # 收益率 return_ = retAnalyzer.getCumulativeReturns()[-1] # 收益曲线 return_list = [] for item in retAnalyzer.getCumulativeReturns(): return_list.append(item)