proof-of-portfolio 0.0.91__py3-none-any.whl → 0.0.92__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  # This file is auto-generated during build
2
- __version__ = "0.0.91"
2
+ __version__ = "0.0.92"
@@ -24,33 +24,71 @@ pub fn sortino(
24
24
  } else {
25
25
  let excess_return = ann_excess_return_val;
26
26
 
27
- let mut downside_variance_sum: u64 = 0;
28
- let mut negative_count: u32 = 0;
27
+ let mut weighted_sum_down: i64 = 0;
28
+ let mut sum_w_down: i64 = 0;
29
29
  let mut downside_returns_sum: i64 = 0;
30
+ let mut negative_count: u32 = 0;
30
31
 
31
32
  for i in 0..ARRAY_SIZE {
32
33
  if (i as u32) < actual_len {
33
34
  if log_returns[i] < DAILY_LOG_RISK_FREE_RATE {
34
35
  downside_returns_sum += log_returns[i];
35
- negative_count = negative_count + 1;
36
+ negative_count += 1;
37
+ if use_weighting {
38
+ weighted_sum_down += log_returns[i] * weights[i];
39
+ sum_w_down += weights[i];
40
+ }
36
41
  }
37
42
  }
38
43
  }
39
44
 
40
45
  if negative_count > 1 {
41
- let downside_mean = downside_returns_sum / (negative_count as i64);
46
+ let downside_mean = if use_weighting {
47
+ if sum_w_down != 0 {
48
+ weighted_sum_down / sum_w_down
49
+ } else {
50
+ 0
51
+ }
52
+ } else {
53
+ downside_returns_sum / (negative_count as i64)
54
+ };
42
55
 
43
- for i in 0..ARRAY_SIZE {
44
- if (i as u32) < actual_len {
45
- if log_returns[i] < DAILY_LOG_RISK_FREE_RATE {
46
- let diff = log_returns[i] - downside_mean;
47
- downside_variance_sum += ((diff * diff) as u64);
56
+ let downside_variance_pre = if use_weighting {
57
+ let mut weighted_sum_sq_diff: i64 = 0;
58
+ for i in 0..ARRAY_SIZE {
59
+ if (i as u32) < actual_len {
60
+ if log_returns[i] < DAILY_LOG_RISK_FREE_RATE {
61
+ let diff = log_returns[i] - downside_mean;
62
+ let sq_diff = (diff * diff) / 1000000;
63
+ weighted_sum_sq_diff += sq_diff * weights[i];
64
+ }
48
65
  }
49
66
  }
50
- }
67
+ if sum_w_down != 0 {
68
+ weighted_sum_sq_diff / sum_w_down
69
+ } else {
70
+ 0
71
+ }
72
+ } else {
73
+ let mut sum_sq_diff: i64 = 0;
74
+ for i in 0..ARRAY_SIZE {
75
+ if (i as u32) < actual_len {
76
+ if log_returns[i] < DAILY_LOG_RISK_FREE_RATE {
77
+ let diff = log_returns[i] - downside_mean;
78
+ let sq_diff = (diff * diff) / 1000000;
79
+ sum_sq_diff += sq_diff;
80
+ }
81
+ }
82
+ }
83
+ if negative_count > 0 {
84
+ sum_sq_diff / (negative_count as i64)
85
+ } else {
86
+ 0
87
+ }
88
+ };
51
89
 
52
- let downside_variance = downside_variance_sum / ((negative_count - 1) as u64);
53
- let downside_volatility = sqrt(downside_variance * (DAYS_IN_YEAR as u64)) as i64;
90
+ let annualized_variance = downside_variance_pre * (DAYS_IN_YEAR as i64) * 1000000;
91
+ let downside_volatility = sqrt(annualized_variance as u64) as i64;
54
92
 
55
93
  let effective_downside_volatility = if downside_volatility > SORTINO_DOWNSIDE_MINIMUM {
56
94
  downside_volatility
@@ -60,7 +98,7 @@ pub fn sortino(
60
98
 
61
99
  (excess_return * RATIO_SCALE_FACTOR) / effective_downside_volatility
62
100
  } else {
63
- LARGE_POSITIVE_VALUE
101
+ 0
64
102
  }
65
103
  }
66
104
  }
@@ -1,20 +1,17 @@
1
1
  use crate::utils::constants::SCALE;
2
2
 
3
3
  pub fn mdd_augmentation(drawdown_decimal: i64) -> i64 {
4
- let drawdown_factor = SCALE - drawdown_decimal;
4
+ let max_drawdown_percentage = 10;
5
5
 
6
- if (drawdown_factor <= 0) | (drawdown_factor > SCALE) {
6
+ if (drawdown_decimal <= 0) | (drawdown_decimal >= SCALE) {
7
7
  0
8
8
  } else {
9
- let drawdown_percentage = ((SCALE - drawdown_factor) * 100) / SCALE;
10
- let max_drawdown_percentage = 10;
9
+ let dd_percent = (drawdown_decimal * 100) / SCALE;
11
10
 
12
- if drawdown_percentage >= max_drawdown_percentage {
13
- 0
14
- } else if drawdown_percentage <= 0 {
11
+ if dd_percent <= 0 | dd_percent >= max_drawdown_percentage {
15
12
  0
16
13
  } else {
17
- SCALE / drawdown_percentage
14
+ SCALE / dd_percent
18
15
  }
19
16
  }
20
17
  }
@@ -55,11 +55,7 @@ pub fn variance(
55
55
  }
56
56
  }
57
57
 
58
- let denominator = if actual_len > ddof {
59
- (actual_len - ddof) as i64
60
- } else {
61
- 1
62
- };
58
+ let denominator = actual_len as i64;
63
59
  variance = sum_sq_diff / denominator;
64
60
  }
65
61
  }
@@ -28,7 +28,7 @@ pub fn weighting_distribution(actual_len: u32) -> [i64; ARRAY_SIZE] {
28
28
  for i in 0..ARRAY_SIZE {
29
29
  if (i as u32) < actual_len {
30
30
  let position_from_newest = (actual_len - 1) - (i as u32);
31
- let neg_x_scaled = -(decay_rate * (position_from_newest as i64)) / 1000;
31
+ let neg_x_scaled = -(decay_rate * (position_from_newest as i64)) / 1;
32
32
  let exp_val_scaled = exp_decay_scaled(neg_x_scaled);
33
33
 
34
34
  let weighted_val = (weight_range * exp_val_scaled) / scale;