2017-04-08 156 views
-1

試圖回溯測試交易邏輯的樂趣,但我似乎理解如何利用numpy做出決定。例如,我想根據數據是低於還是高於上下行來設置df ['position'] = 1或-1。如果數據< =下行我想設置位置= 1,並保持它在1,直到數據它是> =上線。一旦數據> =上線我想設置位置= -1並保持在-1然後重複。熊貓DataFrame邏輯 - 蟒蛇

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

data = np.random.standard_normal((5, 100)).flatten() 
data = data.cumsum() 

df = pd.DataFrame({'Data': data}) 
df['std'] = df['Data'].rolling(50).std() 
df['SMA'] = df['Data'].rolling(50).mean() 
df['upper'] = df['SMA'] + (2 * df['std']) 
df['lower'] = df['SMA'] - (2 * df['std']) 

df[['Data', 'SMA', 'upper', 'lower']].plot(figsize=(10, 6)) 

df['position'] = 0 
plt.show() 

enter image description here

在這裏,我試圖做到這一點,但失敗了,因爲我不知道如何正確地做到這一點。

df['islower'] = np.where(df['Data'] < df['lower'], 1, 0) 
df['isupper'] = np.where(df['Data'] > df['upper'], 1, 0) 
df['position'] = np.where(df['isupper']==1, -1, 0) | np.where(df['islower']==1, 1, 0) 
+0

你什麼意思,你失敗了呢?你得到的錯誤是什麼?或者你想顯示出來的數據? – splinter

+0

如果df ['Data'] 我不知道如何設置df ['position'] = 1 DF [ '上']。我可以用沒有熊貓的狀態邏輯來做到這一點,但目標是用數據框做到這一點。 – BillyRay

+0

不是你要找的東西的答案嗎?如果沒有,我建議你展示你想得到的輸出與你實際得到的輸出 – splinter

回答

1

我想你想要做的是:

df['islower'] = df['islower'].where(df['Data'] < df['lower'], 1, 0)  
df['isupper'] = df['isupper'].where(df['Data'] < df['upper'], 1, 0)  
+0

是的,這表明如何正確判斷數據是低於還是高於線條,但如果我們觸摸底部/頂部線條,如何設置位置= 1或-1? – BillyRay

+0

是不是你在找什麼? – splinter

+0

我想弄清楚如何設置df ['position'] = np.where(df ['isupper'] == 1,-1,0)| np.where(df ['islower'] == 1,1,0)如果你使用df [['position']]。plot(figsize =(10,6)),我使用的代碼是不正確的,結果 – BillyRay