def positions(self): """ Returns net positions of campaign on last date :return: """ net_positions = {} for exo_name, exo_exposure in self.exo_positions(date=None).items(): # Load information about EXO positions exo_data = self._datasource.exostorage.load_exo(exo_name) if exo_data is not None: # Get EXO's assets positions exo_pos = Position.get_position_qty(exo_data, self._datasource) for assetname, pos_dict in exo_pos.items(): # Escape special MongoDB keys chars in key names asset_name_safe = assetname.replace('.', '_').replace('$', '_') position = net_positions.setdefault(asset_name_safe, {'asset': pos_dict['asset'], 'qty': 0.0, 'prev_qty': 0.0}) # Multiply EXO position by campaign exposure position['qty'] += pos_dict['qty'] * exo_exposure['exposure'] position['prev_qty'] += float('nan') else: warnings.warn("EXO data not found for " + exo_name) return net_positions
def test_get_position_qty_current_position(self): pos = Position() # # Do sanity checks # self.assertEqual(EXO_POS_DICT_TEST['transactions'][-1]['date'], pd.Timestamp("2016-09-14T12:45:00")) self.assertEqual(EXO_POS_DICT_TEST['transactions'][0]['date'], pd.Timestamp("2011-06-01T12:45:00")) p = pos.get_position_qty(EXO_POS_DICT_TEST, None) self.assertEqual(p["100006570"]['qty'], 1.0) self.assertEqual(p["100006570"]['value'], 105925.0) self.assertEqual(p["203147944"]['qty'], 1.0) self.assertEqual(p["203147944"]['value'], 2067.81315840769) self.assertEqual(p["203147442"]['qty'], -1.0) self.assertEqual(p["203147442"]['value'], -2611.56510629721) self.assertEqual(p["203148813"]['qty'], 1.0) self.assertEqual(p["203148813"]['value'], 3013.95208628632)