Трейлинг-стоп-лосс на данных - PullRequest
1 голос
/ 03 июля 2019

Я проводил тестирование некоторых торговых стратегий на фондовом рынке на фрейме данных 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                

Я хотел бы иметь столбец, показывающий, что такое трейлинг-стоп на каждую дату. Сначала трейлинг-стоп устанавливается на 99%цены на 01/07/2018, когда enter_signal = 1, где сделка совершается в эту дату.

Когда цена повышается на y%, трейлинг-стоп также будет расти на y%Однако если цена снижается, трейлинг-стоп не изменится со своего последнего значения.

Когда цена <= трейлинг-стоп, сделка закрывается, и будет сигнал exit_signal, равный 1 ...</p>

В настоящее время я застрял на том, что у трейлинг-стопа нет движения вниз на 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                

1 Ответ

1 голос
/ 03 июля 2019

Сложный вопрос 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
...