proof-of-portfolio 0.0.93__tar.gz → 0.0.95__tar.gz

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.
Files changed (92) hide show
  1. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/PKG-INFO +1 -1
  2. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/_version.py +1 -1
  3. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/calmar.nr +23 -10
  4. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/omega.nr +43 -31
  5. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr +8 -7
  6. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr +7 -9
  7. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr +12 -7
  8. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/src/main.nr +18 -29
  9. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/target/circuits.json +1 -1
  10. proof_of_portfolio-0.0.95/proof_of_portfolio/circuits/vk/vk +0 -0
  11. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/proof_generator.py +41 -5
  12. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/PKG-INFO +1 -1
  13. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/pyproject.toml +1 -1
  14. proof_of_portfolio-0.0.93/proof_of_portfolio/circuits/vk/vk +0 -0
  15. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/README.md +0 -0
  16. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/__init__.py +0 -0
  17. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/analyze_data.py +0 -0
  18. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/Nargo.toml +0 -0
  19. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/Nargo.toml +0 -0
  20. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/drawdown.nr +0 -0
  21. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/merkle.nr +0 -0
  22. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/mod.nr +0 -0
  23. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/pnl_score.nr +0 -0
  24. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/position.nr +0 -0
  25. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/sharpe.nr +0 -0
  26. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/sortino.nr +0 -0
  27. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/core/tstat.nr +0 -0
  28. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/lib.nr +0 -0
  29. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/ann_volatility.nr +0 -0
  30. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/average.nr +0 -0
  31. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/constants.nr +0 -0
  32. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/mod.nr +0 -0
  33. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/sqrt.nr +0 -0
  34. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/components/src/utils/variance.nr +0 -0
  35. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/circuits/generate_inputs.py +0 -0
  36. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_calmar/Nargo.toml +0 -0
  37. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_calmar/src/main.nr +0 -0
  38. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_calmar/target/just_calmar.json +0 -0
  39. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_cps_to_log_return/Nargo.toml +0 -0
  40. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_cps_to_log_return/src/main.nr +0 -0
  41. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_cps_to_log_return/target/just_cps_to_log_return.json +0 -0
  42. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_drawdown/Nargo.toml +0 -0
  43. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_drawdown/src/main.nr +0 -0
  44. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_drawdown/target/just_drawdown.json +0 -0
  45. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_omega/Nargo.toml +0 -0
  46. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_omega/src/main.nr +0 -0
  47. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_omega/target/just_omega.json +0 -0
  48. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_pnl/Nargo.toml +0 -0
  49. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_pnl/src/main.nr +0 -0
  50. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sharpe/Nargo.toml +0 -0
  51. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sharpe/src/main.nr +0 -0
  52. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sharpe/target/just_sharpe.json +0 -0
  53. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sortino/Nargo.toml +0 -0
  54. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sortino/src/main.nr +0 -0
  55. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_sortino/target/just_sortino.json +0 -0
  56. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_tstat/Nargo.toml +0 -0
  57. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_tstat/src/main.nr +0 -0
  58. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/just_tstat/target/just_tstat.json +0 -0
  59. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/merkle_generator/Nargo.toml +0 -0
  60. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demo/merkle_generator/src/main.nr +0 -0
  61. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/all.py +0 -0
  62. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/calmar.py +0 -0
  63. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/drawdown.py +0 -0
  64. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/generate_input_data.py +0 -0
  65. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/log_returns.py +0 -0
  66. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/main.py +0 -0
  67. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/omega.py +0 -0
  68. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/sharpe.py +0 -0
  69. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/sortino.py +0 -0
  70. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/tstat.py +0 -0
  71. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/demos/utils.py +0 -0
  72. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/main.py +0 -0
  73. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/min_metrics.py +0 -0
  74. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/miner.py +0 -0
  75. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/parsing_utils.py +0 -0
  76. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/post_install.py +0 -0
  77. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/returns_generator/Nargo.toml +0 -0
  78. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/returns_generator/src/main.nr +0 -0
  79. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/returns_generator/target/returns_generator.json +0 -0
  80. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/signal_processor.py +0 -0
  81. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/tree_generator/Nargo.toml +0 -0
  82. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/tree_generator/src/main.nr +0 -0
  83. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/tree_generator/target/tree_generator.json +0 -0
  84. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/tree_generator/target.gz +0 -0
  85. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio/validator.py +0 -0
  86. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/SOURCES.txt +0 -0
  87. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/dependency_links.txt +0 -0
  88. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/entry_points.txt +0 -0
  89. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/requires.txt +0 -0
  90. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/proof_of_portfolio.egg-info/top_level.txt +0 -0
  91. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/setup.cfg +0 -0
  92. {proof_of_portfolio-0.0.93 → proof_of_portfolio-0.0.95}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proof-of-portfolio
3
- Version: 0.0.93
3
+ Version: 0.0.95
4
4
  Summary: Zero-Knowledge Proof framework for verifiable, private portfolio performance metrics
5
5
  Author-email: "Inference Labs, Inc." <info@inferencelabs.com>
6
6
  Requires-Python: >=3.10
@@ -1,2 +1,2 @@
1
1
  # This file is auto-generated during build
2
- __version__ = "0.0.93"
2
+ __version__ = "0.0.95"
@@ -1,7 +1,6 @@
1
1
  use crate::utils::{
2
- ann_excess_return::ann_excess_return,
3
2
  constants::{
4
- ARRAY_SIZE, CALMAR_NOCONFIDENCE_VALUE, LARGE_POSITIVE_VALUE, RATIO_SCALE_FACTOR, SCALE,
3
+ ARRAY_SIZE, CALMAR_NOCONFIDENCE_VALUE, RATIO_SCALE_FACTOR, SCALE,
5
4
  STATISTICAL_CONFIDENCE_MINIMUM_N,
6
5
  },
7
6
  risk_normalization::risk_normalization,
@@ -11,31 +10,33 @@ use super::drawdown::daily_max_drawdown;
11
10
  pub fn calmar(
12
11
  log_returns: [i64; ARRAY_SIZE],
13
12
  actual_len: u32,
14
- RISK_FREE_RATE: i64,
13
+ annual_risk_free: i64,
15
14
  weights: [i64; ARRAY_SIZE],
16
15
  use_weighting: bool,
17
16
  bypass_confidence: bool,
18
17
  avg_daily_return: i64,
19
18
  variance_val: i64,
20
19
  ann_excess_return_val: i64,
20
+ calmar_cap: i64,
21
+ days_in_year: i64,
22
+ drawdown_max_percent: i64,
21
23
  ) -> i64 {
22
24
  if !bypass_confidence & actual_len < STATISTICAL_CONFIDENCE_MINIMUM_N {
23
25
  CALMAR_NOCONFIDENCE_VALUE
24
26
  } else {
25
- let base_return_percentage = (avg_daily_return * 365 * 100) / SCALE;
27
+ let base_return_percentage = (avg_daily_return * days_in_year * 100) / SCALE;
26
28
  let max_drawdown_decimal = daily_max_drawdown(log_returns, actual_len);
27
- let drawdown_normalization_factor = risk_normalization(max_drawdown_decimal);
29
+ let drawdown_normalization_factor =
30
+ risk_normalization(max_drawdown_decimal, drawdown_max_percent);
28
31
 
29
32
  if drawdown_normalization_factor == 0 {
30
33
  0
31
34
  } else {
32
- let raw_calmar = ((base_return_percentage * drawdown_normalization_factor) / SCALE)
33
- * RATIO_SCALE_FACTOR;
34
- let calmar_cap = 10 * RATIO_SCALE_FACTOR;
35
+ let raw_calmar = base_return_percentage * drawdown_normalization_factor;
35
36
  if raw_calmar > calmar_cap {
36
- calmar_cap
37
+ calmar_cap * RATIO_SCALE_FACTOR
37
38
  } else {
38
- raw_calmar
39
+ raw_calmar * RATIO_SCALE_FACTOR
39
40
  }
40
41
  }
41
42
  }
@@ -67,6 +68,9 @@ fn test_calmar_normal_case() {
67
68
  avg,
68
69
  variance_val,
69
70
  ann_excess,
71
+ 1,
72
+ 365,
73
+ 10,
70
74
  );
71
75
  assert(result != 0);
72
76
  }
@@ -91,6 +95,9 @@ fn test_calmar_insufficient_data() {
91
95
  avg,
92
96
  variance_val,
93
97
  ann_excess,
98
+ 1,
99
+ 365,
100
+ 10,
94
101
  );
95
102
  assert(result == 0);
96
103
  }
@@ -116,6 +123,9 @@ fn test_calmar_exactly_30_days() {
116
123
  avg,
117
124
  variance_val,
118
125
  ann_excess,
126
+ 1,
127
+ 365,
128
+ 10,
119
129
  );
120
130
  assert(result != 0);
121
131
  }
@@ -141,6 +151,9 @@ fn test_calmar_negative_returns() {
141
151
  avg,
142
152
  variance_val,
143
153
  ann_excess,
154
+ 1,
155
+ 365,
156
+ 10,
144
157
  );
145
158
  assert(result != 0);
146
159
  }
@@ -1,6 +1,5 @@
1
1
  use crate::utils::constants::{
2
- ARRAY_SIZE, LARGE_POSITIVE_VALUE, OMEGA_LOSS_MINIMUM, OMEGA_NOCONFIDENCE_VALUE,
3
- OMEGA_SCALE_FACTOR, RATIO_SCALE_FACTOR, STATISTICAL_CONFIDENCE_MINIMUM_N,
2
+ ARRAY_SIZE, OMEGA_NOCONFIDENCE_VALUE, RATIO_SCALE_FACTOR, STATISTICAL_CONFIDENCE_MINIMUM_N,
4
3
  };
5
4
 
6
5
  pub fn omega(
@@ -9,6 +8,7 @@ pub fn omega(
9
8
  weights: [i64; ARRAY_SIZE],
10
9
  use_weighting: bool,
11
10
  bypass_confidence: bool,
11
+ omega_loss_min: i64,
12
12
  ) -> i64 {
13
13
  if !bypass_confidence & actual_len < STATISTICAL_CONFIDENCE_MINIMUM_N {
14
14
  OMEGA_NOCONFIDENCE_VALUE
@@ -33,46 +33,58 @@ pub fn omega(
33
33
  }
34
34
  }
35
35
 
36
- if sum_weights_positive == 0 {
37
- sum_weights_positive = OMEGA_LOSS_MINIMUM;
38
- }
39
- if sum_weights_negative == 0 {
40
- sum_weights_negative = OMEGA_LOSS_MINIMUM;
41
- }
42
-
43
- let positive_sum_u128 = (product_sum_positive as u128) * (sum_weights_negative as u128);
44
- let negative_sum_u128 = ((-product_sum_negative) as u128) * (sum_weights_positive as u128);
45
-
46
- let positive_sum = (positive_sum_u128 / 1000000) as i64;
47
- let negative_sum = (negative_sum_u128 / 1000000) as i64;
36
+ let mean_pos = if sum_weights_positive != 0 {
37
+ product_sum_positive / sum_weights_positive
38
+ } else {
39
+ 0
40
+ };
41
+ let mean_neg = if sum_weights_negative != 0 {
42
+ (-product_sum_negative) / sum_weights_negative
43
+ } else {
44
+ 0
45
+ };
48
46
 
49
- let effective_denominator = if negative_sum >= OMEGA_LOSS_MINIMUM {
50
- negative_sum
47
+ let effective_denominator = if mean_neg >= omega_loss_min {
48
+ mean_neg
51
49
  } else {
52
- OMEGA_LOSS_MINIMUM
50
+ omega_loss_min
53
51
  };
54
- let final_calc = ((positive_sum as u128) * (RATIO_SCALE_FACTOR as u128)) / (effective_denominator as u128);
55
- final_calc as i64
52
+ (mean_pos * RATIO_SCALE_FACTOR) / effective_denominator
56
53
  } else {
57
- let mut positive_sum: u64 = 0;
58
- let mut negative_sum: u64 = 0;
54
+ let mut positive_sum: i64 = 0;
55
+ let mut negative_sum: i64 = 0;
56
+ let mut count_pos: u32 = 0;
57
+ let mut count_neg: u32 = 0;
59
58
 
60
59
  for i in 0..ARRAY_SIZE {
61
60
  if (i as u32) < actual_len {
62
61
  if log_returns[i] > 0 {
63
- positive_sum = positive_sum + (log_returns[i] as u64);
62
+ positive_sum += log_returns[i];
63
+ count_pos += 1;
64
64
  } else if log_returns[i] < 0 {
65
- negative_sum = negative_sum + ((-log_returns[i]) as u64);
65
+ negative_sum += (-log_returns[i]);
66
+ count_neg += 1;
66
67
  }
67
68
  }
68
69
  }
69
70
 
70
- let effective_denominator = if negative_sum >= OMEGA_LOSS_MINIMUM as u64 {
71
- negative_sum
71
+ let mean_pos = if count_pos > 0 {
72
+ positive_sum / (count_pos as i64)
73
+ } else {
74
+ 0
75
+ };
76
+ let mean_neg = if count_neg > 0 {
77
+ negative_sum / (count_neg as i64)
78
+ } else {
79
+ 0
80
+ };
81
+
82
+ let effective_denominator = if mean_neg >= omega_loss_min {
83
+ mean_neg
72
84
  } else {
73
- OMEGA_LOSS_MINIMUM as u64
85
+ omega_loss_min
74
86
  };
75
- ((positive_sum * RATIO_SCALE_FACTOR as u64) / effective_denominator) as i64
87
+ (mean_pos * RATIO_SCALE_FACTOR) / effective_denominator
76
88
  }
77
89
  }
78
90
  }
@@ -85,7 +97,7 @@ fn test_omega_all_positive() {
85
97
  }
86
98
 
87
99
  let weights = [100000; ARRAY_SIZE];
88
- let result = omega(returns, 5, weights, false, false);
100
+ let result = omega(returns, 5, weights, false, false, 10000000);
89
101
  assert(result == 10000000);
90
102
  }
91
103
 
@@ -97,7 +109,7 @@ fn test_omega_all_negative() {
97
109
  }
98
110
 
99
111
  let weights = [100000; ARRAY_SIZE];
100
- let result = omega(returns, 5, weights, false, false);
112
+ let result = omega(returns, 5, weights, false, false, 10000000);
101
113
  assert(result == 0);
102
114
  }
103
115
 
@@ -110,7 +122,7 @@ fn test_omega_mixed_returns() {
110
122
  returns[3] = -300;
111
123
 
112
124
  let weights = [100000; ARRAY_SIZE];
113
- let result = omega(returns, 4, weights, false, false);
125
+ let result = omega(returns, 4, weights, false, false, 10000000);
114
126
  assert(result == 22500000);
115
127
  }
116
128
 
@@ -122,6 +134,6 @@ fn test_omega_zero_returns() {
122
134
  }
123
135
 
124
136
  let weights = [100000; ARRAY_SIZE];
125
- let result = omega(returns, 5, weights, false, false);
137
+ let result = omega(returns, 5, weights, false, false, 10000000);
126
138
  assert(result == 10000000);
127
139
  }
@@ -3,9 +3,10 @@ use crate::utils::{average::average, constants::{ARRAY_SIZE, DAYS_IN_YEAR}};
3
3
  pub fn ann_excess_return(
4
4
  log_returns: [i64; ARRAY_SIZE],
5
5
  actual_len: u32,
6
- RISK_FREE_RATE: i64,
6
+ annual_risk_free: i64,
7
7
  weights: [i64; ARRAY_SIZE],
8
8
  use_weighting: bool,
9
+ days_in_year: i64,
9
10
  ) -> i64 {
10
11
  let sum_of_weights = if use_weighting {
11
12
  let mut sum: i64 = 0;
@@ -25,8 +26,8 @@ pub fn ann_excess_return(
25
26
  use_weighting,
26
27
  sum_of_weights,
27
28
  );
28
- let annualized = avg * DAYS_IN_YEAR;
29
- annualized - RISK_FREE_RATE
29
+ let annualized = avg * days_in_year;
30
+ annualized - annual_risk_free
30
31
  }
31
32
 
32
33
  #[test]
@@ -37,7 +38,7 @@ fn test_ann_excess_return_positive() {
37
38
  returns[2] = 150;
38
39
 
39
40
  let weights = [100000; ARRAY_SIZE];
40
- let result = ann_excess_return(returns, 3, 10000, weights, false);
41
+ let result = ann_excess_return(returns, 3, 10000, weights, false, 365);
41
42
  assert(result > 0);
42
43
  }
43
44
 
@@ -49,7 +50,7 @@ fn test_ann_excess_return_negative() {
49
50
  returns[2] = -150;
50
51
 
51
52
  let weights = [100000; ARRAY_SIZE];
52
- let result = ann_excess_return(returns, 3, 10000, weights, false);
53
+ let result = ann_excess_return(returns, 3, 10000, weights, false, 365);
53
54
  assert(result < 0);
54
55
  }
55
56
 
@@ -61,7 +62,7 @@ fn test_ann_excess_return_equal_to_risk_free() {
61
62
  returns[2] = 100;
62
63
 
63
64
  let weights = [100000; ARRAY_SIZE];
64
- let result = ann_excess_return(returns, 3, 36500, weights, false);
65
+ let result = ann_excess_return(returns, 3, 36500, weights, false, 365);
65
66
  assert(result == 0);
66
67
  }
67
68
 
@@ -72,6 +73,6 @@ fn test_ann_excess_return_zero_risk_free() {
72
73
  returns[1] = 200;
73
74
 
74
75
  let weights = [100000; ARRAY_SIZE];
75
- let result = ann_excess_return(returns, 2, 0, weights, false);
76
+ let result = ann_excess_return(returns, 2, 0, weights, false, 365);
76
77
  assert(result == 54750);
77
78
  }
@@ -1,8 +1,6 @@
1
1
  use crate::utils::constants::SCALE;
2
2
 
3
- pub fn mdd_augmentation(drawdown_decimal: i64) -> i64 {
4
- let max_drawdown_percentage = 10;
5
-
3
+ pub fn mdd_augmentation(drawdown_decimal: i64, max_drawdown_percentage: i64) -> i64 {
6
4
  if (drawdown_decimal <= 0) | (drawdown_decimal >= SCALE) {
7
5
  0
8
6
  } else {
@@ -16,27 +14,27 @@ pub fn mdd_augmentation(drawdown_decimal: i64) -> i64 {
16
14
  }
17
15
  }
18
16
 
19
- pub fn risk_normalization(drawdown_decimal: i64) -> i64 {
20
- mdd_augmentation(drawdown_decimal)
17
+ pub fn risk_normalization(drawdown_decimal: i64, max_drawdown_percentage: i64) -> i64 {
18
+ mdd_augmentation(drawdown_decimal, max_drawdown_percentage)
21
19
  }
22
20
 
23
21
  #[test]
24
22
  fn test_risk_normalization_zero_drawdown() {
25
- let result = risk_normalization(0);
23
+ let result = risk_normalization(0, 10);
26
24
  assert(result == 0);
27
25
  }
28
26
 
29
27
  #[test]
30
28
  fn test_risk_normalization_high_drawdown() {
31
29
  let drawdown_15_percent = (15 * SCALE) / 100;
32
- let result = risk_normalization(drawdown_15_percent);
30
+ let result = risk_normalization(drawdown_15_percent, 10);
33
31
  assert(result == 0);
34
32
  }
35
33
 
36
34
  #[test]
37
35
  fn test_risk_normalization_low_drawdown() {
38
36
  let drawdown_2_percent = (2 * SCALE) / 100;
39
- let result = risk_normalization(drawdown_2_percent);
37
+ let result = risk_normalization(drawdown_2_percent, 10);
40
38
  let expected = SCALE / 2;
41
39
  assert(result == expected);
42
40
  }
@@ -44,6 +42,6 @@ fn test_risk_normalization_low_drawdown() {
44
42
  #[test]
45
43
  fn test_risk_normalization_max_threshold() {
46
44
  let drawdown_10_percent = (10 * SCALE) / 100;
47
- let result = risk_normalization(drawdown_10_percent);
45
+ let result = risk_normalization(drawdown_10_percent, 10);
48
46
  assert(result == 0);
49
47
  }
@@ -1,4 +1,4 @@
1
- use crate::utils::constants::ARRAY_SIZE;
1
+ use crate::utils::constants::{ARRAY_SIZE, SCALE};
2
2
 
3
3
  fn exp_decay_scaled(neg_x_scaled: i64) -> i64 {
4
4
  let scale: i64 = 100000;
@@ -17,18 +17,23 @@ fn exp_decay_scaled(neg_x_scaled: i64) -> i64 {
17
17
  }
18
18
  }
19
19
 
20
- pub fn weighting_distribution(actual_len: u32) -> [i64; ARRAY_SIZE] {
20
+ pub fn weighting_distribution(
21
+ actual_len: u32,
22
+ weighted_decay_max: i64,
23
+ weighted_decay_min: i64,
24
+ weighted_decay_rate: i64,
25
+ ) -> [i64; ARRAY_SIZE] {
21
26
  let mut weights = [0; ARRAY_SIZE];
22
- let max_weight: i64 = 100000;
23
- let min_weight: i64 = 15000;
24
- let decay_rate: i64 = 7500;
27
+ let max_weight = weighted_decay_max;
28
+ let min_weight = weighted_decay_min;
29
+ let decay_rate = weighted_decay_rate;
25
30
  let weight_range = max_weight - min_weight;
26
- let scale: i64 = 100000;
31
+ let scale = SCALE;
27
32
 
28
33
  for i in 0..ARRAY_SIZE {
29
34
  if (i as u32) < actual_len {
30
35
  let position_from_newest = (actual_len - 1) - (i as u32);
31
- let neg_x_scaled = -(decay_rate * (position_from_newest as i64)) / 1;
36
+ let neg_x_scaled = -(decay_rate * (position_from_newest as i64));
32
37
  let exp_val_scaled = exp_decay_scaled(neg_x_scaled);
33
38
 
34
39
  let weighted_val = (weight_range * exp_val_scaled) / scale;
@@ -8,24 +8,28 @@ use components::core::merkle::{
8
8
  use components::utils::{
9
9
  ann_excess_return::ann_excess_return,
10
10
  average::average,
11
- constants::{ARRAY_SIZE, MAX_DAYS, MAX_RETURNS, MAX_SIGNALS, MERKLE_DEPTH, SCALE},
11
+ constants::{ARRAY_SIZE, MAX_DAYS, MAX_RETURNS, MAX_SIGNALS, MERKLE_DEPTH},
12
12
  variance::variance,
13
- weighting_distribution::weighting_distribution,
14
13
  };
15
14
 
16
15
  fn main(
17
16
  log_returns: [i64; MAX_DAYS],
18
17
  n_returns: u32,
18
+ daily_pnl: [i64; ARRAY_SIZE],
19
+ n_pnl: u32,
19
20
  signals: [TradingSignal; MAX_SIGNALS],
20
21
  signals_count: u32,
21
22
  path_elements: [[Field; MERKLE_DEPTH]; MAX_SIGNALS],
22
23
  path_indices: [[Field; MERKLE_DEPTH]; MAX_SIGNALS],
23
24
  signals_merkle_root: pub Field,
24
- risk_free_rate: pub i64,
25
25
  use_weighting: bool,
26
26
  bypass_confidence: pub bool,
27
- account_size: i64,
28
27
  weights: [i64; ARRAY_SIZE],
28
+ calmar_cap: i64,
29
+ days_in_year: i64,
30
+ omega_loss_min: i64,
31
+ annual_risk_free: i64,
32
+ drawdown_max_percent: i64,
29
33
  ) -> pub [Field; 9] {
30
34
  // Verify all trading signals are included in the merkle tree
31
35
  let mut all_verified = true;
@@ -92,37 +96,18 @@ fn main(
92
96
  let ann_excess_return_val = ann_excess_return(
93
97
  returns_array,
94
98
  n_returns,
95
- risk_free_rate,
99
+ annual_risk_free,
96
100
  weights,
97
101
  use_weighting,
102
+ days_in_year,
98
103
  );
99
104
 
100
- let mut daily_pnl_array = [0; ARRAY_SIZE];
101
- for i in 0..MAX_DAYS {
102
- if (i as u32) < n_returns {
103
- let log_return = returns_array[i];
104
- let x_squared = (log_return * log_return) / SCALE;
105
- let x_cubed = (x_squared * log_return) / SCALE;
106
- let x_fourth = (x_cubed * log_return) / SCALE;
107
- let x_fifth = (x_fourth * log_return) / SCALE;
108
- let exp_minus_one =
109
- log_return + (x_squared / 2) + (x_cubed / 6) + (x_fourth / 24) + (x_fifth / 120);
110
- daily_pnl_array[i] = (exp_minus_one * account_size) / SCALE;
111
- }
112
- }
113
-
114
- let avg_daily_pnl = average(
115
- daily_pnl_array,
116
- n_returns,
117
- weights,
118
- use_weighting,
119
- sum_of_weights,
120
- );
105
+ let avg_daily_pnl = average(daily_pnl, n_pnl, weights, use_weighting, sum_of_weights);
121
106
 
122
107
  let sharpe_ratio = sharpe(
123
108
  returns_array,
124
109
  n_returns,
125
- risk_free_rate,
110
+ annual_risk_free,
126
111
  weights,
127
112
  use_weighting,
128
113
  bypass_confidence,
@@ -134,13 +119,16 @@ fn main(
134
119
  let calmar_ratio = calmar(
135
120
  returns_array,
136
121
  n_returns,
137
- risk_free_rate,
122
+ annual_risk_free,
138
123
  weights,
139
124
  use_weighting,
140
125
  bypass_confidence,
141
126
  avg_daily_return,
142
127
  variance_val,
143
128
  ann_excess_return_val,
129
+ calmar_cap,
130
+ days_in_year,
131
+ drawdown_max_percent,
144
132
  );
145
133
  let omega_ratio = omega(
146
134
  returns_array,
@@ -148,11 +136,12 @@ fn main(
148
136
  weights,
149
137
  use_weighting,
150
138
  bypass_confidence,
139
+ omega_loss_min,
151
140
  );
152
141
  let sortino_ratio = sortino(
153
142
  returns_array,
154
143
  n_returns,
155
- risk_free_rate,
144
+ annual_risk_free,
156
145
  weights,
157
146
  use_weighting,
158
147
  bypass_confidence,