Добавление нескольких элементов в переменную python
Я пытаюсь добавить несколько котировок акций (например, APPL,TSLA, AMZN) в переменную инструмента, чтобы metaplotlib мог генерировать график полос Боллинджера для нескольких котировок акций. На данный момент он просто показывает график для одной акции.
Я попытался использовать инструмент в качестве словаря, а затем попытался использовать цикл 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)
1 ответ
Решение
Это должно помочь:
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)