atj*_*w94 5 python quantitative-finance pandas back-testing
我正在 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
Run Code Online (Sandbox Code Playgroud)
我想有一栏显示每个日期的追踪止损是什么。当 enter_signal = 1 时,追踪止损首先设置为 01/07/2018 价格的 99%,此时交易在该日期执行。
当价格上涨 y% 时,追踪止损也会上涨 y%。但是,如果价格下跌,追踪止损将不会从其最后一个值改变。
当价格 <= 追踪止损时,交易退出,exit_signal 为 1...
如果价格也下跌 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
Run Code Online (Sandbox Code Playgroud)
我得到的表:
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
Run Code Online (Sandbox Code Playgroud)
难以回答的问题涉及cummax和pct_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
Run Code Online (Sandbox Code Playgroud)
只需取累计最大值的 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
Run Code Online (Sandbox Code Playgroud)