回顾数据框,查找一列中高于/低于另一列中当前值的值

问题描述

我正在尝试编写一个交易机器人,并尝试根据之前的摆动低点和高点设置止损和止盈。我有以下数据框

                             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

MinMax 列是前一行峰值的值。我正在重新测试数据并使用以下样式进行处理(我不记得它的名字了)。

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.57df["Min"] 设置为 284.57 是因为它是一个低峰值。

因此,在执行上述循环时,我希望能够根据 df["Close"] 检查 df["Min"],但继续返回,直到找到低于 df["Close"] 的值。

这是一张有助于形象化的图像:

Swing Low Problem

解决方法

这回答了关于语句“检查 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])