[英]How to create new dataframe with pandas based on columns of other dataframes
[英]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.