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.
- proof_of_portfolio/_version.py +1 -1
- proof_of_portfolio/circuits/components/src/core/sortino.nr +51 -13
- proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr +5 -8
- proof_of_portfolio/circuits/components/src/utils/variance.nr +1 -5
- proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr +1 -1
- proof_of_portfolio/circuits/target/circuits.json +1 -1
- proof_of_portfolio/circuits/vk/vk +0 -0
- {proof_of_portfolio-0.0.91.dist-info → proof_of_portfolio-0.0.92.dist-info}/METADATA +1 -1
- {proof_of_portfolio-0.0.91.dist-info → proof_of_portfolio-0.0.92.dist-info}/RECORD +12 -12
- {proof_of_portfolio-0.0.91.dist-info → proof_of_portfolio-0.0.92.dist-info}/WHEEL +0 -0
- {proof_of_portfolio-0.0.91.dist-info → proof_of_portfolio-0.0.92.dist-info}/entry_points.txt +0 -0
- {proof_of_portfolio-0.0.91.dist-info → proof_of_portfolio-0.0.92.dist-info}/top_level.txt +0 -0
proof_of_portfolio/_version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# This file is auto-generated during build
|
2
|
-
__version__ = "0.0.
|
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
|
28
|
-
let mut
|
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
|
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 =
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
53
|
-
let downside_volatility = sqrt(
|
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
|
-
|
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
|
4
|
+
let max_drawdown_percentage = 10;
|
5
5
|
|
6
|
-
if (
|
6
|
+
if (drawdown_decimal <= 0) | (drawdown_decimal >= SCALE) {
|
7
7
|
0
|
8
8
|
} else {
|
9
|
-
let
|
10
|
-
let max_drawdown_percentage = 10;
|
9
|
+
let dd_percent = (drawdown_decimal * 100) / SCALE;
|
11
10
|
|
12
|
-
if
|
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 /
|
14
|
+
SCALE / dd_percent
|
18
15
|
}
|
19
16
|
}
|
20
17
|
}
|
@@ -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)) /
|
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;
|