24#define SORTINO_MIN_OBSERVATIONS 30
31 if (!self)
return NAN;
36 if (self->count == 0) {
39 self->prev_value = portfolio_value;
46 double ret = (portfolio_value - self->prev_value) / self->prev_value;
47 self->prev_value = portfolio_value;
62 if (isnan(downside_dev) || downside_dev <= 0.0) {
70 double periods_elapsed = self->end_time - self->start_time;
73 if (periods_elapsed <= 0) {
79 double periods_per_year = (annualization_factor * self->count)
81 if (periods_per_year <= 0) {
86 double annualized_downside_dev = downside_dev * sqrt(periods_per_year);
87 double per_period_rf = self->risk_free_rate / periods_per_year;
88 self->value = (mean - per_period_rf) / annualized_downside_dev;
106 double risk_free_rate) {
108 if (!sr)
return NULL;
112 fprintf(stderr,
"Sortino Ratio Error: mean object creation failed\n");
119 fprintf(stderr,
"Sortino Ratio Error: downside object creation failed\n");
125 sr->risk_free_rate = risk_free_rate;
127 sr->prev_value = initial_value;
#define wu_indicator_delete(indicator)
Delete the indicator and free any resources allocated by it.
#define wu_indicator_update(indicator, value)
Header file for technical indicators.
WU_Downside wu_downside_new(void)
Creates a new WU_Downside indicator.
WU_Mean wu_mean_new(void)
Creates a new WU_Mean indicator.
static double wu_sortino_ratio_update(WU_SortinoRatio self, WU_PerformanceUpdate perf)
Updates the Sortino Ratio calculation with a new portfolio value.
static void wu_sortino_ratio_free(WU_SortinoRatio self)
Frees resources allocated by the Sortino Ratio object.
WU_SortinoRatio wu_sortino_ratio_new(double initial_value, double risk_free_rate)
Creates a new Sortino Ratio calculator.
#define SORTINO_MIN_OBSERVATIONS
The Sortino Ratio is a variation of the Sharpe Ratio that differentiates between harmful volatility (...
double wu_annualization_factor(WU_TimeUnit unit)
Returns the number of units (seconds, millis, micros, or nanos) contained in a year.