"""R615:从完整合成成交计算固定期间换手,缺失/失败不记零。""" from decimal import Decimal as D def round_trip(name, qty, buy, sell): return [{'id': name + '-buy', 'qty': D(str(qty)), 'price': D(buy), 'side': -1}, {'id': name + '-sell', 'qty': D(str(qty)), 'price': D(sell), 'side': 1}] def measure(status, fills, nav): if status != 'completed' or fills is None: return None if nav <= 0: raise ValueError('nonpositive NAV') if len({f['id'] for f in fills}) != len(fills): raise ValueError('duplicate fill ID') if any(f['qty'] <= 0 or f['price'] <= 0 for f in fills): raise ValueError('invalid fill amount') traded = sum((f['qty'] * f['price'] for f in fills), D(0)) # 所有样例均期初/期末平仓且费用零,因而现金桥等于净利润。 net = sum((f['qty'] * f['price'] * f['side'] for f in fills), D(0)) return traded / nav, net rows = { 'A': ('completed', round_trip('A', 10, '99.6', '100.4')), 'B': ('completed', round_trip('B', 4, '99.375', '100.625')), 'C': ('completed', round_trip('C', 2, '149', '151')), 'D': ('completed', None), 'E': ('failed', []), 'F': ('completed', []), 'G': ('completed', round_trip('G', 4, '99.625', '100.375')), } nav, budget = D(1000), D('.8') valid, unknown = {}, [] for key, (status, fills) in rows.items(): value = measure(status, fills, nav) if value is None: unknown.append(key) else: valid[key] = value inside = {k: v for k, v in valid.items() if v[0] <= budget} front = {k: v for k, v in inside.items() if not any( other != k and w[0] <= v[0] and w[1] >= v[1] and w != v for other, w in inside.items())} assert set(inside) == {'B', 'C', 'F', 'G'} assert set(front) == {'B', 'C', 'F'} assert set(unknown) == {'D', 'E'} and valid['F'] == (0, 0) assert valid['A'] == (D(2), D(8)) assert valid['B'] == (D('.8'), D(5)) assert valid['C'] == (D('.6'), D(4)) selected = max(inside, key=lambda k: inside[k][1]) assert selected == 'B' try: measure('completed', rows['B'][1] * 2, nav) except ValueError: pass else: raise AssertionError('duplicate fills counted') print('period_gross_traded_over_initial_NAV=' + str(valid)) print('budget=0.8 inside=' + str(sorted(inside)) + ' frontier=' + str(sorted(front)) + ' selected=' + selected + ' unknown=' + str(unknown)) print('net_profit_reconciled_from_fills=True duplicate_fill=rejected fees=0_synthetic')