0

metaplotlib が複数の株式相場のボリンジャー バンド グラフを生成できるように、インストゥルメント変数に複数の株式相場 (APPL、TSLA、AMZN など) を追加しようとしています。

インストゥルメントを辞書として使用してから、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)
4

1 に答える 1