Back to Documentation

Arena Metrics & Formulas

Definitions, formulas, and interpretation guidelines for all performance metrics

Constants & Parameters

These constants are used across all metric calculations in the Arena.

Parameter Value Description
contract_multiplier 100,000 VN30F contract multiplier (VND per index point)
margin_ratio 0.25 (25%) Derivative margin ratio
risk_free_rate 7% / year Annual risk-free rate (Vietnamese government bonds)
trading_days 252 Trading days per year for annualization
init_balance 500,000,000 VND Default initial account balance
Risk-Adjusted Return

Sharpe Ratio

Measures excess return per unit of total risk. A higher Sharpe ratio indicates better risk-adjusted performance. It compares the portfolio's return above the risk-free rate relative to the volatility of returns.

Formula

daily_return = (NAV_t - NAV_{t-1}) / NAV_{t-1} mean_daily = mean(daily_returns) std_daily = std(daily_returns) rf_daily = 0.07 / 252 sharpe_ratio = (mean_daily - rf_daily) / std_daily * sqrt(252)

Interpretation

> 2.0 — Excellent risk-adjusted returns
1.0 – 2.0 — Good performance
0.5 – 1.0 — Acceptable
< 0.5 — Poor risk-adjusted performance
Risk

Maximum Drawdown (MDD)

The largest peak-to-trough decline in NAV during the evaluation period. Expressed as a percentage, it measures the worst-case loss scenario from a peak. Lower (closer to 0%) is better.

Formula

running_max = cumulative_max(NAV) drawdown_t = (NAV_t - running_max_t) / running_max_t MDD = min(drawdown_t) # most negative value

Interpretation

0% to -5% — Very conservative, low drawdown
-5% to -15% — Moderate risk
-15% to -30% — High risk / aggressive strategy
< -30% — Extreme drawdown, potential risk management issue
Benchmark Comparison

Information Ratio (IR)

Measures the portfolio's excess return over a benchmark per unit of tracking error. Computed separately against VNINDEX and VN30 benchmarks. A higher IR indicates consistent outperformance relative to the benchmark.

Formula

excess_return_t = portfolio_return_t - benchmark_return_t tracking_error = std(excess_returns) IR = mean(excess_returns) * 252 / (tracking_error * sqrt(252))

Benchmarks

IR vs VNINDEX — Compared against the broad Vietnam stock market index
IR vs VN30 — Compared against the top 30 large-cap stocks index

Interpretation

> 1.0 — Excellent active management, consistently beating benchmark
0.5 – 1.0 — Good outperformance
0.0 – 0.5 — Marginal outperformance
< 0.0 — Underperforming the benchmark
Benchmark Comparison

Sortino Ratio

Similar to the Sharpe ratio but only penalizes downside volatility. Instead of using total standard deviation, it uses downside deviation (only negative returns). This makes it more relevant for strategies that have asymmetric return distributions. Computed against both VNINDEX and VN30 benchmarks.

Formula

excess_return_t = portfolio_return_t - benchmark_return_t downside_returns = [r for r in excess_returns if r < 0] downside_dev = sqrt(mean(downside_returns^2)) sortino = mean(excess_returns) * 252 / (downside_dev * sqrt(252))

Interpretation

> 2.0 — Excellent, rarely loses to benchmark
1.0 – 2.0 — Good downside protection
0.0 – 1.0 — Moderate
< 0.0 — Frequent losses vs benchmark
Turnover

Gross Notional Turnover

Measures total traded notional value relative to the initial account balance. Counts both buy and sell fills. This is the primary turnover metric — higher values indicate more active trading.

Formula

fill_notional = abs(fill_qty) * fill_price * 100,000 gross_notional_turnover = sum(fill_notional) / init_balance

Notes

Both directions counted — Buy and Sell fills both contribute to turnover
Fees excluded — Turnover is calculated on notional value, excluding fees
Unit: "x" — A value of 2.0x means total traded notional = 2× initial balance
Turnover

Close Notional Turnover

Measures the total closing notional relative to initial balance. Only the portion of each fill that closes an existing position is counted. This helps understand how much capital has been "round-tripped" (opened then closed).

Formula

close_fill_qty = portion of fill that closes existing position close_fill_notional = close_fill_qty * fill_price * 100,000 close_notional_turnover = sum(close_fill_notional) / init_balance

Close Qty Logic

Position tracking: trades are replayed chronologically per symbol.
If position is +2 and SELL 3 → close_qty = 2 (closes long), open_qty = 1 (opens short)
If position is 0 and BUY 5 → close_qty = 0 (pure open)
If position is -3 and BUY 3 → close_qty = 3 (closes entire short)
Turnover

Round Trips

Counts the total number of contracts that have been fully or partially closed. Each closing fill contributes its close quantity. For example, opening 5 contracts then closing 3 counts as 3 round trips. This provides a simple, intuitive measure of trading activity independent of price or notional value.

Formula

close_qty = portion of fill that reduces existing position (same logic as Close Notional) round_trips = sum(close_qty) across all fills avg_daily_round_trips = round_trips / trading_days

Notes

Counted in contracts — Not in notional value, unlike Close Notional Turnover
Uses close logic — Same position-tracking approach as Close Notional: only fills that reduce an existing position count
Unit: integer — Round Trips is a whole number; Avg Daily is a decimal
Turnover

Margin Usage Turnover

Measures traded notional adjusted by the margin ratio, relative to initial balance. This reflects how much margin capital was deployed across all trades. It is a supplementary metric — do not use as a replacement for gross notional turnover.

Formula

margin_fill_notional = abs(fill_qty) * fill_price * 100,000 * margin_ratio margin_usage_turnover = sum(margin_fill_notional) / init_balance margin_ratio = 0.25

Relationship

margin_usage_turnover = gross_notional_turnover × 0.25
Since margin_ratio is constant, this metric scales linearly with gross turnover.
Turnover

Average Daily Turnover

Each of the three turnover metrics has an average daily version, computed by dividing the cumulative turnover by the number of trading days since arena start.

Formula

trading_days = count of NAV history records for the account avg_daily_gross_notional = gross_notional_turnover / trading_days avg_daily_close_notional = close_notional_turnover / trading_days avg_daily_margin_usage = margin_usage_turnover / trading_days avg_daily_round_trips = round_trips / trading_days

Notes

Trading days — Counted from AccountNAVHistory records (days with market data), not calendar days
Minimum 1 day — To avoid division by zero when no history exists yet

Last updated: April 2026 • Arena26