如何解决回顾数据框,查找一列中高于/低于另一列中当前值的值
我正在尝试编写一个交易机器人,并尝试根据之前的摆动低点和高点设置止损和止盈。我有以下数据框
Open High Low Close Volume Trades Min Max VWAP EMA_600 VwapTrendUp VwapTrendDown OpenShort OpenLong
Timestamp
2020-11-29 18:00:00-05:00 283.29 287.50 283.29 287.45 76.338614 70 281.93 287.50 282.183872 284.210156 True False False False
2020-11-29 18:15:00-05:00 286.64 286.66 285.14 286.05 48.799214 27 281.93 287.50 282.232962 284.216278 True False False False
2020-11-29 18:30:00-05:00 285.52 285.82 284.70 284.72 44.366408 16 281.93 287.50 282.266306 284.217954 True False False False
2020-11-29 18:45:00-05:00 284.71 286.07 284.57 285.60 390.050226 79 284.57 287.50 282.560092 284.222554 True False False False
2020-11-29 19:00:00-05:00 285.75 289.50 285.75 289.50 77.225133 58 284.57 287.50 282.663349 284.240116 True False False False
2020-11-29 19:15:00-05:00 289.61 291.81 289.01 291.56 169.436983 80 284.57 287.50 282.974661 284.264475 True False False False
2020-11-29 19:30:00-05:00 291.85 292.82 290.33 292.62 357.960693 88 284.57 287.50 283.644405 284.292280 True False False False
2020-11-29 19:45:00-05:00 292.50 294.33 292.11 292.15 43.250408 69 284.57 294.33 283.727023 284.318429 True False False False
2020-11-29 20:00:00-05:00 292.48 292.48 290.04 291.28 52.299384 20 284.57 294.33 283.807853 284.341596 True False False False
2020-11-29 20:15:00-05:00 291.46 291.72 289.23 289.55 223.041567 49 289.23 294.33 284.085869 284.358928 True False False False
2020-11-29 20:30:00-05:00 289.60 290.25 289.30 290.25 32.790511 15 289.23 294.33 284.123215 284.378532 True False False False
2020-11-29 20:45:00-05:00 290.26 291.23 290.26 290.87 17.711708 33 289.23 291.23 284.146123 284.400135 True False False False
2020-11-29 21:00:00-05:00 290.18 290.20 289.75 290.09 40.777724 8 289.75 291.23 284.192197 284.419069 True False False False
2020-11-29 21:15:00-05:00 289.79 289.79 289.79 289.79 0.303000 1 289.75 291.23 284.192524 284.436943 True False False False
2020-11-29 21:30:00-05:00 289.94 291.16 289.94 291.16 98.381950 36 289.75 291.23 284.314508 284.459315 True False False False
2020-11-29 21:45:00-05:00 291.25 294.90 291.25 294.90 124.179671 95 289.75 291.23 284.529336 284.494060 True False False False
2020-11-29 22:00:00-05:00 295.00 296.77 290.97 292.89 289.358902 88 290.97 296.77 284.986534 284.522000 True False False False
2020-11-29 22:15:00-05:00 293.13 294.54 293.10 294.46 79.519785 35 290.97 296.77 285.110902 284.555071 True False False False
2020-11-29 22:30:00-05:00 294.38 294.38 293.19 293.19 46.146495 11 290.97 296.77 285.177983 284.583806 True False False False
2020-11-29 22:45:00-05:00 293.03 293.67 292.50 292.95 34.369960 27 290.97 296.77 285.224056 284.611647 True False False False
2020-11-29 23:00:00-05:00 293.35 293.50 291.40 291.40 29.226389 18 290.97 296.77 285.258151 284.634238 True False False False
2020-11-29 23:15:00-05:00 291.44 291.47 291.06 291.06 10.104786 6 290.97 296.77 285.268314 284.655621 True False False False
2020-11-29 23:30:00-05:00 290.87 291.84 290.87 291.84 71.957052 34 290.97 296.77 285.343547 284.679529 True False False False
2020-11-29 23:45:00-05:00 291.65 292.09 290.00 290.78 37.914162 32 290.00 296.77 285.378933 284.699830 True False False False
2020-11-30 00:00:00-05:00 290.79 292.34 290.79 292.34 8.559415 42 290.00 296.77 291.823333 284.725255 True False False False
2020-11-30 00:15:00-05:00 292.45 292.99 292.21 292.99 17.629037 31 290.00 296.77 292.433666 284.752758 True False False False
2020-11-30 00:30:00-05:00 292.99 292.99 290.80 290.80 23.787975 9 290.00 296.77 292.003535 284.772882 True False False False
2020-11-30 00:45:00-05:00 290.58 290.58 289.53 289.59 11.611899 13 290.00 296.77 291.606934 284.788913 True False False False
2020-11-30 01:00:00-05:00 289.54 289.65 289.40 289.65 58.430167 13 290.00 296.77 290.613644 284.805089 True False False False
2020-11-30 01:15:00-05:00 289.82 289.82 288.21 288.21 147.574652 47 290.00 289.82 289.584027 284.816420 True False False False
2020-11-30 01:30:00-05:00 288.21 288.54 287.66 288.54 61.415923 51 287.66 289.82 289.334382 284.828812 True False False True
2020-11-30 01:45:00-05:00 288.55 289.75 288.55 289.67 132.261154 35 287.66 289.82 289.331214 284.844922 True False False False
2020-11-30 02:00:00-05:00 288.45 290.96 288.40 290.96 28.143369 51 288.40 289.82 289.375806 284.865272 False True False False
2020-11-30 02:15:00-05:00 291.22 291.53 290.30 290.30 15.216179 26 288.40 291.53 289.416036 284.883357 False True False False
2020-11-30 02:30:00-05:00 290.48 290.53 289.29 289.29 41.887926 12 288.40 291.53 289.438056 284.898022 False True False False
2020-11-30 02:45:00-05:00 289.03 289.26 288.90 289.16 5.086020 6 288.40 291.53 289.435001 284.912205 False True False False
2020-11-30 03:00:00-05:00 288.51 288.51 283.21 284.80 494.439137 90 283.21 291.53 287.578172 284.911831 False True False False
2020-11-30 03:15:00-05:00 284.77 285.56 283.60 283.60 56.234790 25 283.21 291.53 287.408549 284.907466 False True False False
2020-11-30 03:30:00-05:00 284.00 285.80 284.00 285.55 9.857230 31 283.21 285.80 287.388236 284.909604 False True False False
Min
和 Max
列是前一行峰值的值。我正在重新测试数据并使用以下样式进行处理(我不记得它的名字了)。
result = [
openPosition(
timestamp,open,close,high,low,swingLow,swingHigh
) for timestamp,swingHigh in zip(
df.index,df["Open"],df["Close"],df["High"],df["Low"],df["Min"].shift(),df["Max"].shift()
)
]
因此,在我要开多头头寸的情况下,我想将止损设在之前的摆动低点。但是,在某些情况下,先前的摆动低点实际上高于我当前的入场位置,即 df["Close"]
。
如何从循环中的“当前位置”向后搜索并找到df["Min"]
中小于当前df["Close"]
的值
例如,在 2020-11-30 01:30:00-05:00
上有开多头头寸的信号。 Close
价格为 288.54
,之前的摆动低点 df["Min"].shift()
为 290.00
。使用该摆动低值作为空头止损没有意义,因为它实际上高于 Close
,我将使用该价格开仓。因此,我需要进一步搜索最小值以找到低于我当前 Close
价格的价格。第一个实例是 2020-11-29 18:45:00-05:00
,其中 df["Low"]
是 284.57
,df["Min"]
设置为 284.57
是因为它是一个低峰值。
因此,在执行上述循环时,我希望能够根据 df["Close"]
检查 df["Min"]
,但继续返回,直到找到低于 df["Close"]
的值。
这是一张有助于形象化的图像:
解决方法
这回答了关于语句“检查 df["Close"]
与 df["Min"]
但继续返回直到我找到低于 df["Close"]
的值”的逻辑。
sampleData = (api.get_barset('AAPL',timeframe='15Min').df)['AAPL'] #Resembles your dataframe. Just replace this with your data
buyClose = sampleData['close'][-1] #Any close/min price you want to find a value LOWER THAN this
pastCloseIndex = None #Index within the dataframe it's lower
#Starting from the back of the list
for i in reversed(range(len(sampleData))):
if(buyClose > sampleData['close'][i]): #If your close/min price is higher (the random price in the df is lower)
pastCloseIndex = i #Finds how far it went back
break
print(sampleData['close'][pastCloseIndex])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。