def __init__(self, instrument, startYear, endYear, strategy, base="510300", cash=1000000, feeRate=0.0003): self.__instrument = instrument self.__startYear = startYear self.__endYear = endYear self.__strategy = strategy self.__base = [] self.__base.append(base) self.__cash = cash self.__feeRate = feeRate # 要创建的内部变量 self.__strategyTest = None self.__feed = None self.__strategyBase = None self.__feedBase = None self.__brk = None self.__brkBase = None self.__return = returns.Returns() self.__returnBase = returns.Returns() self.__sharpe = sharpe.SharpeRatio() self.__drawdown = drawdown.DrawDown() self.__trade = trades.Trades() self.__result = pd.DataFrame() self.__plter = None # 使用pyalgotrade绘图要加上,不然报错 register_matplotlib_converters()
def run_strategy(cash): instruments = ["000001"] feeds = tools.build_feed(instruments, 2016, 2018, "histdata") # 设置手续费 broker_commision = broker.backtesting.TradePercentage(0.0003) brk = broker.backtesting.Broker(cash, feeds, broker_commision) myStrategy = MyStrategy(feeds, instruments[0], brk) retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeAnalyzer) drawDownAnalyzer = drawdown.DrawDown() myStrategy.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) # 以沪深300为基准# instruments300 = ["510300"] feeds300 = tools.build_feed(instruments300, 2016, 2018, "histdata300") # 设置手续费 broker_commision = broker.backtesting.TradePercentage(0.0003) brk = broker.backtesting.Broker(cash, feeds300, broker_commision) myStrategy300 = MyStrategy(feeds300, instruments300[0], brk) retAnalyzer300 = returns.Returns() myStrategy300.attachAnalyzer(retAnalyzer300) sharpeAnalyzer300 = sharpe.SharpeRatio() myStrategy300.attachAnalyzer(sharpeAnalyzer300) drawDownAnalyzer300 = drawdown.DrawDown() myStrategy300.attachAnalyzer(drawDownAnalyzer300) tradesAnalyzer300 = trades.Trades() myStrategy300.attachAnalyzer(tradesAnalyzer300) plter = plotter.StrategyPlotter(myStrategy) plter.getOrCreateSubplot("return").addDataSeries("retuens", retAnalyzer.getReturns()) plter.getOrCreateSubplot("CumReturn").addDataSeries( "CumReturn", retAnalyzer.getCumulativeReturns()) plter.getOrCreateSubplot("return").addDataSeries( "retuens300", retAnalyzer300.getReturns()) plter.getOrCreateSubplot("CumReturn").addDataSeries( "CumReturn300", retAnalyzer300.getCumulativeReturns()) myStrategy.run() myStrategy300.run() plter.savePlot("testdata.png") # print("交易次数:%d" % (tradesAnalyzer.getCount())) print("策略回测指标") analyzer((retAnalyzer, sharpeAnalyzer, drawDownAnalyzer, tradesAnalyzer)) print("基准回测指标") analyzer((retAnalyzer300, sharpeAnalyzer300, drawDownAnalyzer300, tradesAnalyzer300)) # 计算阿尔法 β 信息比例等值 calculater(retAnalyzer, retAnalyzer300) return (myStrategy, retAnalyzer, sharpeAnalyzer, drawDownAnalyzer, tradesAnalyzer)
def main(start_date, end_date, maxLen=DIVERGENCE_DETECT_DIF_LIMIT_BAR_NUM, peried='D'): ''' count: 采用过去count个bar内极值的最大值作为参考。 ''' all_df = get_stock_pool(start_date, end_date) codes = list(set(all_df.code.tolist())) strategys = dict() for code in codes: feed = get_feed(all_df, code, start_date, end_date, peried) if feed is None: return False brk = gen_broker(feed) strategys[code] = MACDStrategy(code, feed, brk, SHORT, LONG, MID, maxLen) # Attach a returns analyzers to the strategy returnsAnalyzer = returns.Returns() strategys[code].attachAnalyzer(returnsAnalyzer) # Attach a sharpe ratio analyzers to the strategy sharpeRatioAnalyzer = sharpe.SharpeRatio() strategys[code].attachAnalyzer(sharpeRatioAnalyzer) # Attach the plotter to the strategy plt = plotter.StrategyPlotter(strategys[code], True, True, True) plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getReturns()) plt.getOrCreateSubplot("Macd").addDataSeries("dif", strategys[code].getDif()) plt.getOrCreateSubplot("Macd").addDataSeries("dea", strategys[code].getDea()) # Run Strategy strategys[code].run() strategys[code].info("Final portfolio value: $%.2f" % strategys[code].getResult()) plt.plot()
def testTwoBarReturns_CloseClose(self): initialCash = 15.90 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter( strategy_test.datetime_from_date(2001, 12, 06), strategy_test.datetime_from_date(2001, 12, 07))) barFeed.addBarsFromCSV( ReturnsTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.TestStrategy(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, ReturnsTestCase.TestInstrument, 1, True) # Close: 15.90 strat.getBroker().placeOrder(order) strat.addOrder(strategy_test.datetime_from_date(2001, 12, 06), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, ReturnsTestCase.TestInstrument, 1, True) # Close: 15.91 stratAnalyzer = returns.Returns() strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getCash() == initialCash + (15.91 - 15.90)) # First day returns: 0 self.assertTrue(stratAnalyzer.getReturns()[0] == 0) # Second day returns: Open vs Prev. day's close self.assertTrue(stratAnalyzer.getReturns()[1] == (15.91 - 15.90) / 15.90)
def main(): # Load the orders file. ordersFile = OrdersFile("./OrderFiles/orders.csv") print "First date", ordersFile.getFirstDate() print "Last date", ordersFile.getLastDate() print "Symbols", ordersFile.getInstruments() qsPath = "/Users/LunaFire/Anaconda/lib/python2.7/site-packages/QSTK" 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(qsPath, "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 ENE(type='old', code='600281'): dat = pd.read_csv("../../api/stock/csv/%sSH_5min.csv" % code, encoding='gbk') dat = dat.fillna(method='pad') dat['Adj Close'] = dat['Close'] dat = dat.rename(columns={'Open': 'open', 'High': 'high', 'Volume': 'volume', 'Close': 'close', 'Low': 'low'}) dat.index = dat['Date Time'] dat.index.name = 'date' # dat = dat.ix[17000:18000,:] feed = dataFramefeed.Feed(frequency=bar.Frequency.MINUTE) feed.addBarsFromDataFrame("orcl", dat) if type == 'macd': myStrategy = mdd.ENE_backtest(feed, 'orcl') elif type == 'old': myStrategy = mdd.ENE_backtest(feed, 'orcl') sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) plt = plotter.StrategyPlotter(myStrategy, True, True, True) plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns()) ds = pyalg_utils.dataSet(myStrategy) # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项 myStrategy.run() plt.plot() print('最大回撤:\t%f\t 交易笔数:\t%d\t 盈利笔数:\t%d\n' % (ds.getMaxDrawDown(), ds.getCount(), ds.getProfitableCount())) print('累计收益:\t%f\t 夏普比率:\t%f\t' % (returnsAnalyzer.getCumulativeReturns()[-1], ds.getSharpeRatio()))
def testFirstBar(self): initialCash = 1000 barFeed = yahoofeed.Feed() barFeed.addBarsFromCSV( AnalyzerTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.TestStrategy(barFeed, initialCash) strat.addOrder(datetime.datetime(2001, 0o1, 0o2), 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 turtle_test(dataString='pyalg'): """ :param dataString: :return: """ feed = yahoofeed.Feed() feed.addBarsFromCSV( "orcl", "../../api/stock/csv/orcl-2000.csv") #注意查看该csv的格式,Open为大写 myStrategy = pdr.turtle(feed, "orcl", 20, 10) # Attach a returns analyzers to the trategy. returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) # Attach the plotter to the strategy. plt = plotter.StrategyPlotter(myStrategy) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getReturns()) if dataString == 'pyalg_util': ds = pyalg_utils.dataSet(myStrategy) # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项 myStrategy.run() myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult()) if dataString == 'pyalg_util': rs = ds.getDefault() # 获取默认的交易信息,dic格式 plot(rs["cumulativeReturns"][:, 0], rs["cumulativeReturns"][:, 1]) # 简单作图示例 plt.plot()
def main(): instrument = "yhoo" bBandsPeriod = 40 # Download the bars. # feed = yahoofinance.build_feed([instrument], 2011, 2012, ".") feed = yahoofeed.Feed() feed.addBarsFromCSV(instrument, "dat\\yhoo-201x.csv") strat = BBands(feed, instrument, bBandsPeriod) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) retAnalyzer = returns.Returns() strat.attachAnalyzer(retAnalyzer) drawDownAnalyzer = drawdown.DrawDown() strat.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() strat.attachAnalyzer(tradesAnalyzer) # ------ mpl.style.use('seaborn-whitegrid'); plt = plotter.StrategyPlotter(strat, True, True, True) plt.getInstrumentSubplot(instrument).addDataSeries("upper", strat.getBollingerBands().getUpperBand()) plt.getInstrumentSubplot(instrument).addDataSeries("middle", strat.getBollingerBands().getMiddleBand()) plt.getInstrumentSubplot(instrument).addDataSeries("lower", strat.getBollingerBands().getLowerBand()) strat.run() plt.plot() # ============================== print("最终资产价值 Final portfolio value: $%.2f" % strat.getResult()) print("累计回报率 Cumulative returns: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100)) print("夏普比率 Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05))) print("最大回撤率 Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100)) print("最长回撤时间 Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration()))
def run_strategy(smaPeriod): # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("zggf", "E:/PythonData/CSV/000938.csv") # Evaluate the strategy with the feed. myStrategy = MyStrategy(feed, "zggf", smaPeriod) returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) plt = plotter.StrategyPlotter(myStrategy) sharpe_ratio = sharpe.SharpeRatio() trade_situation = trades.Trades() myStrategy.attachAnalyzer(sharpe_ratio) myStrategy.attachAnalyzer(trade_situation) plt.getInstrumentSubplot("zggf").addDataSeries("SMA", myStrategy.getSMA()) plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getCumulativeReturns()) print(stats.mean(returnsAnalyzer.getReturns())) print(returnsAnalyzer.getCumulativeReturns()) print(myStrategy.getResult()) myStrategy.run() print("Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity()) print("sharpe_ratio", sharpe_ratio.getSharpeRatio(0)) print("total number of trades", trade_situation.getCount()) print("Profit times number of trades ", trade_situation.getProfitableCount()) plt.plot() print(returnsAnalyzer.getReturns()) print(stats.mean(returnsAnalyzer.getReturns())) print(stats.mean(returnsAnalyzer.getCumulativeReturns()))
def main(plot): instrument = "n225" # Load the bar feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV(instrument, r".\N225.csv") hurstPeriod = 100 strat = StrategyModule.HurstBasedStrategy(feed, "n225", hurstPeriod) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) # Attach a returns analyzers to the strategy. returnsAnalyzer = returns.Returns() strat.attachAnalyzer(returnsAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, True, False, True) plt.getOrCreateSubplot("hurst").addDataSeries("Hurst", strat.getHurst()) plt.getOrCreateSubplot("hurst").addLine("random", 0.5) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns()) strat.run() strat.info("Final portfolio value: $%.2f" % strat.getResult()) print("Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)) if plot: plt.plot()
def main(plot): bBandsPeriod = 1 instrument = '600519' feed = dataFramefeed.Feed() dat = ts.get_hist_data("hs300", start='2017-01-01', end='2017-12-27') dat['Adj Close'] = dat['close'] #feed.addBarsFromDataFrame("hs300", dat.ix[:,(0,1,2,3,4,13)]) dat = ts.get_hist_data("600519", start='2017-01-01', end='2017-12-27') dat['Adj Close'] = dat['close'] feed.addBarsFromDataFrame("600519", dat.ix[:, (0, 1, 2, 3, 4, 14)]) strat = BBands(feed, instrument, bBandsPeriod) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) returnsAnalyzer = returns.Returns() if plot: plt = plotter.StrategyPlotter(strat, True, True, True) plt.getInstrumentSubplot(instrument).addDataSeries( "upper", strat.getBollingerBands().getUpperBand()) plt.getInstrumentSubplot(instrument).addDataSeries( "middle", strat.getBollingerBands().getMiddleBand()) plt.getInstrumentSubplot(instrument).addDataSeries( "lower", strat.getBollingerBands().getLowerBand()) strat.run() print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05) if plot: plt.plot()
def main(): # Load the orders file. ordersFile = OrdersFile("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") == 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, 252))
def runStrategy(): # 下载数据 jdf = ts.get_k_data("000725") # 新建Adj Close字段 jdf["Adj Close"] = jdf.close # 将tushare下的数据的字段保存为pyalgotrade所要求的数据格式 jdf.columns = [ "Date", "Open", "Close", "High", "Low", "Volume", "code", "Adj Close" ] # 将数据保存成本地csv文件 jdf.to_csv("jdf.csv", index=False) feed = yahoofeed.Feed() feed.addBarsFromCSV("jdf", "jdf.csv") myStrategy = MyStrategy(feed, "jdf") returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) plt = plotter.StrategyPlotter(myStrategy) plt.getInstrumentSubplot("jdf") plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getReturns()) myStrategy.run() print("Final portfolio value: $%.2f" % myStrategy.getResult()) plt.plot()
def analyze_and_draw(feed, instrument, period, cash=10000): my_strategy = MyStrategy(feed, instrument, period, cash) # 在执行前添加不同的分析器 ret_analyzer = returns.Returns() my_strategy.attachAnalyzer(ret_analyzer) sharpe_ratio_analyzer = sharpe.SharpeRatio() my_strategy.attachAnalyzer(sharpe_ratio_analyzer) draw_down_analyzer = drawdown.DrawDown() my_strategy.attachAnalyzer(draw_down_analyzer) trades_analyzer = trades.Trades() my_strategy.attachAnalyzer(trades_analyzer) # 设置中文等线字体以显示中文 plts.rcParams['font.sans-serif'] = ['DengXian'] plt = plotter.StrategyPlotter(my_strategy, True, False, True) plt.getInstrumentSubplot(instrument).addDataSeries("SMA", my_strategy.getSMA()) # 开始执行策略 my_strategy.run() plt.plot() # 现金+有价证券 print("最终资产价值 Final portfolio value: ¥%.2f" % my_strategy.getBroker().getEquity()) print("最终资产价值 Final portfolio value: ¥%.2f" % my_strategy.getResult()) print("累计回报率 Cumulative returns: %.2f %%" % (ret_analyzer.getCumulativeReturns()[-1] * 100)) print("夏普比率 Sharpe ratio: %.2f" % (sharpe_ratio_analyzer.getSharpeRatio(0.05))) print("最大回撤率 Max. drawdown: %.2f %%" % (draw_down_analyzer.getMaxDrawDown() * 100)) print("最长回撤时间 Longest drawdown duration: %s" % (draw_down_analyzer.getLongestDrawDownDuration()))
def __init__( self, algo: GQAlgo, symbols, start_datetime, end_datetime, data_freq=FREQ_DAY, initial_cash=10000, ): self.algo = algo self.symbols = symbols self.start_datetime = start_datetime self.end_datetime = end_datetime self.data_freq = data_freq self.datasource = algo.datasource self.initial_cash = initial_cash self.data = GQData() freq_map = { FREQ_DAY: Frequency.DAY, FREQ_MINUTE: Frequency.MINUTE, } self.datafeed = csvfeed.GenericBarFeed(freq_map[data_freq]) self._load_datafeed() self.my_strategy = MyStrategy(self.datafeed, self.symbols, self.algo, self.initial_cash) self.returnsAnalyzer = returns.Returns() self.my_strategy.attachAnalyzer(self.returnsAnalyzer)
def testTwoBarReturns_CloseOpen(self): initialCash = 15.9 barFeed = yahoofeed.Feed() barFeed.setBarFilter(csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 6), datetime.datetime(2001, 12, 7))) barFeed.addBarsFromCSV( INSTRUMENT, common.get_data_file_path("orcl-2001-yahoofinance.csv") ) strat = strategy_test.TestStrategy(barFeed, {PRICE_CURRENCY: 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, INSTRUMENT, 1, True ) # Close: 15.90 strat.getBroker().submitOrder(order) strat.addOrder( datetime.datetime(2001, 12, 6), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, INSTRUMENT, 1, False ) # Open: 15.74 stratAnalyzer = returns.Returns(PRICE_CURRENCY) strat.attachAnalyzer(stratAnalyzer) strat.run() self.assertTrue(strat.getBroker().getBalance(PRICE_CURRENCY) == initialCash + (15.74 - 15.90)) # First day returns: 0 self.assertTrue(stratAnalyzer.getReturns()[0] == 0) # Second day returns: Open vs Prev. day's close self.assertTrue(stratAnalyzer.getReturns()[1] == (15.74 - 15.90) / 15.90)
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(50000, feed, broker_commission) # broker_brk = broker.backtesting.Broker(50000, feed) # 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.info("Final portfolio value: $%.2f" % myStrategy.getResult()) # Plot the strategy. plt.plot()
def main(start_date, end_date, maxLen=DIVERGENCE_DETECT_DIF_LIMIT_BAR_NUM, peried='D'): all_df = get_stock_pool(start_date, end_date) codes = list(set(all_df.code.tolist())) feed = get_feed(all_df, codes, start_date, end_date, peried) if feed is None: return False #每只股票可投资的金额 cash = 100000 stockNum = 10 totalRisk = 0.1 duaration = 10 #调仓周期 macdStrategy = MACDStrategy(totalRisk, codes, feed, cash, SHORT, LONG, MID, maxLen, stockNum, duaration) # Attach a returns analyzers to the strategy returnsAnalyzer = returns.Returns() macdStrategy.attachAnalyzer(returnsAnalyzer) # Attach a sharpe ratio analyzers to the strategy sharpeRatioAnalyzer = sharpe.SharpeRatio() macdStrategy.attachAnalyzer(sharpeRatioAnalyzer) # Attach the plotter to the strategy plt = plotter.StrategyPlotter(macdStrategy, False, True, True) plt.getOrCreateSubplot("returns").addDataSeries( "returns", returnsAnalyzer.getReturns()) plt.getOrCreateSubplot("sharpRatio").addDataSeries( "sharpRatio", sharpeRatioAnalyzer.getReturns()) #plt.getOrCreateSubplot("Macd").addDataSeries("dif", strategys[code].getDif()) #plt.getOrCreateSubplot("Macd").addDataSeries("dea", strategys[code].getDea()) # Run Strategy macdStrategy.run() macdStrategy.info("Final portfolio value: $%.2f" % macdStrategy.getResult()) plt.plot()
def main(plot): instrument = "000300.ss" feed = yahoofinance.build_feed([instrument], 2013, 2015, ".") period = 100 strat = HurstBasedStrategy(feed, instrument, period) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) # Attach a returns analyzers to the strategy. returnsAnalyzer = returns.Returns() strat.attachAnalyzer(returnsAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, True, False, True) plt.getOrCreateSubplot("hurst").addDataSeries("Hurst", strat.getHurst()) plt.getOrCreateSubplot("hurst").addLine("random", 0.5) # Plot the simple returns on each bar. # plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns()) strat.run() strat.info("Final portfolio value: $%.2f" % strat.getResult()) # print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05) if plot: plt.plot()
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.TestStrategy(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 __init__(self, feed, brk, instrument): super(LiveStrategy, self).__init__(feed, brk) brk.addBitmexFeed(feed) feed.getNewValuesEvent().subscribe(self.__onBarsImpl) self.initial_capital = self.getResult() brk.setStrategy(self) self.positions = {} for symbol in instrument: self.positions[symbol] = brk.get_synced_position(self, symbol) retAnalyzer = returns.Returns() self.attachAnalyzerEx(retAnalyzer, 'retAnalyzer') sharpeRatioAnalyzer = sharpe.SharpeRatio() self.attachAnalyzerEx(sharpeRatioAnalyzer, 'sharpeRatioAnalyzer') drawDownAnalyzer = drawdown.DrawDown() self.attachAnalyzerEx(drawDownAnalyzer, 'drawDownAnalyzer') tradesAnalyzer = trades.Trades() self.attachAnalyzerEx(tradesAnalyzer, 'tradesAnalyzer') self.plt = plotter.StrategyPlotter(self) self.plt.getOrCreateSubplot("returns").addDataSeries( "Net return", retAnalyzer.getReturns()) self.plt.getOrCreateSubplot("returns").addDataSeries( "Cum. return", retAnalyzer.getCumulativeReturns()) self.strategy_id = brk.getStrategyId() if not os.path.exists(self.strategy_id + '.csv'): with open(self.strategy_id + '.csv', 'w') as f: f.write('Date,Type,Signal,Symbol,Price,Shares,PnL,Cash\n') if not os.path.exists(self.strategy_id + '_orders.csv'): with open(self.strategy_id + '_orders.csv', 'w') as f: f.write( 'Date,OrderDate,OrderId,Type,Signal,Symbol,Price,Size,Filled,Timedelta,StopHit\n' )
def __init__(self, strategy, index_code=None): """ :param strategy: 策略 :param index_code: index基准利率代码应该同tushare保持一致 sh 上证指数 sz 深圳成指 hs300 沪深300指数 sz50 上证50指数 zxb 中小板指数 cyb 创业板指数 :return: """ self.__baseRet_code = index_code self.__baseRet_data = None self.__currBaseRet = [] self.__last_baseRet = 0.0 self.__baseRet = dataseries.SequenceDataSeries() self.__betaRet = dataseries.SequenceDataSeries() self.__alphaRet = dataseries.SequenceDataSeries() self.__sharpeRet = dataseries.SequenceDataSeries() self.__LongestDrawDown = dataseries.SequenceDataSeries() self.__MaxDrawDown = dataseries.SequenceDataSeries() self.__ret_analyzer = returns.Returns() self.__sharpe_ratio = sharpe.SharpeRatio(False) self.__draw_down = drawdown.DrawDown() self.__beta = Beta() strategy.attachAnalyzer(self.__ret_analyzer) strategy.attachAnalyzer(self.__sharpe_ratio) strategy.attachAnalyzer(self.__draw_down) strategy.attachAnalyzer(self.__beta) strategy.attachAnalyzer(self)
def __init__(self, feed, instrument): super(SimpleBacktestStrategy, self).__init__(feed) self.initial_capital = self.getResult() self.positions = {} for symbol in instrument: self.positions[symbol] = {} retAnalyzer = returns.Returns() self.attachAnalyzerEx(retAnalyzer, 'retAnalyzer') sharpeRatioAnalyzer = sharpe.SharpeRatio() self.attachAnalyzerEx(sharpeRatioAnalyzer, 'sharpeRatioAnalyzer') drawDownAnalyzer = drawdown.DrawDown() self.attachAnalyzerEx(drawDownAnalyzer, 'drawDownAnalyzer') tradesAnalyzer = trades.Trades() self.attachAnalyzerEx(tradesAnalyzer, 'tradesAnalyzer') self.plt = plotter.StrategyPlotter(self) self.plt.getOrCreateSubplot("returns").addDataSeries( "Net return", retAnalyzer.getReturns()) self.plt.getOrCreateSubplot("returns").addDataSeries( "Cum. return", retAnalyzer.getCumulativeReturns()) self.strategy_id = 'backtest' if not os.path.exists(self.strategy_id + '.csv'): with open(self.strategy_id + '.csv', 'w') as f: f.write('Date,Type,Signal,Symbol,Price,Shares,PnL,Cash\n')
def run_strategy(smaPeriod): # Load the bar feed from the CSV file feed = quandlfeed.Feed() feed.addBarsFromCSV( "orcl", "D:/Develop/project/python/PycharmProjects/python3/pyalgotrade/samples/data/WIKI-ORCL-2011-quandl.csv" ) # Evaluate the strategy with the feed's bars myStratege = MyStrategy(feed, "orcl", smaPeriod) # Attach a returns analyzer to to strategy returnsAnalyzer = returns.Returns() myStratege.attachAnalyzer(returnsAnalyzer) # Attach the plotter to the strategy plt = plotter.StrategyPlotter(myStratege) # Include the SMA in the instrument's subplot to get it displayed along with the closing prices plt.getInstrumentSubplot("orcl").addDataSeries("SMA", myStratege.getSMA()) # Plot the simple returns on each bar #plt.getOrCreateSubplot("returns").addDataSeries("Simple Returns", returnsAnalyzer.getReturns()) myStratege.run() myStratege.info("Final portfolio value: $%.2f" % myStratege.getBroker().getEquity()) # Plot the strategy plt.plot()
def turtle_test(loadtype='pgs', dataString='pyalg'): """ :param dataString: :return: """ # 从postgres 中加载 if loadtype == 'pgs': from api.stock.histmd import to_postgres_md as tpd dat = tpd.get_h_data('600848') else: from api.stock.histmd.to_mongodb_md import k_data_dao as tmd w = tmd.KdataDbCache() dat = w.get_k_data(index=False,start='2015-02-05', end='2015-02-19',code='300426') feed = dataFramefeed.Feed() feed.addBarsFromDataFrame("orcl", dat) myStrategy = pdr.turtle(feed, "orcl", 20, 10) # Attach a returns analyzers to the strategy. returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) # Attach the plotter to the strategy. plt = plotter.StrategyPlotter(myStrategy) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns()) if dataString == 'pyalg_util': ds = pyalg_utils.dataSet(myStrategy) # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项 myStrategy.run() myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult()) if dataString == 'pyalg_util': rs = ds.getDefault() # 获取默认的交易信息,dic格式 plot(rs["cumulativeReturns"][:, 0], rs["cumulativeReturns"][:, 1]) # 简单作图示例 plt.plot()
def testOneBarReturn(self): initialCash = 1000 barFeed = yahoofeed.Feed() barFeed.setBarFilter( csvfeed.DateRangeFilter( strategy_test.datetime_from_date(2001, 12, 07), strategy_test.datetime_from_date(2001, 12, 07))) barFeed.addBarsFromCSV( ReturnsTestCase.TestInstrument, common.get_data_file_path("orcl-2001-yahoofinance.csv")) strat = strategy_test.TestStrategy(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, ReturnsTestCase.TestInstrument, 1, False) # Open: 15.74 strat.getBroker().placeOrder(order) order = strat.getBroker().createMarketOrder( broker.Order.Action.SELL, ReturnsTestCase.TestInstrument, 1, True) # Close: 15.91 strat.getBroker().placeOrder(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 run_strategy(smaPeriod): # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("zggf", "E:/PythonData/CSV/000938.csv") # Evaluate the strategy with the feed. myStrategy = MyStrategy(feed, "zggf", smaPeriod) returnsAnalyzer=returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() myStrategy.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) myStrategy.run() print(myStrategy.getResult()) print("Final portfolio value: $%.2f" % myStrategy.getResult()) print("Cumulative returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100)) print(returnsAnalyzer.getCumulativeReturns()) print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05))) print("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100)) print("Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration())) print() print("Total trades: %d" % (tradesAnalyzer.getCount()))
def main(plot): initialCash = 10000 instrumentsByClass = { "US Stocks": ["VTI"], "Foreign Stocks": ["VEU"], "US 10 Year Government Bonds": ["IEF"], "Real Estate": ["VNQ"], "Commodities": ["DBC"], } # Download the bars. instruments = ["SPY"] for assetClass in instrumentsByClass: instruments.extend(instrumentsByClass[assetClass]) feed = yahoofinance.build_feed(instruments, 2007, 2013, "data", skipErrors=True) strat = MarketTiming(feed, instrumentsByClass, initialCash) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) returnsAnalyzer = returns.Returns() strat.attachAnalyzer(returnsAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, False, False, True) plt.getOrCreateSubplot("cash").addCallback("Cash", lambda x: strat.getBroker().getCash()) # Plot strategy vs. SPY cumulative returns. plt.getOrCreateSubplot("returns").addDataSeries("SPY", cumret.CumulativeReturn(feed["SPY"].getPriceDataSeries())) plt.getOrCreateSubplot("returns").addDataSeries("Strategy", returnsAnalyzer.getCumulativeReturns()) strat.run() print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05) print "Returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100) if plot: plt.plot()
def main(): feed = csvfeed.GenericBarFeed(frequency=Frequency.MINUTE) feed.addBarsFromCSV("ETH", "sampledata.csv") # Evaluate the strategy with the feed's bars. myStrategy = Accumulator(feed, "ETH", buy_offset=0.0017, buy_percent=0.49) # myStrategy.run() returnsAnalyzer = returns.Returns() myStrategy.attachAnalyzer(returnsAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) plt = plotter.StrategyPlotter(myStrategy) # Include the SMA in the instrument's subplot to get it displayed along with the closing prices. plt.getInstrumentSubplot("ETH").addDataSeries("SMA", myStrategy.getSMA()) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries( "Simple returns", returnsAnalyzer.getReturns()) # Run the strategy. myStrategy.run() myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult()) # Plot the strategy. plt.plot() print("Final portfolio value: $%.2f" % myStrategy.getResult())