使用pandas DataFrame在价格低于阈值时实施矢量化止损

时间:2018-05-12 01:18:05

标签: pandas numpy dataframe vectorization algorithmic-trading

鉴于此示例DataFrame:

date;close;signal;positions
2017-01-02;27.90;0.0;0.0
2017-01-03;27.76;0.0;0.0
2017-01-04;28.65;1.0;1.0
2017-01-05;28.72;1.0;0.0
2017-01-06;28.00;1.0;0.0
2017-01-09;27.03;1.0;0.0 # <<<--- Note the price is -5% when compared to 28.65 (in 2017-01-04)
2017-01-10;28.26;1.0;0.0
2017-01-11;28.35;0.0;-1.0 # <<-- Sell
2017-01-12;29.12;0.0;0.0
2017-01-13;28.99;0.0;0.0
2017-01-16;28.50;1.0;1.0
2017-01-17;28.45;1.0;0.0
2017-01-18;29.06;1.0;0.0
2017-01-19;28.74;0.0;-1.0
2017-01-20;28.76;0.0;0.0
2017-01-23;29.50;0.0;0.0
2017-01-24;29.12;1.0;1.0
2017-01-25;29.87;1.0;0.0
2017-01-26;27.22;1.0;0.0 # <<<--- Note the price is -5% when compared to 29.12 (in 2017-01-24)
2017-01-27;29.76;1.0;0.0 # <<-- still holding the position...

我想实施&#34;止损&#34;当价格下跌时,让我们说,5%。在这种情况下,DataFrame应如下所示:

date;close;signal;positions
2017-01-02;27.90;0.0;0.0
2017-01-03;27.76;0.0;0.0
2017-01-04;28.65;1.0;1.0 # <<-- Buy
2017-01-05;28.72;1.0;0.0
2017-01-06;28.00;1.0;0.0
2017-01-09;27.03;0.0;-1.0 # <<-- Sell with stop-loss
2017-01-10;28.26;0.0;0.0
2017-01-11;28.35;0.0;0.0
2017-01-12;29.12;0.0;0.0
2017-01-13;28.99;0.0;0.0
2017-01-16;28.50;1.0;1.0 # <<-- Buy
2017-01-17;28.45;1.0;0.0
2017-01-18;29.06;1.0;0.0
2017-01-19;28.74;0.0;-1.0 # <<-- Sell with profit
2017-01-20;28.76;0.0;0.0
2017-01-23;29.50;0.0;0.0
2017-01-24;29.12;1.0;1.0 # <<-- Buy
2017-01-25;29.87;1.0;0.0
2017-01-26;27.22;0.0;-1.0 # <<-- Sell with stop-loss
2017-01-27;29.76;0.0;0.0

(请注意2017-01-09和2017-01-26的变化)。

为了说清楚,&#34;信号&#34;列表示1.0时的保持位置。 &#34;职位&#34; column是使用df['signal'].diff()计算的,它表示当等于1.0时的买入和等于-1.0时的卖出。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

IIUC现在......

data['cor_price'] = data['close'].where((data['signal'] == 1) & (data['positions'] == 1), pd.np.nan)
data['cor_price'] = data['cor_price'].ffill().astype(data['close'].dtype)
data['diff_perc'] = (data['close'] - data['cor_price']) / data['cor_price']
data['positions2'] = np.where(data['diff_perc'] <= -0.05, 1, 0)
data

enter image description here

这可能会有所改进,但我一步一步地接受了。首先创建一个具有相应购买价格和前向填充的列。然后创建一个具有价格差异的列,最后创建位置2,显示您需要的结果。