如何根据条件创建固定的新 numpy 数组值 - 股票价格

问题描述

input_array =
       ([[13,93,47,857],[16,91,55,800],[18,105,85,821],[17,106,89,890],[19,60,961],[20,41,988],[21,107,45,999],])

take_profit =
       ([[15,90,960]])

stop_loss =
       ([[10,92,750]])

数组中的每一列都是个股的价格,当止盈和止损之间存在价格时,交易打开,价值保持不变。如果价格高于或等于止盈,则交易状态为“TP”,当价格低于或等于 stop_loss 时,该栏其余部分的状态为“SL”。

desired_output_array = 
        ([[13,[TP,SL,TP],])

谁能帮我解决这个问题?该数组有 3000 行长。我的方法如下:

# My approach:

for value in input_array:
    if value > take_profit:
        value == "TP"
    if value < stop_loss:
        value == "SL"
    else:
        value == value

这不起作用,所以尝试了

output_array = np.where(input_array> take_profit,"TP",input_array)

这样做的问题是,输出将最初更改为“TP”,但随后会在“SL”和价格回升时之间的数字之间恢复。一旦价格改变状态,交易就会关闭,所以对于列中下降的其余值,它应该保持固定直到结束!

解决方法

让我们试试 np.select ,使用 pandasmask 传递给 fillna

cond1 = (input_array > take_profit)
cond2 = (input_array < stop_loss)
s = pd.DataFrame(np.select([cond1,cond2],['TP',"SL"],default=input_array))

out_putary = s.mask(s.isin(['TP',"SL"]).cumsum()>0).fillna(s.where(s.isin(['TP',"SL"]).cumsum()>0).bfill().iloc[0]).values


out_putary
Out[65]: 
array([['13','93','47','857'],'SL','55','800'],'85','821'],'89','890'],'60','TP'],'TP']],dtype=object)