# Should You Cut Your Losses?

this is a quote that trader/investor had heard for too many times.

Every successful trade should have a plan to enter, plan to exit and cut loss, cut loss is a risk management technique,
it can theoretically prevent your losses from getting worse.

Today we are going to see if cut loss is a good strategy to protect your trade.
Common cut loss values are 5%, 10%,
but it is highly dependent on you risk preference,
there is no magic number for cut loss value, for this study we are using 5% cut loss value.

I downloaded historical data of KLSE from Yahoo Finance in csv form.

We need to read it into memory to perform backtesting.

``````import pandas as pd

KLSE = KLSE.replace(',','', regex=True)
KLSE['Open'] = KLSE['Open'].astype(float)
KLSE['Close'] = KLSE['Close'].astype(float)
KLSE['Change'] = (KLSE['Close'] - KLSE['Close'].shift(1))/KLSE['Open'] + 1

## Rules

We are using very simple moving average + 5% stop loss as our strategy,
the rules are:

1. when the “fast” moving average goes above the “slow” moving average, we buy in.
2. when the “fast” moving average goes below the “fast” moving average, we sell.
3. Cut loss when paper loss > 5%.
``````def simulate(df,fast,slow,cutloss = False):

import talib

df['fast'] = talib.SMA(df['Close'],fast)
df['slow'] = talib.SMA(df['Close'],slow)

df.dropna(inplace = True)

gold_cross = df[df['fast'] > df['slow']].index
df.loc[gold_cross,'Cross'] = 1

gold_cross = df[df['fast'] < df['slow']].index
df.loc[gold_cross,'Cross'] = 0

df['Return'] = df['Cross']*df['Change']

def norm(x):
if x == 0:
return 1
else:
return x

df['Return'] = df['Return'].apply(lambda x: norm(x))
df['Nav'] = (df['Return']).cumprod()

DD = 1 - df['Nav']/df['Nav'].cummax()

#===================================
if cutloss:
# set cutloss to 5.5% for extra buffer
c = DD[DD > 0.055].index
df.loc[c,'Cross'] = 0

df['Return'] = df['Cross']*df['Change']

df['Return'] = df['Return'].apply(lambda x: norm(x))
df['Nav'] = (df['Return']).cumprod()

#====================================

# divide by 252 because generally a year has 252 trading days
num_periods = df.shape/252
rety = ((df['Nav'].iloc[-1] / df['Nav'].iloc) ** (1 / (num_periods - 1)) - 1)*100.0

if len(price_out) > len(price_in):
price_out = price_out[:len(price_in)]

if len(price_in) > len(price_out):
price_in = price_in[:len(price_out)]

VictoryRatio = ((price_out - price_in)>0).mean()*100.0
DD = 1 - df['Nav']/df['Nav'].cummax()
MDD = max(DD)*100.0

return df, round(rety, 2), round(VictoryRatio, 2), round(MDD,2)``````

## Strategy Performance

We are backtesting 4 combinations

1. 10 and 20 (Short term trade), No cut loss
2. 20 and 50 (Medium term trade), No cut loss
3. 10 and 20 (Short term trade), 5% cut loss
4. 20 and 50 (Medium term trade), 5% cut loss
``````MA1020,cagr1020,vr1020,mdd1020 = simulate(KLSE.copy(),10,20,False)
MA2050,cagr2050,vr2050,mdd2050 = simulate(KLSE.copy(),20,50,False)
MA1020_cutloss,cagr1020_cutloss,vr1020_cutloss,mdd1020_cutloss = simulate(KLSE.copy(),10,20,True)
MA2050_cutloss,cagr2050_cutloss,vr2050_cutloss,mdd2050_cutloss = simulate(KLSE.copy(),20,50,True)

KLSE['KLSE'] = (KLSE['Change']).cumprod()
import matplotlib.pyplot as plt
plt.style.use('seaborn')

ax = MA1020['Nav'].plot(figsize=(10, 6))
MA2050['Nav'].plot(ax=ax)
MA1020_cutloss['Nav'].plot(ax=ax)
MA2050_cutloss['Nav'].plot(ax=ax)

KLSE['KLSE'].plot(ax=ax)
# plt.plot( 'Date','Nav', data = MA2050, marker='', color='olive', linewidth=2)
ax.legend(['MA1020','MA2050','MA1020 5% Cutloss','MA2050 5% Cutloss','KLSE']);
plt.show()

from prettytable import PrettyTable

t = PrettyTable(['Strategy', 'CAGR', 'Win Rate', 'Max Drawdown'])

print(t)``````
``````+-------------------+------+----------+--------------+
|      Strategy     | CAGR | Win Rate | Max Drawdown |
+-------------------+------+----------+--------------+
|       MA1020      | 6.44 |  50.77   |     8.52     |
|       MA2050      | 3.14 |  30.77   |    12.15     |
| MA1020 5% Cutloss | 7.19 |  45.21   |     5.44     |
| MA2050 5% Cutloss | 4.54 |  20.59   |     5.46     |
+-------------------+------+----------+--------------+``````

## Thoughts

From the backtesting results,
cut loss seems to be a very effective risk management technique.

With 5% cut loss, it performed better than the same strategy without cut loss.

Although the win rate is lower,
this could mean that having cut loss,