Skip to content

Take-Profit Yield Calculator — относительный выход + эффективность капитала ​

EV-модель для варианта directional с относительным take-profit (выход = процент от входа) вместо статической цены Harvester (≈0.99). Каркас — docs/strategies/harvester-yield.md; реализация и тесты — crates/pm-analytics/src/harvester_yield.rs (take_profit_symmetric, roi_rate, compare_efficiency).

Статус: калькулятор. Вердикт «эффективнее ли Harvester» — форвард/бэктест-gated (§5), не выносится здесь.


1. Зачем ​

Harvester выходит по СТАТИЧЕСКОЙ цене exit ≈ 0.99 и досиживает до почти-резолюции: большой захват (0.99 − p_e ≈ 9¢ на фаворите 0.90) ценой ДОЛГОГО удержания капитала (часы). Вариант take-profit выходит на exit = p_e·(1 + g) (напр. g = 0.05 → +5% от входа) с симметричным относительным стопом на p_e·(1 − x), освобождая капитал быстро для БОЛЬШЕГО числа итераций. Вопрос — эффективнее ли это по капиталу-во-времени, чем один долгий Harvester. Вход directional не меняется — расширяется только параметр выхода (статический → процент от входа).

2. Переменные ​

p_e        = средняя цена входа
g          = take-profit доля от входа (exit = p_e·(1+g); захват на выигрыш = p_e·g)
x          = stop доля от входа (стоп-цена p_e·(1−x); x=g ⇒ симметрия)
r          = стоп-эффективность ∈ [0,1] (0 = досидеть проигравших до $0; 1 = стоп режет на s_eff всегда)
s_eff      = РЕАЛЬНАЯ цена стоп-фила (не порог); при симметрии s_eff = p_e·(1−x)
w          = realised winrate (доля позиций, достигших +g раньше стопа/adverse-резолюции)
T_hold     = среднее время удержания (T_H у Harvester — долго; T_tp у take-profit — коротко)

3. Формула EV (обобщение Harvester-модели) ​

Per-share EV — та же формула Harvester, где exit и s_eff теперь функции p_e:

E[PnL/share] = w·(exit − p_e) − (1 − w)·(p_e − r·s_eff)
             = w·p_e·g       − (1 − w)·(p_e − r·s_eff)

Break-even winrate (E = 0):

w* = (p_e − r·s_eff) / (p_e·(1+g) − r·s_eff)

+EV ⟺ w > w* (edge_margin = w − w* > 0).

Предельные случаи (см. тесты take_profit_no_stop_is_steamroller_wall, take_profit_symmetric_stop_breakeven_half):

  • r = 0 (нет стопа): w* = 1/(1+g) — при g = 0.05 это ≈ 0.952. «Монетки перед катком»: выигрыш +5% част, но редкий проигрыш −100% доминирует. Без стопа нужен winrate ~95% — вот почему TP-режим ОБЯЗАН иметь стоп.
  • r = 1, x = g (симметрия): w* = p_e·x / (p_e·2g) = 0.5. Симметричные ±g ⇒ break-even 50%.

4. Эффективность капитала — измерение сравнения с Harvester ​

Само по себе E[PnL/share] НЕ сравнивает режимы: Harvester захватывает больше на сделку, но держит капитал дольше. Метрика сравнения — доходность капитала В ЕДИНИЦУ ВРЕМЕНИ (roi_rate в harvester_yield.rs):

roi_rate = E[PnL/share] / (p_e · T_hold)

За горизонт T тот же капитал прокручивается T/T_hold раз, поэтому малый захват p_e·g умножается на оборот T_H/T_tp. Take-profit эффективнее Harvester ⟺

roi_rate_tp > roi_rate_H   ⟺   E_tp · T_H > E_H · T_tp

где E_H = w_H·(0.99 − p_e) − (1 − w_H)·loss_H (долгое удержание T_H), E_tp = w_tp·p_e·g − (1 − w_tp)·loss_tp (короткое T_tp ≪ T_H). Оборот T_H/T_tp — рычаг: меньший захват побеждает, только если удержание достаточно короче (тест take_profit_turnover_can_beat_harvester_capture).

5. Worked example (иллюстративный; входы (ii) — pending форвард) ​

Фаворит p_e = 0.90. Harvester: exit = 0.99, r = 0, w_H = 0.93, долгое удержание T_H = 100 (усл. единиц). Take-profit на том же фаворите: g = 0.05 (0.90 → 0.945), симметричный стоп x = 0.05, r = 1, w_tp = 0.60, короткое T_tp = 5.

E_H  = 0.93·(0.99−0.90) − 0.07·0.90            = 0.0837 − 0.0630 = +0.0207 /share
E_tp = 0.60·(0.945−0.90) − 0.40·(0.90−0.855)   = 0.0270 − 0.0180 = +0.0090 /share   (0.855 = 0.90·0.95)

roi_rate_H  = 0.0207 / (0.90·100) = 0.000230
roi_rate_tp = 0.0090 / (0.90·5)   = 0.002000     ⇒  tp ≈ 8.7× эффективнее Harvester ПРИ 20× обороте

Harvester берёт больше на сделку (0.0207 > 0.0090), но при 20-кратном обороте take-profit эффективнее по капиталу. Но при РАВНОМ удержании (T_tp = 100) roi_rate_tp = 0.0001 < 0.000230 — Harvester выигрывает. Оборот — рычаг, а w_tp, T_tp — эмпирические: без них это форма, не вердикт.

6. GARBAGE-IN дисциплина (та же, что harvester_yield §GARBAGE-IN) ​

Формула точна лишь при КОРРЕКТНЫХ входах:

  • w_tp, T_tp — из РЕАЛЬНЫХ результатов форвардных торговых сессий, НЕ counterfactual; открытых проигравших резолвить (no survivorship).
  • r, s_eff — из РЕАЛЬНЫХ стоп-филлов, не из порога.
  • taker-fee на стоп/TP-выход брать из подтверждённых боевых исполнений и трассировки ордеров; симуляторных оценок в контуре валидации нет.
  • w_H, T_H — из живых данных Harvester; сверять на ≥2 независимых срезах.

7. Порядок расчёта ​

1. Задать (i): p_e, g, x (напр. 0.05/0.05), exit_H (0.99).
2. Измерить (ii) по телеметрии боевых сессий: w_tp, T_tp, r, s_eff
   (только confirmed fills); взять w_H, T_H из тех же форвардных Harvester-данных.
3. E_tp = w_tp·p_e·g − (1−w_tp)·(p_e − r·s_eff);  E_H = w_H·(exit_H − p_e) − (1−w_H)·loss_H.
4. w*_tp = (p_e − r·s_eff)/(p_e·(1+g) − r·s_eff);  edge_margin = w_tp − w*_tp.
5. roi_rate_tp = E_tp/(p_e·T_tp);  roi_rate_H = E_H/(p_e·T_H).
6. Вердикт эффективности: roi_rate_tp > roi_rate_H (только по confirmed fills, ≥2 независимых среза).

Cross-references: directional-harvester.md (родительская стратегия), harvester-yield.md (каркас), crates/pm-analytics/src/harvester_yield.rs (реализация + тесты).