pythonpyalgotrade

python adding multiple items in variable


I'm trying to add the multiple stock quotes (e.g.APPL,TSLA, AMZN ) in the instrument variable so that metaplotlib can generate bollinger band graph for multiple stock quotes.For now it just shows the graph for one stock.

I tried using the instrument as dictionary and then tried using the if loop but it didn't worked. Please advise if i have to implement it different way or any other simple way to implement it.

from pyalgotrade import strategy
from pyalgotrade import plotter
from pyalgotrade.tools import yahoofinance
from pyalgotrade.technical import bollinger
from pyalgotrade.stratanalyzer import sharpe


class BBands(strategy.BacktestingStrategy):
def __init__(self, feed, instrument, bBandsPeriod):
    strategy.BacktestingStrategy.__init__(self, feed)
    self.__instrument = instrument
    self.__bbands = bollinger.BollingerBands(feed[instrument].getCloseDataSeries(), bBandsPeriod, 2)

def getBollingerBands(self):
    return self.__bbands

def onBars(self, bars):
    lower = self.__bbands.getLowerBand()[-1]
    upper = self.__bbands.getUpperBand()[-1]
    if lower is None:
        return

    shares = self.getBroker().getShares(self.__instrument)
    bar = bars[self.__instrument]
    if shares == 0 and bar.getClose() < lower:
        sharesToBuy = int(self.getBroker().getCash(False) / bar.getClose())
        self.marketOrder(self.__instrument, sharesToBuy)
    elif shares > 0 and bar.getClose() > upper:
        self.marketOrder(self.__instrument, -1*shares)


def main(plot):
instrument = "AAPL"
bBandsPeriod = 40

# Download the bars.
feed = yahoofinance.build_feed([instrument], 2015, 2016, ".")

strat = BBands(feed, instrument, bBandsPeriod)
sharpeRatioAnalyzer = sharpe.SharpeRatio()
strat.attachAnalyzer(sharpeRatioAnalyzer)

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()


if __name__ == "__main__":
main(True)

Solution

  • This should help:

    from pyalgotrade import strategy
    from pyalgotrade import plotter
    from pyalgotrade.tools import yahoofinance
    from pyalgotrade.technical import bollinger
    from pyalgotrade.stratanalyzer import sharpe
    
    
    class BBands(strategy.BacktestingStrategy):
        def __init__(self, feed, instruments, bBandsPeriod):
            strategy.BacktestingStrategy.__init__(self, feed)
            self.__instruments = instruments
    
            self.__bbands = {}
            for instrument in instruments:
                self.__bbands[instrument] = bollinger.BollingerBands(feed[instrument].getCloseDataSeries(), bBandsPeriod, 2)
    
        def getBollingerBands(self):
            return self.__bbands
    
        def onBarsPerInstrument(self, instrument, bars):
            bbands = self.__bbands[instrument]
            lower = bbands.getLowerBand()[-1]
            upper = bbands.getUpperBand()[-1]
            if lower is None:
                return
    
            shares = self.getBroker().getShares(instrument)
            bar = bars[instrument]
            if shares == 0 and bar.getClose() < lower:
                sharesToBuy = int(self.getBroker().getCash(False) / bar.getClose())
                self.marketOrder(instrument, sharesToBuy)
            elif shares > 0 and bar.getClose() > upper:
                self.marketOrder(instrument, -1*shares)
    
        def onBars(self, bars):
            for instrument in self.__instruments:
                self.onBarsPerInstrument(instrument, bars)
    
    
    def main(plot):
        instruments = ["AAPL", "ORCL"]
        bBandsPeriod = 40
    
        # Download the bars.
        feed = yahoofinance.build_feed(instruments, 2015, 2016, ".")
    
        strat = BBands(feed, instruments, bBandsPeriod)
        sharpeRatioAnalyzer = sharpe.SharpeRatio()
        strat.attachAnalyzer(sharpeRatioAnalyzer)
    
        if plot:
            plt = plotter.StrategyPlotter(strat, True, True, True)
            for instrument in instruments:
                bbands = strat.getBollingerBands()[instrument]
                plt.getInstrumentSubplot(instrument).addDataSeries("upper", bbands.getUpperBand())
                plt.getInstrumentSubplot(instrument).addDataSeries("middle", bbands.getMiddleBand())
                plt.getInstrumentSubplot(instrument).addDataSeries("lower", bbands.getLowerBand())
    
        strat.run()
        print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)
    
        if plot:
            plt.plot()
    
    
    if __name__ == "__main__":
        main(True)