A start toward liquidating on portfolio drop to reduce drawdown. The heart of this one is the append and next two lines.
Could combine with a slope calculation for example and/or other.
def handle_data(context, data):
if liquidate(context, data):
# Do something differently like sitting out for awhile, then ...
return
[normal ordering etc]
def liquidate(context, data):
lookback = 30 # Number of days portfolio values to keep.
ratio = .91 # How low before liquidation.
if 'pf' not in context: # Portability. Init in initialize() for better efficiency.
context.pf = [] # A list for portfolio values.
context.date_prv = '' # To be able to keep only one value per day.
if context.date_prv != get_datetime().date(): # If new day.
context.date_prv = get_datetime().date() # New previous date.
context.pf.append(context.portfolio.portfolio_value) # Portfolio value added once per day
context.pf = context.pf[-lookback:] # Trim list
if context.pf[-1] < ratio * max(context.pf): # If last value below highest by ratio amount.
log.info('Liquidating {} < {} * {}'.format(
context.pf[-1], ratio, ratio * max(context.pf)))
# Liquidate, scorched earth policy, make this less dumberer.
for s in data: # Consider instead only selling those going down etc.
order_target(s, 0) # Sell all. Or shorting etc
return 1
return 0