From 3da3cbe7e71278a1a4da867829426740738361ad Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Tue, 16 Jun 2015 16:57:41 -0400 Subject: [PATCH] MAINT: Remove position proxy. Use explicit references to the performance tracker instead of the proxy lookup. Mainly a putative change, which surfaced when reasoning about places where the position tracker and period need access to the last sale price. --- zipline/finance/performance/period.py | 103 ++++---------------------- 1 file changed, 16 insertions(+), 87 deletions(-) diff --git a/zipline/finance/performance/period.py b/zipline/finance/performance/period.py index 4f07b7ae..4dc02146 100644 --- a/zipline/finance/performance/period.py +++ b/zipline/finance/performance/period.py @@ -98,24 +98,6 @@ log = logbook.Logger('Performance') TRADE_TYPE = zp.DATASOURCE_TYPE.TRADE -def position_proxy(func): - def _proxied(self, *args, **kwargs): - meth_name = func.__name__ - meth = getattr(self.position_tracker, meth_name) - return meth(*args, **kwargs) - return _proxied - - -class ProxyError(Exception): - def __init__(self): - import inspect - - meth_name = inspect.stack()[1][3] - TEMPLATE = "{meth_name} should have been proxied to position_tracker." - msg = TEMPLATE.format(meth_name=meth_name) - super(ProxyError, self).__init__(msg) - - class PerformancePeriod(object): def __init__( @@ -195,8 +177,9 @@ class PerformancePeriod(object): setattr(self, field, value) def calculate_performance(self): - self.ending_value = self.calculate_positions_value() - self.ending_exposure = self.calculate_positions_exposure() + pt = self.position_tracker + self.ending_value = pt.calculate_positions_value() + self.ending_exposure = pt.calculate_positions_exposure() total_at_start = self.starting_cash + self.starting_value self.ending_cash = self.starting_cash + self.period_cash_flow @@ -263,73 +246,27 @@ class PerformancePeriod(object): def position_amounts(self): return self.position_tracker.position_amounts - @position_proxy - def calculate_positions_exposure(self): - raise ProxyError() - - @position_proxy - def calculate_positions_value(self): - raise ProxyError() - - @position_proxy - def _longs_count(self): - raise ProxyError() - - @position_proxy - def _long_exposure(self): - raise ProxyError() - - @position_proxy - def _long_value(self): - raise ProxyError() - - @position_proxy - def _shorts_count(self): - raise ProxyError() - - @position_proxy - def _short_exposure(self): - raise ProxyError() - - @position_proxy - def _short_value(self): - raise ProxyError() - - @position_proxy - def _gross_exposure(self): - raise ProxyError() - - @position_proxy - def _gross_value(self): - raise ProxyError() - - @position_proxy - def _net_exposure(self): - raise ProxyError() - - @position_proxy - def _net_value(self): - raise ProxyError() - @property def _net_liquidation_value(self): - return self.ending_cash + self._long_value() + self._short_value() + pt = self.position_tracker + return self.ending_cash + pt._long_value() + pt._short_value() def _gross_leverage(self): net_liq = self._net_liquidation_value if net_liq != 0: - return self._gross_exposure() / net_liq + return self.position_tracker._gross_exposure() / net_liq return np.inf def _net_leverage(self): net_liq = self._net_liquidation_value if net_liq != 0: - return self._net_exposure() / net_liq + return self.position_tracker._net_exposure() / net_liq return np.inf def __core_dict(self): + pt = self.position_tracker rval = { 'ending_value': self.ending_value, 'ending_exposure': self.ending_exposure, @@ -347,12 +284,12 @@ class PerformancePeriod(object): 'period_close': self.period_close, 'gross_leverage': self._gross_leverage(), 'net_leverage': self._net_leverage(), - 'short_exposure': self._short_exposure(), - 'long_exposure': self._long_exposure(), - 'short_value': self._short_value(), - 'long_value': self._long_value(), - 'longs_count': self._longs_count(), - 'shorts_count': self._shorts_count() + 'short_exposure': pt._short_exposure(), + 'long_exposure': pt._long_exposure(), + 'short_value': pt._short_value(), + 'long_value': pt._long_value(), + 'longs_count': pt._longs_count(), + 'shorts_count': pt._shorts_count() } return rval @@ -368,7 +305,7 @@ class PerformancePeriod(object): rval = self.__core_dict() if self.serialize_positions: - positions = self.get_positions_list() + positions = self.position_tracker.get_positions_list() rval['positions'] = positions # we want the key to be absent, not just empty @@ -423,7 +360,7 @@ class PerformancePeriod(object): portfolio.returns = self.returns portfolio.cash = self.ending_cash portfolio.start_date = self.period_open - portfolio.positions = self.get_positions() + portfolio.positions = self.position_tracker.get_positions() portfolio.positions_value = self.ending_value portfolio.positions_exposure = self.ending_exposure return portfolio @@ -473,14 +410,6 @@ class PerformancePeriod(object): getattr(self, 'net_liquidation', self._net_liquidation_value) return account - @position_proxy - def get_positions(self): - raise ProxyError() - - @position_proxy - def get_positions_list(self): - raise ProxyError() - def __getstate__(self): state_dict = {k: v for k, v in iteritems(self.__dict__) if not k.startswith('_')}