"""低值优先的经济方向、效用分数与非负做多数量分别表示。""" import json raw = {'A': .10, 'B': .20, 'C': .30, 'D': .40} utility = {s: -value for s, value in raw.items()} chosen = sorted(utility, key=lambda s: (-utility[s], s))[:2] wrong = sorted(raw, key=lambda s: (-raw[s], s))[:2] assert chosen == ['A', 'B'] and wrong == ['D', 'C'] assert chosen == sorted(raw, key=lambda s: (raw[s], s))[:2] quantity = {s: 40 for s in chosen} assert all(q >= 0 for q in quantity.values()) assert all(utility[s] < 0 for s in chosen) def account(names): marks = {'A': 10.2, 'B': 9.9, 'C': 10.1, 'D': 10.3} cash = 1000 - sum(40 * 10 + 1 for _ in names) equity = cash + sum(40 * marks[s] for s in names) return {'cash': cash, 'equity': equity, 'orders': [[s, 'buy', 40, 10, 1] for s in names]} assert account(chosen)['equity'] == 1002 and account(wrong)['equity'] == 1014 print(json.dumps({'raw': raw, 'utility': utility, 'selected': chosen, 'correct': account(chosen), 'reversed_direction': account(wrong), 'rule': 'lower raw value preferred; no short orders'}))