【问题标题】:Looking back through a data frame for a value in a column which higher/lower than the current value in another column回顾数据框以查找高于/低于另一列当前值的列中的值
【发布时间】:2021-07-01 21:52:25
【问题描述】:

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

                             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, open, close, high, low, swingLow, 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"] 的值。

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

【问题讨论】:

  • 如果您简化问题并提供预期的输出数据/df,有人会提供答案。
  • @anon01 我已经更新了,现在问题清楚了吗?

标签: python pandas algorithmic-trading trading


【解决方案1】:

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


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2021-12-29
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多