如何改善我在熊猫中的布尔值索引?

时间:2019-04-30 13:52:14

标签: python python-3.x pandas

我在用简单的熊猫算法进行股票交易。没什么严重或复杂的,我只想学习如何在python中做到这一点。

我想做的是

  • 当信号变为True时买进股票,并用现金支付(因此现金减少,股票头寸上升
  • 当信号变为假时,出售股票并将结果添加到现金中。

但是我无法使它正常工作。我可以使它与循环一起使用,但这将非常耗时。有什么建议吗?

## data set
close=[21.02,21.05,21.10,21.22, 22.17,22.13,22.07]
signal=[False,True,True,True,False,True,True]
data={'close':close, 'signal':signal}
df=pd.DataFrame.from_dict(data)
df['cash']=1000
df['trade']=0
df['pos']=0

## if signal turns True, buy stocks
buysubset = ((df.signal==True) & (df.signal.shift(1)==False))
sellsubset = ((df.signal==False) & df.signal.shift(1)==True)
df.loc[buysubset,'trade']=(df.cash/df.close).astype(int)
df.loc[buysubset,'cash']=df.cash-(df.trade*df.close)
df.loc[sellsubset,'trade']=-df.pos.shift(1)

## if previous row has position, keep the position if the signal is still True
df['pos']=df.trade.mask(df.signal & (df.trade == 0)).ffill().astype(int)

我得到这个结果:

   close  signal     cash  trade  pos
0  21.02   False  1000.00    0.0    0
1  21.05    True    10.65   47.0   47
2  21.10    True  1000.00    0.0   47
3  21.22    True  1000.00    0.0   47
4  22.17   False  1000.00   -0.0    0
5  23.34    True     4.15   45.0   45

但是想得到这个:

       close  signal     cash  trade  pos
    0  21.02   False  1000.00    0.0    0
    1  21.05    True    10.65   47.0   47
    2  21.10    True    10.65    0.0   47
    3  21.22    True    10.65    0.0   47
    4  22.17   False  1052.62  -47.0    0
    5  23.34    True     2.57   45.0   45

0 个答案:

没有答案