Ordering Analysis
Section C: Time sequencing analysis (MFE-first vs MAE-first).
ordering
Time-sequencing analysis: Profit first vs Pain first.
ordering_label(trades)
Classify each trade as MFE-first, MAE-first, or tie.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trades
|
TradeSet
|
Trade geometry data (must have t_mfe and t_mae) |
required |
Returns:
| Type | Description |
|---|---|
ndarray
|
Array of strings: 'mfe_first', 'mae_first', or 'tie' |
Notes
- mfe_first: profit came before pain (t_mfe < t_mae)
- mae_first: pain came before profit (t_mae < t_mfe)
- tie: both occurred at same time (rare)
Source code in signal_analyzer/analysis/ordering.py
split_by_ordering(trades)
Split trades into subsets based on ordering.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trades
|
TradeSet
|
Trade geometry data |
required |
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary with keys 'mfe_first', 'mae_first', 'tie', each containing: - 'mfe': MFE values - 'mae': MAE values - 'indices': original indices - 'count': number of trades |
Source code in signal_analyzer/analysis/ordering.py
ordering_proportions(trades)
Calculate proportions of each ordering type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trades
|
TradeSet
|
Trade geometry data |
required |
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary with proportions: - 'mfe_first': fraction of MFE-first trades - 'mae_first': fraction of MAE-first trades - 'tie': fraction of ties |
Source code in signal_analyzer/analysis/ordering.py
trailing_suitability(trades, mfe_threshold=0.0, mae_threshold=-1.0)
Calculate "trailing stop suitability" metric.
This measures the fraction of MFE-first trades where profit exceeded a threshold before drawdown exceeded a threshold.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trades
|
TradeSet
|
Trade geometry data |
required |
mfe_threshold
|
float
|
Minimum MFE required to consider (e.g., 0.5% profit) |
0.0
|
mae_threshold
|
float
|
Maximum MAE tolerated (e.g., -1.0% drawdown) |
-1.0
|
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary with: - 'suitable_count': number of suitable trades - 'total_count': total number of trades - 'suitability_rate': fraction suitable - 'mfe_first_rate': fraction that are MFE-first among suitable |
Source code in signal_analyzer/analysis/ordering.py
needs_room(trades, mfe_threshold=1.0)
Calculate "needs room" metric.
This measures the success rate of MAE-first trades (trades that had to endure drawdown before profit).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trades
|
TradeSet
|
Trade geometry data |
required |
mfe_threshold
|
float
|
Minimum MFE required to be considered a "winner" |
1.0
|
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary with: - 'mae_first_count': number of MAE-first trades - 'mae_first_winners': number of MAE-first trades that became winners - 'success_rate': fraction of MAE-first trades that succeeded - 'median_dd_winners': median drawdown of winning MAE-first trades - 'median_dd_losers': median drawdown of losing MAE-first trades |
Source code in signal_analyzer/analysis/ordering.py
ordering_vs_horizon(ohlc, entries, side, H_list, **kwargs)
Analyze how ordering proportions change with different horizons.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ohlc
|
DataFrame
|
OHLC data |
required |
entries
|
ndarray
|
Entry indices |
required |
side
|
(long, short)
|
Trade direction |
'long'
|
H_list
|
list of int
|
List of horizons to test |
required |
**kwargs
|
Additional arguments for compute_trade_paths |
{}
|
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary mapping H -> ordering proportions {H: {'mfe_first': float, 'mae_first': float, 'tie': float}} |