2017-03-03 49 views
0

我試圖在儀器變量中添加多個股票報價(例如APPL,TSLA,AMZN),以便metaplotlib可以爲多個股票報價生成bollinger帶圖。現在它只顯示一隻股票的圖表。python在變量中添加多個項目

我試過使用儀器作爲字典,然後嘗試使用if循環,但它沒有奏效。請告知我是否需要採用其他方式或其他簡單的方法來實現它。

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) 

回答

2

這應有助於:

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)