簡體   English   中英

如何根據其他數據框的開始和結束信號創建熊貓數據框?

[英]How do I create pandas DataFrame based off start and end signals from other DataFrames?

因此,從本質上講,我如何獲取A(進入信號)和B(退出信號)並制作C(交易信號)

注意,A是進入信號,而B是退出信號。 所以:

A    B    C
0    1    0 (no entry signal yet, so 0)
1    0    1 (got entry signal and haven't gotten exit signal yet, so 1)
0    0    1 (got entry signal and haven't gotten exit signal yet, so 1)
0    1    1 (got exit signal and currently in position, so change from 1 to 0)
0    0    0 (nothing, so stay at 0)
1    0    1 (got entry signal and haven't gotten exit signal yet, so 1)
0    1    1 (got exit signal and currently in position, so change from 1 to 0)
0    1    0 (got exit signal, but already at 0, so do nothing)
1    0    1 (got entry signal and haven't gotten exit signal yet, so 1)
0    0    1 (nothing, so stay at 0)

因此,基本上,A中的1充當將C“打開”的信號,B中的1充當將C“關閉”的信號。 如果C已經打開(C的先前元素為1),則A中的1不會執行任何操作,因為C已經打開。 同樣,如果C已經關閉(C的先前元素為0),則B中的1不會執行任何操作,因為C已經關閉。 基本上,A有一個進入交易的信號列表,而B有一個何時退出的信號列表,但是您只有在不參與交易的情況下才能進入,而只有在您處於交易狀態時才可以退出。交易,因此C是您是否從事交易的清單。

我嘗試實現您的解決方案,如下所示:

def generate_signals(self):
      signals = pandas.DataFrame(index=self.data.index)
      signals['Date'] = self.data['Date']
      signals['Close'] = self.data['Close']
      signals['fast_MA'] = pandas.stats.moments.ewma(self.data['Close'],
                                                     span=self.short_window)
      signals['slow_MA'] = pandas.stats.moments.ewma(self.data['Close'],
                                                     span=self.long_window)
      signalinfo = pandas.DataFrame(index=signals.index)
      signalinfo['entry_signals'] = numpy.where(signals['fast_MA'] >
                                                signals['slow_MA'], 1.0, 0.0)
      signals['stop'] = (data['Open'].shift(-1)
                         [(signalinfo['entry_signals'] == 1.0)
                          & (signalinfo['entry_signals']
                             .shift(1) == 0.0)])
      signals['stop'] = signals['stop'].fillna(0.0)
      signals['stop'] = signals['stop'].apply(lambda x: .97 * x)
      signals['stop'] = (signals['stop']
                         .replace(to_replace=0.0, method='ffill'))
      signalinfo['exit_signals'] = numpy.where(signals['Close'] <=
                                               signals['stop'], 1.0, 0.0)

      #process entry and exit signals to form trade signals
      signalinfo['Close'] = self.data['Close']
      mask = signalinfo.copy().astype(bool)
      signalinfo.entry_signals[mask.entry_signals] = signalinfo.index
      signalinfo.exit_signals[mask.exit_signals] = signalinfo.index
      signalinfo = signalinfo[mask].ffill().fillna(0)
      signalinfo['signal'] = (signalinfo['exit_signals']
                              < signalinfo['entry_signals']).astype(int)
      signalinfo['entry_signals'] = numpy.where(signals['fast_MA'] >
                                                signals['slow_MA'], 1.0, 0.0)
      signalinfo['exit_signals'] = numpy.where(signals['Close'] <=
                                               signals['stop'], 1.0, 0.0)
      signals['signal'][:self.long_window] = 0.0
      print signalinfo.head(50)
      print signalinfo.tail(50)
      return signals

這將獲得以下代碼:ABC 0 1 0(尚無進入信號,所以0)1 0 1(獲得了進入信號,但還沒有得到退出信號,所以1)0 0 1(得到了進入信號,而還沒有' t還沒有獲得退出信號,所以1)0 1 0((應該是1)已經獲得退出信號並且當前就位,所以從1變為0)0 0 0(什么都沒有,所以保持在0)1 0 1(得到進入信號且尚未獲得退出信號,因此1)0 1 0(((SHOULD BE 1)已獲得退出信號且當前處於位置,因此從1變為0)0 1 0(獲得退出信號,但已經為0,所以什么也不做)1 0 1(得到進入信號,還沒有得到退出信號,所以1)0 0 1(什么都沒有,所以保持為0)

有想法該怎么解決這個嗎? 我試圖在您的解決方案中使用ffill方法,但出現值錯誤。

我沒有測試以下代碼,但是它可以在示例中得到您想要的,您可以使用更多數據進行測試嗎?

基本思想是用索引值在A和B中的每1填充一次,然后我們可以比較哪個大,大的是活動的一個:

import pandas as pd
import numpy as np
df = pd.read_csv("signal.csv", delim_whitespace=True)

mask = df.copy().astype(bool)
df.A[mask.A] = df.index
df.B[mask.B] = df.index
df = df[mask].ffill()
C = df.B < df.A
C.where(C).ffill(limit=1).fillna(0)

輸出:

0    0
1    1
2    1
3    1
4    0
5    1
6    1
7    0
8    1
9    1
dtype: float64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM