def reporting(myStrtegy, plot): print "Final portfolio value: $%.2f" % myStrategy.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()) print print "Total trades: %d" % (tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getAllReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Profitable trades: %d" % (tradesAnalyzer.getProfitableCount()) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getPositiveReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Unprofitable trades: %d" % (tradesAnalyzer.getUnprofitableCount()) if tradesAnalyzer.getUnprofitableCount() > 0: losses = tradesAnalyzer.getLosses() print "Avg. loss: $%2.f" % (losses.mean()) print "Losses std. dev.: $%2.f" % (losses.std()) print "Max. loss: $%2.f" % (losses.min()) print "Min. loss: $%2.f" % (losses.max()) returns = tradesAnalyzer.getNegativeReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) if plot: plt.plot()
def detail(self): """""" print "-------------------------------------------------------------------------" print "Final portfolio value: $%.2f" % self.strat.getResult() print "Cumulative returns: %.2f %%" % (self.returnsAnalyzer.getCumulativeReturns()[-1] * 100) print "Sharpe ratio: %.2f" % (self.sharpeRatioAnalyzer.getSharpeRatio(0.05)) print "Max. drawdown: %.2f %%" % (self.drawdownAnalyzer.getMaxDrawDown() * 100) print "Longest drawdown duration: (%s)" % (self.drawdownAnalyzer.getLongestDrawDownDuration()) print print "Total trades: %d" % (self.tradesAnalyzer.getCount()) if self.tradesAnalyzer.getCount() > 0: profits = self.tradesAnalyzer.getAll() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = self.tradesAnalyzer.getAllReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Profitable trades: %d" % (self.tradesAnalyzer.getProfitableCount()) if self.tradesAnalyzer.getProfitableCount() > 0: profits = self.tradesAnalyzer.getProfits() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = self.tradesAnalyzer.getPositiveReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Unprofitable trades: %d" % (self.tradesAnalyzer.getUnprofitableCount()) if self.tradesAnalyzer.getUnprofitableCount() > 0: losses = self.tradesAnalyzer.getLosses() print "Avg. loss: $%2.f" % (losses.mean()) print "Losses std. dev.: $%2.f" % (losses.std()) print "Max. loss: $%2.f" % (losses.min()) print "Min. loss: $%2.f" % (losses.max()) returns = self.tradesAnalyzer.getNegativeReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print "-------------------------------------------------------------------------"
def analyzer(testResult): # 回测信息 print("年化收益率: %.2f %%" % (testResult[0].getCumulativeReturns()[-1] * 100)) print("夏普比率: %.2f" % (testResult[1].getSharpeRatio(0.05))) print("最大回撤: %.2f %%" % (testResult[2].getMaxDrawDown() * 100)) print("最大回撤期间: %s" % (testResult[2].getLongestDrawDownDuration())) # 交易信息 td = testResult[3] print("-----------------------") print("总交易次数:%d" % (td.getCount())) if td.getCount() > 0: profits = td.getAll() print("平均收益:%.2f" % (profits.mean())) print("收益标准差:%.2f" % (profits.std())) print("最大收益:%.2f" % (profits.max())) print("最小收益:%.2f" % (profits.min())) returns = td.getAllReturns() print("平均收益率:%.2f%%" % (returns.mean() * 100)) print("收益率标准差:%.2f%%" % (returns.std() * 100)) print("最大收益率:%.2f%%" % (returns.max() * 100)) print("最小收益率:%.2f%%" % (returns.min() * 100)) print("-----------------------") print("盈利的交易次数: %d" % (td.getProfitableCount())) if td.getProfitableCount() > 0: profits = td.getProfits() print("平均收益:%.2f" % (profits.mean())) print("收益标准差:%.2f" % (profits.std())) print("最大收益:%.2f" % (profits.max())) print("最小收益:%.2f" % (profits.min())) returns = td.getPositiveReturns() print("平均收益率:%.2f%%" % (returns.mean() * 100)) print("收益率标准差:%.2f%%" % (returns.std() * 100)) print("最大收益率:%.2f%%" % (returns.max() * 100)) print("最小收益率:%.2f%%" % (returns.min() * 100)) print("-----------------------") print("未盈利的交易次数: %d" % (td.getUnprofitableCount())) if td.getUnprofitableCount() > 0: losses = td.getLosses() print("平均收益:%.2f" % (losses.mean())) print("收益标准差:%.2f" % (losses.std())) print("最大收益:%.2f" % (losses.max())) print("最小收益:%.2f" % (losses.min())) returns = td.getNegativeReturns() print("平均收益率:%.2f%%" % (returns.mean() * 100)) print("收益率标准差:%.2f%%" % (returns.std() * 100)) print("最大收益率:%.2f%%" % (returns.max() * 100)) print("最小收益率:%.2f%%" % (returns.min() * 100))
def report_profit_return(get_count, get_profit, get_returns, ree): tmp = get_count() if 0 < tmp: profits = get_profit() # ree.append((profits.mean(),profits.std(),profits.max(),profits.min())) ree["profits_mean"] = profits.mean() ree["profits_std"] = profits.std() ree["profits_max"] = profits.max() ree["profits_min"] = profits.min() returns = get_returns() # ree.append((returns.mean() * 100, returns.std() * 100, returns.max() * 100, returns.min() * 100)) ree["returns_mean"] = returns.mean() * 100 ree["returns_std"] = returns.std() * 100 ree["returns_max"] = returns.max() * 100 ree["returns_min"] = returns.min() * 100 else: ree["profits_mean"] = NULLVALUE ree["profits_std"] = NULLVALUE ree["profits_max"] = NULLVALUE ree["profits_min"] = NULLVALUE ree["returns_mean"] = NULLVALUE ree["returns_std"] = NULLVALUE ree["returns_max"] = NULLVALUE ree["returns_min"] = NULLVALUE
def Function_form( bBandsPeriod,smaPeriod_short,smaPeriod_long, slopePeriod,plot=False): from pyalgotrade.stratanalyzer import returns from pyalgotrade.stratanalyzer import sharpe from pyalgotrade.stratanalyzer import drawdown from pyalgotrade.stratanalyzer import trades from pyalgotrade import strategy from pyalgotrade.strategy import position from pyalgotrade import plotter from pyalgotrade.tools import yahoofinance from pyalgotrade.barfeed import yahoofeed from pyalgotrade.technical import bollinger from pyalgotrade.stratanalyzer import sharpe import BBands_mod #import report import matplotlib.pyplot as plt # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "data_daily.csv") #def main(plot): instrument = "orcl" # Evaluate the strategy with the feed's bars. myStrategy = BBands_mod.BBands(feed, instrument, bBandsPeriod,smaPeriod_short,smaPeriod_long,slopePeriod) if plot: plt = plotter.StrategyPlotter(myStrategy, True, True, True) plt.getInstrumentSubplot(instrument).addDataSeries("upper", myStrategy.getBollingerBands().getUpperBand()) plt.getInstrumentSubplot(instrument).addDataSeries("middle", myStrategy.getBollingerBands().getMiddleBand()) plt.getInstrumentSubplot(instrument).addDataSeries("lower", myStrategy.getBollingerBands().getLowerBand()) # Attach different analyzers to a strategy before executing it. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() myStrategy.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) # Run the strategy. myStrategy.run() print "Final portfolio value: $%.2f" % myStrategy.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()) print print "Total trades: %d" % (tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getAllReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Profitable trades: %d" % (tradesAnalyzer.getProfitableCount()) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getPositiveReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Unprofitable trades: %d" % (tradesAnalyzer.getUnprofitableCount()) if tradesAnalyzer.getUnprofitableCount() > 0: losses = tradesAnalyzer.getLosses() print "Avg. loss: $%2.f" % (losses.mean()) print "Losses std. dev.: $%2.f" % (losses.std()) print "Max. loss: $%2.f" % (losses.min()) print "Min. loss: $%2.f" % (losses.max()) returns = tradesAnalyzer.getNegativeReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) if plot: plt.plot() return (myStrategy.getResult(),retAnalyzer.getCumulativeReturns()[-1] * 100, sharpeRatioAnalyzer.getSharpeRatio(0.05), drawDownAnalyzer.getMaxDrawDown() * 100)
(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())) print("") print("Total trades: %d" % (tradesAnalyzer.getCount())) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print("Avg. profit: $%2.f" % (profits.mean())) print("Profits std. dev.: $%2.f" % (profits.std())) print("Max. profit: $%2.f" % (profits.max())) print("Min. profit: $%2.f" % (profits.min())) returns = tradesAnalyzer.getAllReturns() print("Avg. return: %2.f %%" % (returns.mean() * 100)) print("Returns std. dev.: %2.f %%" % (returns.std() * 100)) print("Max. return: %2.f %%" % (returns.max() * 100)) print("Min. return: %2.f %%" % (returns.min() * 100)) print("") print("Profitable trades: %d" % (tradesAnalyzer.getProfitableCount())) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print("Avg. profit: $%2.f" % (profits.mean())) print("Profits std. dev.: $%2.f" % (profits.std())) print("Max. profit: $%2.f" % (profits.max())) print("Min. profit: $%2.f" % (profits.min())) returns = tradesAnalyzer.getPositiveReturns() print("Avg. return: %2.f %%" % (returns.mean() * 100)) print("Returns std. dev.: %2.f %%" % (returns.std() * 100))
myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult()) myStrategy.info("Cumulative returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100)) myStrategy.info("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05))) myStrategy.info("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100)) myStrategy.info("Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration())) print print "Total trades: %d" % (tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getAllReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Profitable trades: %d" % (tradesAnalyzer.getProfitableCount()) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getPositiveReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100)
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) # Attach different analyzers to a strategy before executing it. 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("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())) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print("Avg. profit: $%2.f" % (profits.mean())) print("Profits std. dev.: $%2.f" % (profits.std())) print("Max. profit: $%2.f" % (profits.max())) print("Min. profit: $%2.f" % (profits.min())) returns = tradesAnalyzer.getAllReturns() print("Avg. return: %2.f %%" % (returns.mean() * 100)) print("Returns std. dev.: %2.f %%" % (returns.std() * 100)) print("Max. return: %2.f %%" % (returns.max() * 100)) print("Min. return: %2.f %%" % (returns.min() * 100)) print() print("Profitable trades: %d" % (tradesAnalyzer.getProfitableCount())) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print("Avg. profit: $%2.f" % (profits.mean())) print("Profits std. dev.: $%2.f" % (profits.std())) print("Max. profit: $%2.f" % (profits.max())) print("Min. profit: $%2.f" % (profits.min())) returns = tradesAnalyzer.getPositiveReturns() print("Avg. return: %2.f %%" % (returns.mean() * 100)) print("Returns std. dev.: %2.f %%" % (returns.std() * 100)) print("Max. return: %2.f %%" % (returns.max() * 100)) print("Min. return: %2.f %%" % (returns.min() * 100)) print() print("Unprofitable trades: %d" % (tradesAnalyzer.getUnprofitableCount())) if tradesAnalyzer.getUnprofitableCount() > 0: losses = tradesAnalyzer.getLosses() print("Avg. loss: $%2.f" % (losses.mean())) print("Losses std. dev.: $%2.f" % (losses.std())) print("Max. loss: $%2.f" % (losses.min())) print("Min. loss: $%2.f" % (losses.max())) returns = tradesAnalyzer.getNegativeReturns() print("Avg. return: %2.f %%" % (returns.mean() * 100)) print("Returns std. dev.: %2.f %%" % (returns.std() * 100)) print("Max. return: %2.f %%" % (returns.max() * 100)) print("Min. return: %2.f %%" % (returns.min() * 100))
def setup_strategy(files, name, show_plot=False): #from pyalgotrade.feed import csvfeed, yahoofeed # Load the bar feed from the CSV file #feed = csvfeed.GenericBarFeed(frequency=Frequency.DAY) feed = yahoofeed.Feed(Frequency.DAY) #feed = csvfeed.Feed("Date", "%Y-%m-%d") for sym, filename in files: #print('loading', sym, filename) if 'predictions' not in filename: feed.addBarsFromCSV(sym, filename) else: feed.addBarsFromCSV('states', filename) instrument_1 = files[0][0] instrument_2 = files[1][0] instrument_3 = files[2][0] states_instrument = 'states' #print('got these instruments', instrument_1, instrument_2, instrument_3, states_instrument) #input() #print(files) # Evaluate the strategy with the feed. myStrategy = AccuracyStrat(feed, instrument_1, instrument_2, instrument_3, states_instrument) from pyalgotrade.stratanalyzer import returns # Attach different analyzers to a strategy before executing it. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() myStrategy.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) # 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("SMA", myStrategy.getSMA()) # Plot the simple returns on each bar. plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", retAnalyzer.getReturns()) # # Run the strategy. myStrategy.run() if show_plot: plt.plot() fig = matplotlib.pyplot.gcf() fig.set_size_inches(10, 5) cum_returns = retAnalyzer.getCumulativeReturns()[-1] * 100 sharpe_ratio = sharpeRatioAnalyzer.getSharpeRatio(0.05) results = {} results['final_value'] = myStrategy.getResult() results['cum_returns'] = cum_returns results['sharpe_ratio'] = sharpe_ratio if not show_plot and sharpe_ratio > 1 and cum_returns > 200: plt.savePlot('./backtest_plots/%s_%s.png' % (str(int(results['cum_returns'])), name)) del plt results['max_drawdown_%'] = drawDownAnalyzer.getMaxDrawDown() * 100 results['longest_drawdown'] = str( drawDownAnalyzer.getLongestDrawDownDuration()) results['total_trades'] = tradesAnalyzer.getCount() results['profitable_trades'] = tradesAnalyzer.getProfitableCount() try: results['win_rate'] = tradesAnalyzer.getProfitableCount( ) / tradesAnalyzer.getCount() profits = tradesAnalyzer.getAll() results['avg_profit_$'] = profits.mean() results['std_profit_$'] = profits.std() results['max_profit_$'] = profits.max() results['min_profit_$'] = profits.min() returns = tradesAnalyzer.getAllReturns() results['avg_profit_%'] = returns.mean() * 100 results['std_profit_%'] = returns.std() * 100 results['max_profit_%'] = returns.max() * 100 results['min_profit_%'] = returns.min() * 100 for sym, filename in files: os.remove(filename) except Exception as e: #print('backtest exception', e) pass results = pd.DataFrame.from_dict(results, orient='index') #print(results) return results
def rsi2Trade(plot, storage, instrument, entrySMA, exitSMA, rsiPeriod, overBoughtThreshold, overSoldThreshold): # Download the bars. feed = yahoofinance.build_feed([instrument], 2015, 2017, storage) tm_hour = int(time.strftime('%H', time.localtime())) weekdayNumber = datetime.datetime.today().weekday() if (weekdayNumber >= 0 and weekdayNumber <= 4) and (tm_hour >= 9 and tm_hour <= 23): feed.addBarsFromCSV( instrument, sinafinance.download_current_trade(instrument, storage)) strat = rsi2d.RSI2(feed, instrument, entrySMA, exitSMA, rsiPeriod, overBoughtThreshold, overSoldThreshold) 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, False, True) plt.getInstrumentSubplot(instrument).addDataSeries( "Entry SMA", strat.getEntrySMA()) plt.getInstrumentSubplot(instrument).addDataSeries( "Exit SMA", strat.getExitSMA()) plt.getOrCreateSubplot("rsi").addDataSeries("RSI", strat.getRSI()) plt.getOrCreateSubplot("rsi").addLine("Overbought", overBoughtThreshold) plt.getOrCreateSubplot("rsi").addLine("Oversold", overSoldThreshold) strat.run() print "Correct Ratio: %.2f" % ( (float(tradesAnalyzer.getProfitableCount()) / tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() else -1.0) print "Evaluation Final portfolio value: %.2f" % strat.getResult() print "Evaluation Cumulative returns: %.2f" % ( retAnalyzer.getCumulativeReturns()[-1] * 100) print "Evaluation Sharpe ratio: %.2f" % ( sharpeRatioAnalyzer.getSharpeRatio(0.05)) print "Evaluation Max. drawdown: %.2f" % ( drawDownAnalyzer.getMaxDrawDown() * 100) print "Evaluation Longest drawdown duration: %s" % ( drawDownAnalyzer.getLongestDrawDownDuration()) print print "Final trades: %d" % (tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print "Final Avg. profit: %.2f" % (profits.mean()) print "Final Profits std. dev.: %.2f" % (profits.std()) print "Final Max. profit: %.2f" % (profits.max()) print "Final Min. profit: %.2f" % (profits.min()) returns = tradesAnalyzer.getAllReturns() print "Final Avg. return: %2.f" % (returns.mean() * 100) print "Final Returns std. dev.: %2.f" % (returns.std() * 100) print "Final Max. return: %2.f" % (returns.max() * 100) print "Final Min. return: %2.f" % (returns.min() * 100) print print "Profitable trades: %d" % (tradesAnalyzer.getProfitableCount()) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print "Profitable Avg. profit: $%.2f" % (profits.mean()) print "Profitable Profits std. dev.: $%.2f" % (profits.std()) print "Profitable Max. profit: $%.2f" % (profits.max()) print "Profitable Min. profit: $%.2f" % (profits.min()) returns = tradesAnalyzer.getPositiveReturns() print "Profitable Avg. return: %2.f %%" % (returns.mean() * 100) print "Profitable Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Profitable Max. return: %2.f %%" % (returns.max() * 100) print "Profitable Min. return: %2.f %%" % (returns.min() * 100) print print "Unprofitable trades: %d" % (tradesAnalyzer.getUnprofitableCount()) if tradesAnalyzer.getUnprofitableCount() > 0: losses = tradesAnalyzer.getLosses() print "Unprofitable Avg. loss: $%.2f" % (losses.mean()) print "Unprofitable Losses std. dev.: $%.2f" % (losses.std()) print "Unprofitable Max. loss: $%.2f" % (losses.min()) print "Unprofitable Min. loss: $%.2f" % (losses.max()) returns = tradesAnalyzer.getNegativeReturns() print "Unprofitable Avg. return: %2.f %%" % (returns.mean() * 100) print "Unprofitable Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Unprofitable Max. return: %2.f %%" % (returns.max() * 100) print "Unprofitable Min. return: %2.f %%" % (returns.min() * 100) if plot: plt.plot()
def Function_form(bBandsPeriod, smaPeriod_short, smaPeriod_long, slopePeriod, plot=False): from pyalgotrade.stratanalyzer import returns from pyalgotrade.stratanalyzer import sharpe from pyalgotrade.stratanalyzer import drawdown from pyalgotrade.stratanalyzer import trades from pyalgotrade import strategy from pyalgotrade.strategy import position from pyalgotrade import plotter from pyalgotrade.tools import yahoofinance from pyalgotrade.barfeed import yahoofeed from pyalgotrade.technical import bollinger from pyalgotrade.stratanalyzer import sharpe import BBands_mod #import report import matplotlib.pyplot as plt # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "data_daily.csv") #def main(plot): instrument = "orcl" # Evaluate the strategy with the feed's bars. myStrategy = BBands_mod.BBands(feed, instrument, bBandsPeriod, smaPeriod_short, smaPeriod_long, slopePeriod) if plot: plt = plotter.StrategyPlotter(myStrategy, True, True, True) plt.getInstrumentSubplot(instrument).addDataSeries( "upper", myStrategy.getBollingerBands().getUpperBand()) plt.getInstrumentSubplot(instrument).addDataSeries( "middle", myStrategy.getBollingerBands().getMiddleBand()) plt.getInstrumentSubplot(instrument).addDataSeries( "lower", myStrategy.getBollingerBands().getLowerBand()) # Attach different analyzers to a strategy before executing it. retAnalyzer = returns.Returns() myStrategy.attachAnalyzer(retAnalyzer) sharpeRatioAnalyzer = sharpe.SharpeRatio() myStrategy.attachAnalyzer(sharpeRatioAnalyzer) drawDownAnalyzer = drawdown.DrawDown() myStrategy.attachAnalyzer(drawDownAnalyzer) tradesAnalyzer = trades.Trades() myStrategy.attachAnalyzer(tradesAnalyzer) # Run the strategy. myStrategy.run() print "Final portfolio value: $%.2f" % myStrategy.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()) print print "Total trades: %d" % (tradesAnalyzer.getCount()) if tradesAnalyzer.getCount() > 0: profits = tradesAnalyzer.getAll() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getAllReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Profitable trades: %d" % (tradesAnalyzer.getProfitableCount()) if tradesAnalyzer.getProfitableCount() > 0: profits = tradesAnalyzer.getProfits() print "Avg. profit: $%2.f" % (profits.mean()) print "Profits std. dev.: $%2.f" % (profits.std()) print "Max. profit: $%2.f" % (profits.max()) print "Min. profit: $%2.f" % (profits.min()) returns = tradesAnalyzer.getPositiveReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) print print "Unprofitable trades: %d" % (tradesAnalyzer.getUnprofitableCount()) if tradesAnalyzer.getUnprofitableCount() > 0: losses = tradesAnalyzer.getLosses() print "Avg. loss: $%2.f" % (losses.mean()) print "Losses std. dev.: $%2.f" % (losses.std()) print "Max. loss: $%2.f" % (losses.min()) print "Min. loss: $%2.f" % (losses.max()) returns = tradesAnalyzer.getNegativeReturns() print "Avg. return: %2.f %%" % (returns.mean() * 100) print "Returns std. dev.: %2.f %%" % (returns.std() * 100) print "Max. return: %2.f %%" % (returns.max() * 100) print "Min. return: %2.f %%" % (returns.min() * 100) if plot: plt.plot() return (myStrategy.getResult(), retAnalyzer.getCumulativeReturns()[-1] * 100, sharpeRatioAnalyzer.getSharpeRatio(0.05), drawDownAnalyzer.getMaxDrawDown() * 100)