Zipline で得た金融アイデアをバックテストしようとすると問題が発生します。
私が得たのは、最初の列のデータ ['SPY'] の SPY の終値と、「自作」のシグナル データ ['Signal'] です。信号は移動平均と同様に機能し、data['SPY'] の下または上にあります。
data = pd.read_csv('data.csv', index_col='Date', parse_dates=True)
現在、トレーディング ロジックは機能していません。正しく理解すれば、pandas は行ごとに計算を行うのではなく、データセット全体を一度に計算するからです。
def handle_data(self, data):
if data['SPY'] - data['Signal'] > 0:
self.order('SPY', 1)
else:
self.order('SPY', -1)
上記の動作しないコードは、実行したいロジックを表しています。SPY > シグナルの場合は買い、反対の場合は売りです。あらゆる種類の繰り返しを試しましたが、うまくいきません。
苦労しているアマチュアトレーダーとして助けてくれる人はいますか?
#なんとかあと一歩のところまでたどり着きました。私がする必要があったのは、データフレーム (この場合は移動平均) に「変換」を追加することでした。実際には移動平均を使用したくないので、日数を 1 に設定します。これは、事実上、元の数値を使用することを意味するはずです。
class Test(TradingAlgorithm):
def initialize(self):
self.add_transform(MovingAverage, 'dummy', ['price'], window_length=1) # The moving average that I don't really want to utilize.
self.pos_long = False
self.pos_short = False
def handle_data(self, data):
if data['SPY'].dummy['price'] >= data['Signal'].dummy['price'] and not self.pos_long:
self.order('SPY', 100)
self.pos_long = True
self.pos_short = False
elif data['SPY'].dummy['price'] <= data['Signal'].dummy['price'] and not self.pos_short:
self.order('SPY', -100)
self.pos_long = False
self.pos_short = True
上記のコードは、私が望むようにほぼ正確に機能します。唯一の癖は、何らかの理由でショート ポジションを取らないことです。しかし、それは少なくとも正しい方向への一歩であり、他の人を助けるかもしれません.
以下の 2 つのリンクは、このビットを理解するのに役立ちました。
http://zipline.readthedocs.org/en/latest/zipline.transforms.html