I quantopified a class for tracking margins I worked on in zipline a while ago since it's difficult to write code that can be cut/pasted between the two.
It keeps a dict of position margins and the portfolio margin. It logs the data nice and pretty for you too, Enjoy!
import pandas as pd
class Margins(object):
'''
Calculates portfolio minimum margin requirement and
keeps a dict of the requirement for each position.
'''
def __init__(self, context, data, day_trader=False):
self.initial_margin = 25000.0 if day_trader else 2000.0
self.position_margins = {}
for stock in data.keys():
self.position_margins[stock] = \
self.position_requirement(context.portfolio.positions[stock])
self.requirement = sum(self.position_margins.values())
def position_requirement(self, position):
amount = position.amount
last_sale_price = position.last_sale_price
if amount >= 0:
req = .25 * amount * last_sale_price
else:
if last_sale_price < 5:
req = max(2.5 * amount, abs(amount * last_sale_price))
else:
req = max(5 * amount, abs(0.3 * amount * last_sale_price))
return req
def __repr__(self):
template = "\nSymbol Requirement\n{position_margins}\nMargin Requirement: {req}"
return template.format(
position_margins=pd.Series(
{i.symbol : self.position_margins[i]
for i in self.position_margins}),
req=self.requirement)
def __getitem__(self, item):
return self.position_margins[item]