proof-of-portfolio 0.0.93__py3-none-any.whl → 0.0.95__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/calmar.nr +23 -10
- proof_of_portfolio/circuits/components/src/core/omega.nr +43 -31
- 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 +18 -29
- proof_of_portfolio/circuits/target/circuits.json +1 -1
- proof_of_portfolio/circuits/vk/vk +0 -0
- proof_of_portfolio/proof_generator.py +41 -5
- {proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.dist-info}/METADATA +1 -1
- {proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.dist-info}/RECORD +15 -15
- {proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.dist-info}/WHEEL +0 -0
- {proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.dist-info}/entry_points.txt +0 -0
- {proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.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,13 +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
410
|
|
411
|
+
calmar_cap = int(calmar_ratio_cap * RATIO_SCALE_FACTOR)
|
412
|
+
account_size = data.get("account_size", 250000)
|
388
413
|
# Finally, LFG
|
389
414
|
main_prover_input = {
|
390
415
|
"log_returns": [str(r) for r in scaled_log_returns],
|
391
416
|
"n_returns": str(n_returns),
|
417
|
+
"daily_pnl": [str(p) for p in scaled_daily_pnl],
|
418
|
+
"n_pnl": str(n_pnl),
|
392
419
|
"signals": signals,
|
393
420
|
"signals_count": str(signals_count),
|
394
421
|
"path_elements": [
|
@@ -416,7 +443,18 @@ def generate_proof(
|
|
416
443
|
"use_weighting": "1",
|
417
444
|
"weights": [str(w) for w in scaled_weights],
|
418
445
|
"bypass_confidence": str(int(bypass_confidence)),
|
419
|
-
"account_size": str(account_size
|
446
|
+
"account_size": str(account_size),
|
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),
|
420
458
|
}
|
421
459
|
|
422
460
|
os.makedirs(main_circuit_dir, exist_ok=True)
|
@@ -479,8 +517,6 @@ def generate_proof(
|
|
479
517
|
else:
|
480
518
|
returns_merkle_root = f"0x{int(returns_merkle_root_raw):x}"
|
481
519
|
|
482
|
-
RATIO_SCALE_FACTOR = 1_000_000
|
483
|
-
|
484
520
|
avg_daily_pnl_scaled = avg_daily_pnl_value / SCALING_FACTOR
|
485
521
|
avg_daily_pnl_ptn_scaled = avg_daily_pnl_scaled * 365 * 100
|
486
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.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,40 +1,40 @@
|
|
1
1
|
proof_of_portfolio/__init__.py,sha256=gqM3xkqAO2az6Rhgez0qIREUzZqB3DZYV4IIQHdpwMA,4845
|
2
|
-
proof_of_portfolio/_version.py,sha256=
|
2
|
+
proof_of_portfolio/_version.py,sha256=uu7mWhMieLqAa9zx2AHjJPLLwaTwv_B1tiZK3yIq2oQ,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.95.dist-info/METADATA,sha256=3cjPlttbNFqRdcd8JXMVFR2bMwbaBTJPtIj6xPKPSuI,7076
|
82
|
+
proof_of_portfolio-0.0.95.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
83
|
+
proof_of_portfolio-0.0.95.dist-info/entry_points.txt,sha256=KeLSJT_UJtr1WiLTkhlGqWQuPKbO_ylgj6OXOC2gJV4,53
|
84
|
+
proof_of_portfolio-0.0.95.dist-info/top_level.txt,sha256=sY5xZnE6YuiISK1IuRHPfl71NV0vXO3N3YA2li_SPXU,19
|
85
|
+
proof_of_portfolio-0.0.95.dist-info/RECORD,,
|
File without changes
|
{proof_of_portfolio-0.0.93.dist-info → proof_of_portfolio-0.0.95.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|