【问题标题】:Trailing Stop Loss on Pandas dataframePandas 数据帧的追踪止损
【发布时间】:2021-05-26 00:21:57
【问题描述】:

我正在对 Pandas 数据框上的股票市场上的一些交易策略进行一些回测,并且我想设置与输入价格相差 1% 的追踪止损。如果股价上涨 5%,追踪止损也会上涨 5%。如果股价下跌,追踪止损不会改变。 (https://www.investopedia.com/terms/t/trailingstop.asp)

我有这张表,它显示了我的入场信号,如果价格低于追踪止损价格,则退出列将显示值为 1,这意味着交易已退出。

这是我目前拥有的表格:

date           price      entry_signal      
30/06/2018     95              0                
01/07/2018     100             1                
02/07/2018     103             0                
03/07/2018     105             0                
04/07/2018     104.50          0                
05/07/2018     101             0                

我希望有一列显示每个日期的追踪止损。当 enter_signal = 1 时,追踪止损首先设置为 2018 年 1 月 7 日价格的 99%,交易在该日期执行。

当价格上涨 y% 时,追踪止损也会上涨 y%。但是,如果价格下跌,追踪止损将不会改变其最后的值。

当价格

如果价格也下跌 y%,我目前无法让追踪止损下跌 y%....

期望的表格结果:

date           price      trailing stop loss      entry_signal      exit_signal
30/06/2018     95              NULL                     0                0
01/07/2018     100             99                       1                0
02/07/2018     103             101.97                   0                0
03/07/2018     105             103.95                   0                0
04/07/2018     104.50          103.95                   0                0
05/07/2018     101             103.95                   0                1

我得到的表:

date           price      trailing stop loss      entry_signal      
30/06/2018     95              NULL                     0                
01/07/2018     100             99                       1                
02/07/2018     103             101.97                   0                
03/07/2018     105             103.95                   0                
04/07/2018     104.50          103.455                  0                
05/07/2018     101             99.99                    0                

【问题讨论】:

    标签: python pandas quantitative-finance back-testing


    【解决方案1】:

    只取累计最大值的 99% 并与当前价格比较:

    df = pd.DataFrame({"price":[95,100,103,105,104.5,101]}) #create price array
    df['highest'] = df.cummax() #take the cumulative max
    df['trailingstop'] = df['highest']*0.99 #subtract 1% of the max
    df['exit_signal'] = df['price'] < df['trailingstop'] #generate exit signal
    
    
    Out[1]: 
       price  highest  trailingstop  exit_signal
    0   95.0     95.0         94.05        False
    1  100.0    100.0         99.00        False
    2  103.0    103.0        101.97        False
    3  105.0    105.0        103.95        False
    4  104.5    105.0        103.95        False
    5  101.0    105.0        103.95         True
    

    【讨论】:

    • 价格数组的累积集应该有多大?
    【解决方案2】:

    涉及cummaxpct_change+ clip_lower + cumprod 的难题

    s=df.loc[df.entry_signal.cummax().astype(bool),'price'].pct_change().add(1).fillna(1)
    
    df['trailing stop loss']=s.clip_lower(1).cumprod()*99
    df['exit_signal']=(df['trailing stop loss']>df['price']).astype(int)
    df
    Out[114]: 
             date  price  entry_signal  trailing stop loss  exit_signal
    0  30/06/2018   95.0             0                 NaN            0
    1  01/07/2018  100.0             1               99.00            0
    2  02/07/2018  103.0             0              101.97            0
    3  03/07/2018  105.0             0              103.95            0
    4  04/07/2018  104.5             0              103.95            0
    5  05/07/2018  101.0             0              103.95            1
    

    【讨论】:

    • 非常感谢,您知道如何创建exit_signal 列,以便价格第一次低于追踪止损,其他情况下显示1 和0?跨度>
    • @atjw94 据我所知,99.99 大于 99 对吧?
    • 嗨@WeNYoBen 所以就我而言,2018 年 7 月 5 日的价格为 101.0,低于 7 月 5 日的追踪止损 103.95。如何设置它,以便第一次发生这种情况时,exit_signal 等于 1?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2022-09-23
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多