proof-of-portfolio 0.0.94__py3-none-any.whl → 0.0.96__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/__init__.py +59 -11
- proof_of_portfolio/_version.py +1 -1
- proof_of_portfolio/circuits/components/src/core/calmar.nr +16 -6
- proof_of_portfolio/circuits/components/src/core/omega.nr +10 -10
- proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr +8 -7
- proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr +7 -9
- proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr +12 -7
- proof_of_portfolio/circuits/src/main.nr +16 -29
- proof_of_portfolio/circuits/target/circuits.json +1 -1
- proof_of_portfolio/circuits/vk/vk +0 -0
- proof_of_portfolio/proof_generator.py +38 -5
- {proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/METADATA +1 -1
- {proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/RECORD +16 -16
- {proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/WHEEL +0 -0
- {proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/entry_points.txt +0 -0
- {proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/top_level.txt +0 -0
Binary file
|
@@ -7,6 +7,8 @@ import json
|
|
7
7
|
import bittensor as bt
|
8
8
|
import traceback
|
9
9
|
|
10
|
+
|
11
|
+
ARRAY_SIZE = 256
|
10
12
|
MAX_DAYS = 120
|
11
13
|
MAX_SIGNALS = 256
|
12
14
|
MERKLE_DEPTH = 8
|
@@ -176,9 +178,21 @@ def generate_bb_proof(circuit_dir):
|
|
176
178
|
|
177
179
|
def generate_proof(
|
178
180
|
data=None,
|
181
|
+
daily_pnl=None,
|
179
182
|
miner_hotkey=None,
|
180
183
|
verbose=None,
|
181
184
|
annual_risk_free_percentage=4.19,
|
185
|
+
calmar_ratio_cap=10,
|
186
|
+
days_in_year_crypto=365,
|
187
|
+
weighted_average_decay_max=1.0,
|
188
|
+
weighted_average_decay_min=0.15,
|
189
|
+
weighted_average_decay_rate=0.075,
|
190
|
+
omega_loss_minimum=0.01,
|
191
|
+
sharpe_stddev_minimum=0.01,
|
192
|
+
sortino_downside_minimum=0.01,
|
193
|
+
statistical_confidence_minimum_n_ceil=60,
|
194
|
+
annual_risk_free_decimal=0.0419,
|
195
|
+
drawdown_maxvalue_percentage=10,
|
182
196
|
use_weighting=False,
|
183
197
|
bypass_confidence=False,
|
184
198
|
daily_checkpoints=2,
|
@@ -199,7 +213,6 @@ def generate_proof(
|
|
199
213
|
"info",
|
200
214
|
f"Mode: {'Demo' if is_demo_mode else 'Production'}, verbose={verbose}",
|
201
215
|
)
|
202
|
-
|
203
216
|
try:
|
204
217
|
if data is None:
|
205
218
|
log_verbose(
|
@@ -210,6 +223,11 @@ def generate_proof(
|
|
210
223
|
except Exception as e:
|
211
224
|
bt.logging.error(f"Failed to load data {e}")
|
212
225
|
|
226
|
+
if data is None:
|
227
|
+
raise ValueError(
|
228
|
+
"Failed to load data from validator_checkpoint.json in demo mode"
|
229
|
+
)
|
230
|
+
|
213
231
|
if miner_hotkey is None:
|
214
232
|
miner_hotkey = list(data["perf_ledgers"].keys())[0]
|
215
233
|
log_verbose(
|
@@ -225,6 +243,11 @@ def generate_proof(
|
|
225
243
|
f"Hotkey '{miner_hotkey}' not found in data. Available: {list(data['perf_ledgers'].keys())}"
|
226
244
|
)
|
227
245
|
|
246
|
+
if daily_pnl is None:
|
247
|
+
raise ValueError("daily_pnl must be provided")
|
248
|
+
n_pnl = len(daily_pnl)
|
249
|
+
scaled_daily_pnl = [int(p * SCALING_FACTOR) for p in daily_pnl]
|
250
|
+
scaled_daily_pnl += [0] * (ARRAY_SIZE - n_pnl)
|
228
251
|
positions = data["positions"][miner_hotkey]["positions"]
|
229
252
|
log_verbose(verbose, "info", "Preparing circuit inputs...")
|
230
253
|
|
@@ -382,15 +405,17 @@ def generate_proof(
|
|
382
405
|
main_circuit_dir = os.path.join(current_dir, "circuits")
|
383
406
|
|
384
407
|
# Pass annual risk-free rate (to match ann_excess_return usage)
|
385
|
-
annual_risk_free_decimal =
|
408
|
+
annual_risk_free_decimal = annual_risk_free_decimal
|
386
409
|
risk_free_rate_scaled = int(annual_risk_free_decimal * SCALING_FACTOR)
|
387
|
-
calmar_cap = int(data.get("calmar_cap", 1) * SCALING_FACTOR)
|
388
410
|
|
411
|
+
calmar_cap = int(calmar_ratio_cap * RATIO_SCALE_FACTOR)
|
389
412
|
account_size = data.get("account_size", 250000)
|
390
413
|
# Finally, LFG
|
391
414
|
main_prover_input = {
|
392
415
|
"log_returns": [str(r) for r in scaled_log_returns],
|
393
416
|
"n_returns": str(n_returns),
|
417
|
+
"daily_pnl": [str(p) for p in scaled_daily_pnl],
|
418
|
+
"n_pnl": str(n_pnl),
|
394
419
|
"signals": signals,
|
395
420
|
"signals_count": str(signals_count),
|
396
421
|
"path_elements": [
|
@@ -420,6 +445,16 @@ def generate_proof(
|
|
420
445
|
"bypass_confidence": str(int(bypass_confidence)),
|
421
446
|
"account_size": str(account_size),
|
422
447
|
"calmar_cap": str(calmar_cap),
|
448
|
+
"days_in_year": str(days_in_year_crypto),
|
449
|
+
"weighted_decay_max": str(int(weighted_average_decay_max * SCALING_FACTOR)),
|
450
|
+
"weighted_decay_min": str(int(weighted_average_decay_min * SCALING_FACTOR)),
|
451
|
+
"weighted_decay_rate": str(int(weighted_average_decay_rate * SCALING_FACTOR)),
|
452
|
+
"omega_loss_min": str(int(omega_loss_minimum * SCALING_FACTOR)),
|
453
|
+
"sharpe_stddev_min": str(int(sharpe_stddev_minimum * SCALING_FACTOR)),
|
454
|
+
"sortino_downside_min": str(int(sortino_downside_minimum * SCALING_FACTOR)),
|
455
|
+
"stat_conf_min_n": str(statistical_confidence_minimum_n_ceil),
|
456
|
+
"annual_risk_free": str(int(annual_risk_free_decimal * SCALING_FACTOR)),
|
457
|
+
"drawdown_max_percent": str(drawdown_maxvalue_percentage),
|
423
458
|
}
|
424
459
|
|
425
460
|
os.makedirs(main_circuit_dir, exist_ok=True)
|
@@ -482,8 +517,6 @@ def generate_proof(
|
|
482
517
|
else:
|
483
518
|
returns_merkle_root = f"0x{int(returns_merkle_root_raw):x}"
|
484
519
|
|
485
|
-
RATIO_SCALE_FACTOR = 1_000_000
|
486
|
-
|
487
520
|
avg_daily_pnl_scaled = avg_daily_pnl_value / SCALING_FACTOR
|
488
521
|
avg_daily_pnl_ptn_scaled = avg_daily_pnl_scaled * 365 * 100
|
489
522
|
sharpe_ratio_scaled = sharpe_ratio_raw / RATIO_SCALE_FACTOR
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: proof-of-portfolio
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.96
|
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,40 +1,40 @@
|
|
1
|
-
proof_of_portfolio/__init__.py,sha256=
|
2
|
-
proof_of_portfolio/_version.py,sha256=
|
1
|
+
proof_of_portfolio/__init__.py,sha256=mJ7dM5nXtvzx19SMjuBU1PyI3ZEa2CYsLO24FLjaDRQ,7195
|
2
|
+
proof_of_portfolio/_version.py,sha256=utKfDEZlb2GXHWrLXD-fMtiqFDR6AadXdowo5a_5xx4,66
|
3
3
|
proof_of_portfolio/analyze_data.py,sha256=t80ueFtBUzcWTrPiamiC1HXvw5Em-151zXJx0cCk8sQ,3709
|
4
4
|
proof_of_portfolio/main.py,sha256=JbvdAK7B6hw2sQdjT0EVCiglCQZgN3urKphdeWcW43w,30994
|
5
5
|
proof_of_portfolio/min_metrics.py,sha256=U16B7YRl0UbCterdJ1ksqFOxR5DiQeslUzMVGEWNyog,13211
|
6
6
|
proof_of_portfolio/miner.py,sha256=eGXcPMRQVAepzXJj1ePbbDAf-72E9Yj9n-yfP7GohLw,17177
|
7
7
|
proof_of_portfolio/parsing_utils.py,sha256=Hx61Sby5mEbC6uzhG9G69K7YPCLbjU6vK8fazpNBeLc,6463
|
8
8
|
proof_of_portfolio/post_install.py,sha256=e-57Z_h-svQdjA8ibsM985MXmdV6-KLyymQm3Cgu8YM,5654
|
9
|
-
proof_of_portfolio/proof_generator.py,sha256=
|
9
|
+
proof_of_portfolio/proof_generator.py,sha256=66-IzOSUKL71pR3qKifb96UisKVZdVdhmBCDX0JSPQw,23105
|
10
10
|
proof_of_portfolio/signal_processor.py,sha256=JQjnkMJEbv_MWIgKNrjKjrBIcIT5pAkAlCneEOGsqT0,6702
|
11
11
|
proof_of_portfolio/validator.py,sha256=kt3BeaXOffv-h52PZBKV1YHUWtiGsnPte16m3EJpITY,3839
|
12
12
|
proof_of_portfolio/circuits/Nargo.toml,sha256=D6ycN7H3xiTcWHH5wz4qXYTXn7Ht0WgPr9w4B7d8ZGw,141
|
13
13
|
proof_of_portfolio/circuits/generate_inputs.py,sha256=n9coxeNvOqXj_PleAPlP9reXUbWKUJRDAgxxxGfYZQk,10060
|
14
14
|
proof_of_portfolio/circuits/components/Nargo.toml,sha256=jFQJR9rg6zSNDgJF_yfaXc7-rdIhLO0ucr_pgkgEvaE,76
|
15
15
|
proof_of_portfolio/circuits/components/src/lib.nr,sha256=qTvVLqAAL73jtA3ZniTDUyn8RpniM3jqMiGI0RsuXSM,29
|
16
|
-
proof_of_portfolio/circuits/components/src/core/calmar.nr,sha256=
|
16
|
+
proof_of_portfolio/circuits/components/src/core/calmar.nr,sha256=WPd_uTdRh-OfAP8_4EqUTWTJdNkk340sorFVh4cz7cc,3468
|
17
17
|
proof_of_portfolio/circuits/components/src/core/drawdown.nr,sha256=DqfLbUaR_y_ZBOF1a2-tlxaDJJ6fE6cauToBbXFyKt8,2703
|
18
18
|
proof_of_portfolio/circuits/components/src/core/merkle.nr,sha256=NcrN92Pye5cxACrAWkPRm1RTSaczqRyku3da6qaJ700,3139
|
19
19
|
proof_of_portfolio/circuits/components/src/core/mod.nr,sha256=5YDicBPqTr4fLaS_rYuMnJ3PDJpakgpyzPzARIYZ3F4,132
|
20
|
-
proof_of_portfolio/circuits/components/src/core/omega.nr,sha256=
|
20
|
+
proof_of_portfolio/circuits/components/src/core/omega.nr,sha256=UdyL0MGuw1ZtFeN9UaQVtAUvfafBaXqgR2ypFnFEOb4,4124
|
21
21
|
proof_of_portfolio/circuits/components/src/core/pnl_score.nr,sha256=cMfWt2fg2l0dP7aakq7OdjkNbkwdtv6JXz6HBO1I2vk,2481
|
22
22
|
proof_of_portfolio/circuits/components/src/core/position.nr,sha256=KTnq0YhNrwX_0cppEVwRxAN0FMyfStnQ8_dV0Cir8xY,6196
|
23
23
|
proof_of_portfolio/circuits/components/src/core/sharpe.nr,sha256=3ec3aPczoC56cW3reSAjog9L7IuPK5YAnztMlz756oA,2446
|
24
24
|
proof_of_portfolio/circuits/components/src/core/sortino.nr,sha256=Oe-DnraOTbj2r8vupPnPdAWaEl_FvAn4z-bBgYVhNKs,5597
|
25
25
|
proof_of_portfolio/circuits/components/src/core/tstat.nr,sha256=SLL2UnyfeVUN3NdJHVoIdbPPxUUER7DWKYfbPxmHceo,3303
|
26
|
-
proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr,sha256=
|
26
|
+
proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr,sha256=8hmQsiMVFMVLoe6wCFOMcmJ5YmCCy_WGqB5TTw5wk3E,1939
|
27
27
|
proof_of_portfolio/circuits/components/src/utils/ann_volatility.nr,sha256=XTQhYuqwj5R8OhDklgyCUVwkW2_L0aThVQerk45fAdk,2118
|
28
28
|
proof_of_portfolio/circuits/components/src/utils/average.nr,sha256=L6YGvEcwOvOd-c5vMHN_fItGweLyGXaRNOHlevn5mJ4,2246
|
29
29
|
proof_of_portfolio/circuits/components/src/utils/constants.nr,sha256=0sjT1oX9SBbAhzfbJNG9I-7atJcr21s0_G4_74zI2UE,1945
|
30
30
|
proof_of_portfolio/circuits/components/src/utils/mod.nr,sha256=9MpTXbbCd6P6vnWKveEpwYntO3BQTaV_GZb9hgt7JBI,179
|
31
|
-
proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr,sha256=
|
31
|
+
proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr,sha256=hTa6S9HuP8mKYsyKB5StgwlEqfak2u_NP-A4ahT4jDU,1310
|
32
32
|
proof_of_portfolio/circuits/components/src/utils/sqrt.nr,sha256=pkCqXr4cBgfb49fzi_N6JypD31GlNYuMdMUoVssVzFQ,2318
|
33
33
|
proof_of_portfolio/circuits/components/src/utils/variance.nr,sha256=dzVn-idUSV4uykOlH4td9UUnui_OFfbVm9ZtE4BnSK8,2895
|
34
|
-
proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr,sha256=
|
35
|
-
proof_of_portfolio/circuits/src/main.nr,sha256=
|
36
|
-
proof_of_portfolio/circuits/target/circuits.json,sha256=
|
37
|
-
proof_of_portfolio/circuits/vk/vk,sha256=
|
34
|
+
proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr,sha256=FHIii05q-gtC51bHt--S3cdyNKzryMmgaNLoQkD64I0,1304
|
35
|
+
proof_of_portfolio/circuits/src/main.nr,sha256=w1_wPhIa76xa82QaycmoOIl8jjZA0UGw3VP22jzsc9s,4929
|
36
|
+
proof_of_portfolio/circuits/target/circuits.json,sha256=DFawNE46ATzeitsi5KPKGRkK_tsxIlRH-5ZbMQ3Ub6E,12183804
|
37
|
+
proof_of_portfolio/circuits/vk/vk,sha256=13M8c_7U5aJDc3mdkJoqy4HktQlRfm75DUJ_YI7zWr4,1764
|
38
38
|
proof_of_portfolio/demo/just_calmar/Nargo.toml,sha256=wJ7j03ThqHr4N_jk4ifjvGzAnhnO0CrSouNHdo6pIl8,77
|
39
39
|
proof_of_portfolio/demo/just_calmar/src/main.nr,sha256=xLzzAwAJf-q43IKvChhf08qcmb1BhDP4sVT6bOsSBRs,5351
|
40
40
|
proof_of_portfolio/demo/just_calmar/target/just_calmar.json,sha256=s_7h0ZLMUM3NURBaEtDxrkbgWlVSBkpa7CLPiLYLhk8,1820536
|
@@ -78,8 +78,8 @@ proof_of_portfolio/tree_generator/Nargo.toml,sha256=O6iSvb-EpV0XcETiDxNgSp7XKNiY
|
|
78
78
|
proof_of_portfolio/tree_generator/target.gz,sha256=J55ZC5QuFy6vGC2dSJ-0rEWjUKzzxwXwKGDTDUGp06U,225314
|
79
79
|
proof_of_portfolio/tree_generator/src/main.nr,sha256=5Jb46e5PyZ3kpmIJn4W1gVtN3AgHs-fCmTochVB7uOU,2427
|
80
80
|
proof_of_portfolio/tree_generator/target/tree_generator.json,sha256=Uy9AFLrbsd2SayMFTPgmow91-BIs1DrqP3qGfxfZAa0,1540901
|
81
|
-
proof_of_portfolio-0.0.
|
82
|
-
proof_of_portfolio-0.0.
|
83
|
-
proof_of_portfolio-0.0.
|
84
|
-
proof_of_portfolio-0.0.
|
85
|
-
proof_of_portfolio-0.0.
|
81
|
+
proof_of_portfolio-0.0.96.dist-info/METADATA,sha256=YATTjrrr2Ed5_nrGXKcP4fE-yYIXHBOmyT0WqG62LKA,7076
|
82
|
+
proof_of_portfolio-0.0.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
83
|
+
proof_of_portfolio-0.0.96.dist-info/entry_points.txt,sha256=KeLSJT_UJtr1WiLTkhlGqWQuPKbO_ylgj6OXOC2gJV4,53
|
84
|
+
proof_of_portfolio-0.0.96.dist-info/top_level.txt,sha256=sY5xZnE6YuiISK1IuRHPfl71NV0vXO3N3YA2li_SPXU,19
|
85
|
+
proof_of_portfolio-0.0.96.dist-info/RECORD,,
|
File without changes
|
{proof_of_portfolio-0.0.94.dist-info → proof_of_portfolio-0.0.96.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|