For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Rebalance quarterly
-
Hi, I want to sell (cover for shorting) all the current long(short) holdings on my portfolio every quarter and replace them with the new stocks.
class Short(bt.Strategy): params = ( ('losscut', 0.05), ('profit', 0.05), ('max_stock', 5), ) def __init__(self): self.inds = dict() self.entry = {} self.loss_cut = {} self.profit_realisation = {} self.shorting_list = [] self.shorted_list = [] def next(self): for i, d in enumerate(self.datas): dt, dn = self.datetime.date(), d._name pos = self.getposition(d).size if pos == 0: if dn not in self.shorted_list: if len(self.shorting_list) == self.params.max_stock: return else: self.order_target_percent(data=d, target = -0.1) self.entry.update({dn:d.close[0]}) self.shorted_list.append(dn) self.shorting_list.append(dn) else: if dt.month in [3,6,9,12]: # I need the codes that clears the whole position in the beginning (or at the end) of every quarter (ex: 1st of March or 28th of March)' pass if d.close[0] > self.entry[dn]*float(1 + self.params.losscut) == 1: self.order_target_percent(data=d, target = 0) self.loss_cut.update({dn:d.close[0]}) self.shorting_list.remove(dn) elif d.close[0]<self.entry[dn]*(1 - self.params.profit): self.order_target_percent(data=d, target = 0) self.profit_realisation.update({dn:d.close[0]}) self.shorting_list.remove(dn) pass
If anyone knows something, please enlighten me!
Thank you :D
-
This post in reddit shows how rebalancing is done on each
next
iteration.In your case you want only to execute rebalancing once at the beginning of each quarter. To do so:
- Keep a variable which holds what the next quarter will be in format
YYYYMM
for example - When the components of the current date match the quarter, you can rebalance.
- Update the variable to the next quarter, which will be either:
YYYY(MM + 3)
or(YYYY + 1)03
- Keep a variable which holds what the next quarter will be in format
-
There is an additional path: use Docs - Timers
You can watch day
1
of each month and only take action if the month is3, 6, 9 or 12
or implement a callable which does the calculation and pass it toallow