WU Trading Library 0.2.0
A backtesting and trading strategy library
Loading...
Searching...
No Matches
stats.h
Go to the documentation of this file.
1#ifndef _STATS_H_
2#define _STATS_H_
3
4#include <time.h>
5#include "indicators.h"
6
7/**
8 * Sharpe ratio is the relation between the risk-free rate discounted
9 * retuns and the volatility of an investment. It is an annualizated
10 * average.
11 */
12typedef struct WU_SharpeRatio_ {
13 double (*update)(struct WU_SharpeRatio_* self, WU_PerformanceUpdate perf);
14 void (*delete)(struct WU_SharpeRatio_* self);
15 double value;
16 WU_Mean mean;
17 WU_StDev stdev;
20 double prev_value;
21 int64_t count;
22 int64_t start_time;
23 int64_t end_time;
25}* WU_SharpeRatio;
26
27WU_SharpeRatio wu_sharpe_ratio_new(double initial_value, double risk_free_rate);
28
29typedef struct WU_SortinoRatio_ {
30 double (*update)(struct WU_SortinoRatio_* self, WU_PerformanceUpdate perf);
31 void (*delete)(struct WU_SortinoRatio_* self);
32 double value; // Current Sortino ratio
33 WU_Mean mean;
34 // WU_StDev stdev;
35 WU_Downside downside; // Downside deviation tracker (negative returns)
36 double risk_free_rate; // Annual risk-free rate
37 double prev_value; // Previous portfolio value for return calc
38 int64_t count; // Number of returns observed
39 int64_t start_time; // First timestamp observed
40 int64_t end_time; // Last timestamp observed
41 WU_TimeUnit time_unit; // Time unit for period calculations
42}* WU_SortinoRatio;
43
44WU_SortinoRatio wu_sortino_ratio_new(double initial_value, double risk_free_rate);
45
46typedef struct WU_CalmarRatio_ {
47 double (*update)(struct WU_CalmarRatio_* self, WU_PerformanceUpdate perf);
48 void (*delete)(struct WU_CalmarRatio_* self);
49 double value; // Current Calmar ratio
50 WU_MaxDrawdown max_drawdown;
51 double initial_value; // Initial portfolio value
52 double prev_value; // Previous portfolio value for return calc
53 int64_t count; // Number of returns observed
54 int64_t start_time; // First timestamp observed
55 int64_t end_time; // Last timestamp observed
56 WU_TimeUnit time_unit; // Time unit for period calculations
57}* WU_CalmarRatio;
58
59WU_CalmarRatio wu_calmar_ratio_new(double initial_value);
60
61/**
62 * WU_PortfolioStats tracks portfolio state, positions, and trading statistics.
63 * This is the central source of knowledge about portfolio performance and holdings.
64 *
65 * Performance metrics (MaxDrawdown, Sharpe, Sortino, Calmar) are maintained as
66 * indicators that update sequentially with each portfolio value change.
67 */
68typedef struct WU_PortfolioStats_ {
69 void (*update)(struct WU_PortfolioStats_* stats, double cash,
70 double portfolio_value, WU_TimeStamp timestamp);
71 void (*record_trade)(struct WU_PortfolioStats_* stats, double pnl,
72 WU_CloseReason reason);
73 void (*update_position)(struct WU_PortfolioStats_* stats, int asset_index,
74 const char* symbol, double quantity, double value, double last_price);
75 char* (*to_keyvalue)(struct WU_PortfolioStats_* stats);
76 char* (*to_json)(struct WU_PortfolioStats_* stats, bool pretty);
77 void (*reset)(struct WU_PortfolioStats_* stats);
78 void (*delete)(struct WU_PortfolioStats_* stats);
79
80 // Portfolio state
85
86 // Cost tracking
89
90 // Trading statistics
91 int64_t total_trades;
97 double total_loss;
98 double max_win;
99 double max_loss;
100 double accum_pnl; // Accumulated PnL from all trades
101
102 // Position tracking (dynamic arrays)
103 char** symbols;
104 double* quantities;
105 double* values;
106 double* last_prices;
109
110 // Performance indicators (updated sequentially)
111 WU_MaxDrawdown max_drawdown;
112 WU_SharpeRatio sharpe_ratio;
113 WU_SortinoRatio sortino_ratio;
114 WU_CalmarRatio calmar_ratio;
115 WU_Mean mean;
116 WU_StDev stdev;
117}* WU_PortfolioStats;
118
119/**
120 * Creates a new WU_PortfolioStats instance.
121 *
122 * @param initial_cash Initial cash amount
123 * @param risk_free_rate Annual risk-free rate for Sharpe/Sortino calculations (e.g., 0.03 for 3%)
124 */
125WU_PortfolioStats wu_portfolio_stats_new(double initial_cash, double risk_free_rate);
126
127/**
128 * Updates portfolio state in stats.
129 */
130#define wu_portfolio_stats_update(stats, cash, value, timestamp) do { \
131 if ((stats)->update) \
132 (stats)->update((stats), (cash), (value), (timestamp)); \
133} while(0)
134
135/**
136 * Records a trade in the stats.
137 */
138#define wu_portfolio_stats_record_trade(stats, pnl, reason) do { \
139 if ((stats)->record_trade) \
140 (stats)->record_trade((stats), (pnl), (reason)); \
141} while(0)
142
143/**
144 * Updates position info for a specific asset.
145 */
146#define wu_portfolio_stats_update_position(stats, idx, sym, qty, val, price) do { \
147 if ((stats)->update_position) \
148 (stats)->update_position((stats), (idx), (sym), (qty), (val), (price)); \
149} while(0)
150
151/**
152 * Converts stats to key=value format string.
153 * Caller must free the returned string.
154 */
155#define wu_portfolio_stats_to_keyvalue(stats) \
156 ((stats)->to_keyvalue ? (stats)->to_keyvalue((stats)) : NULL)
157
158/**
159 * Converts stats to JSON format string.
160 * Caller must free the returned string.
161 */
162#define wu_portfolio_stats_to_json(stats, pretty) \
163 ((stats)->to_json ? (stats)->to_json((stats), (pretty)) : NULL)
164
165#define wu_portfolio_stats_reset(stats) do { \
166 if ((stats)->reset) \
167 (stats)->reset((stats)); \
168} while(0)
169
170#define wu_portfolio_stats_delete(stats) do { \
171 if ((stats) && (stats)->delete) \
172 (stats)->delete((stats)); \
173} while(0)
174
175#endif // _STATS_H_
WU_CalmarRatio wu_calmar_ratio_new(double initial_value)
Definition calmar.c:112
WU_SharpeRatio wu_sharpe_ratio_new(double initial_value, double risk_free_rate)
Creates a new Sharpe Ratio calculator.
Definition sharpe.c:106
WU_PortfolioStats wu_portfolio_stats_new(double initial_cash, double risk_free_rate)
Creates a new WU_PortfolioStats instance.
Definition stats.c:295
WU_SortinoRatio wu_sortino_ratio_new(double initial_value, double risk_free_rate)
Creates a new Sortino Ratio calculator.
Definition sortino.c:105
double initial_value
Definition stats.h:51
WU_MaxDrawdown max_drawdown
Definition stats.h:50
double(* update)(struct WU_CalmarRatio_ *self, WU_PerformanceUpdate perf)
Definition stats.h:47
double value
Definition stats.h:49
int64_t end_time
Definition stats.h:55
int64_t count
Definition stats.h:53
int64_t start_time
Definition stats.h:54
double prev_value
Definition stats.h:52
WU_TimeUnit time_unit
Definition stats.h:56
Performance Update - value and timestamp for performance metric calculations.
Definition indicators.h:239
WU_PortfolioStats tracks portfolio state, positions, and trading statistics.
Definition stats.h:68
int64_t losing_trades
Definition stats.h:93
double total_loss
Definition stats.h:97
double * quantities
Definition stats.h:104
double * values
Definition stats.h:105
double initial_cash
Definition stats.h:81
WU_StDev stdev
Definition stats.h:116
double total_profit
Definition stats.h:96
double accum_pnl
Definition stats.h:100
int64_t take_profit_exits
Definition stats.h:95
int64_t stop_loss_exits
Definition stats.h:94
void(* update_position)(struct WU_PortfolioStats_ *stats, int asset_index, const char *symbol, double quantity, double value, double last_price)
Definition stats.h:73
WU_SortinoRatio sortino_ratio
Definition stats.h:113
int64_t winning_trades
Definition stats.h:92
WU_TimeStamp last_update
Definition stats.h:84
double portfolio_value
Definition stats.h:83
void(* reset)(struct WU_PortfolioStats_ *stats)
Definition stats.h:77
double current_cash
Definition stats.h:82
WU_MaxDrawdown max_drawdown
Definition stats.h:111
WU_SharpeRatio sharpe_ratio
Definition stats.h:112
void(* update)(struct WU_PortfolioStats_ *stats, double cash, double portfolio_value, WU_TimeStamp timestamp)
Definition stats.h:69
char ** symbols
Definition stats.h:103
double * last_prices
Definition stats.h:106
int64_t total_trades
Definition stats.h:91
WU_CalmarRatio calmar_ratio
Definition stats.h:114
double max_loss
Definition stats.h:99
double accum_borrow_interest
Definition stats.h:88
void(* record_trade)(struct WU_PortfolioStats_ *stats, double pnl, WU_CloseReason reason)
Definition stats.h:71
double accum_tx_fees
Definition stats.h:87
double max_win
Definition stats.h:98
Sharpe ratio is the relation between the risk-free rate discounted retuns and the volatility of an in...
Definition stats.h:12
int64_t count
Definition stats.h:21
WU_TimeUnit time_unit
Definition stats.h:24
double value
Definition stats.h:15
double prev_value
Definition stats.h:20
WU_Mean mean
Definition stats.h:16
int64_t start_time
Definition stats.h:22
double initial_value
Definition stats.h:19
double(* update)(struct WU_SharpeRatio_ *self, WU_PerformanceUpdate perf)
Definition stats.h:13
WU_StDev stdev
Definition stats.h:17
int64_t end_time
Definition stats.h:23
double risk_free_rate
Definition stats.h:18
int64_t start_time
Definition stats.h:39
WU_Mean mean
Definition stats.h:33
int64_t count
Definition stats.h:38
double(* update)(struct WU_SortinoRatio_ *self, WU_PerformanceUpdate perf)
Definition stats.h:30
double prev_value
Definition stats.h:37
int64_t end_time
Definition stats.h:40
WU_TimeUnit time_unit
Definition stats.h:41
WU_Downside downside
Definition stats.h:35
double risk_free_rate
Definition stats.h:36
double value
Definition stats.h:32
A timestamp represent a mark in time given relative to unix epoch.
Definition timeutils.h:21
WU_TimeUnit
WU_TimeUnit represents a unit of time used for time-based calculations such as time-weighted returns ...
Definition timeutils.h:10
WU_CloseReason
WU_CloseReason represents the reason for closing a position, which can be a trading signal,...
Definition types.h:53