我使用 pyalgotrade
作为交易策略,我想在列表中使用多个代码。
现在设置它的方式,它为列表中的每个单独的自动收报机运行策略,但我希望它做的是将它们全部作为一个复合策略运行。
我该怎么做呢?
以下是代码:
from pyalgotrade.tools import yahoofinance
from pyalgotrade import strategy
from pyalgotrade.barfeed import yahoofeed
from pyalgotrade.technical import stoch
from pyalgotrade import dataseries
from pyalgotrade.technical import ma
from pyalgotrade import technical
from pyalgotrade.technical import highlow
from pyalgotrade import talibext
from pyalgotrade.talibext import indicator
import numpy as np
import talib
testlist = ['aapl', 'msft', 'z']
class MyStrategy( strategy.BacktestingStrategy ):
def __init__( self, feed, instrument ):
strategy.BacktestingStrategy.__init__( self, feed )
self.__position = []
self.__instrument = instrument
self.setUseAdjustedValues( True )
self.__prices = feed[instrument].getPriceDataSeries()
self.__stoch = stoch.StochasticOscillator( feed[instrument], 20, dSMAPeriod = 3, maxLen = 3 )
def onBars( self, bars ):
self.__PPO = talibext.indicator.PPO( self.__prices, len( self.__prices ), 12, 26, matype = 1 )
try: slope = talib.LINEARREG_SLOPE( self.__PPO, 3 )[-1]
except Exception: slope = np.nan
bar = bars[self.__instrument]
self.info( "%s,%s,%s" % ( bar.getClose(), self.__PPO[-1], slope ) )
if self.__PPO[-1] is None:
return
for inst in self.__instrument:
print inst
#INSERT STRATEGY HERE
def run_strategy():
# Load the yahoo feed from the CSV file
instruments = ['aapl', 'msft', 'z']
feed = yahoofinance.build_feed(instruments,2015,2016, ".")
# Evaluate the strategy with the feed.
myStrategy = MyStrategy(feed, instruments)
myStrategy.run()
print "Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity()
run_strategy()
答案 0 :(得分:0)
您可以将此示例用作交易多种工具的指南:http://gbeced.github.io/pyalgotrade/docs/v0.18/html/sample_statarb_erniechan.html
答案 1 :(得分:0)
feed
是pyalgotrade.feed.BaseFeed
的实例。它包含一个或多个乐器' BarDataSeries
定义了一系列价格。致电feed[instrument]
时,您会收到此工具BarDataSeries
。
您需要for loop
来处理每个单独的工具。它将使您的代码干净,以添加专用的类来处理每个仪器。查看课程InstrumentManager
。我修复了很多程序错误。
class InstrumentManager():
def __init__(self, feed, instrument):
self.instrument = instrument
self.__prices = feed[instrument].getPriceDataSeries()
self.__stoch = stoch.StochasticOscillator( feed[instrument], 20, dSMAPeriod = 3, maxLen = 3 )
self.__signal = None
def onBars(self, bars):
bar = bars.getBar(self.instrument)
if bar:
self.__PPO = talibext.indicator.PPO( self.__prices, len( self.__prices ), 12, 26, matype = 1 )
try: slope = talib.LINEARREG_SLOPE( self.__PPO, 3 )[-1]
except Exception: slope = np.nan
print( "%s,%s,%s" % ( bar.getClose(), self.__PPO[-1], slope ) )
if self.__PPO[-1] is None:
return
# set signal in some conditions. eg self.__signal = 'buy'
def signal():
return self.__signal
class MyStrategy( strategy.BacktestingStrategy ):
def __init__( self, feed, instruments ):
strategy.BacktestingStrategy.__init__( self, feed )
self.__position = []
self.__feed = feed
self.__instruments = instruments
self.setUseAdjustedValues( True )
self.instManagers = {}
self.loadInstManagers()
def loadInstManagers(self):
for i in self.__instruments:
im = InstrumentManager(self.__feed, i)
self.instManagers[i] = im
def updateInstManagers(self, bars):
for im in self.instManagers.values():
im.onBars(bars)
def onBars( self, bars ):
self.updateInstManagers(bars)
for inst in self.__instruments:
instManager = self.instManagers[inst]
print inst
# Do something by instManager.signal()