betaquant 0.6.2__tar.gz → 0.6.3__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 (80) hide show
  1. {betaquant-0.6.2 → betaquant-0.6.3}/Cargo.lock +1 -1
  2. {betaquant-0.6.2 → betaquant-0.6.3}/Cargo.toml +1 -1
  3. {betaquant-0.6.2 → betaquant-0.6.3}/PKG-INFO +4 -9
  4. {betaquant-0.6.2 → betaquant-0.6.3}/README.md +3 -8
  5. {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/main.py +2 -0
  6. {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/full_demo.py +1 -0
  7. {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/rank.py +1 -1
  8. {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/usage.py +19 -18
  9. {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/verify_sumif.py +2 -6
  10. {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/main.py +2 -0
  11. {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_rank.py +1 -1
  12. {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/builder/Dockerfile +0 -0
  13. {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/builder/README.md +0 -0
  14. {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/workflows/publish.yml +0 -0
  15. {betaquant-0.6.2 → betaquant-0.6.3}/.gitignore +0 -0
  16. {betaquant-0.6.2 → betaquant-0.6.3}/CHANGELOG.md +0 -0
  17. {betaquant-0.6.2 → betaquant-0.6.3}/LICENSE +0 -0
  18. {betaquant-0.6.2 → betaquant-0.6.3}/build.rs +0 -0
  19. {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/__init__.py +0 -0
  20. {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/alpha191.py +0 -0
  21. {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/alpha191_context.py +0 -0
  22. {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/alpha191.txt +0 -0
  23. {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/__init__.py +0 -0
  24. {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/alpha101.py +0 -0
  25. {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/alpha101_context.py +0 -0
  26. {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/alpha101.txt +0 -0
  27. {betaquant-0.6.2 → betaquant-0.6.3}/pyproject.toml +0 -0
  28. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/__init__.py +0 -0
  29. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/__init__.py +0 -0
  30. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/algo_gen.py +0 -0
  31. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/manual.py +0 -0
  32. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo.md +0 -0
  33. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/context.py +0 -0
  34. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/__init__.py +0 -0
  35. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/__main__.py +0 -0
  36. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/alpha.lark +0 -0
  37. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/parser.py +0 -0
  38. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/to_python.py +0 -0
  39. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/perf.py +0 -0
  40. {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/transforms.py +0 -0
  41. {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_grammar.py +0 -0
  42. {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_to_python.py +0 -0
  43. {betaquant-0.6.2 → betaquant-0.6.3}/rustfmt.toml +0 -0
  44. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/alpha.rs +0 -0
  45. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/backfill.rs +0 -0
  46. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/context.rs +0 -0
  47. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/cross.rs +0 -0
  48. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/cut.rs +0 -0
  49. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/drawdown.rs +0 -0
  50. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/ema.rs +0 -0
  51. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/entropy.rs +0 -0
  52. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/error.rs +0 -0
  53. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/extremum.rs +0 -0
  54. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/group.rs +0 -0
  55. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/internal.rs +0 -0
  56. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/ma.rs +0 -0
  57. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/misc.rs +0 -0
  58. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/mod.rs +0 -0
  59. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/moments.rs +0 -0
  60. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/neutralize.rs +0 -0
  61. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/quantile.rs +0 -0
  62. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/rank.rs +0 -0
  63. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/returns.rs +0 -0
  64. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/rolling.rs +0 -0
  65. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/series.rs +0 -0
  66. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/sharpe.rs +0 -0
  67. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/slope.rs +0 -0
  68. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/spec.rs +0 -0
  69. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/split.rs +0 -0
  70. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/stats.rs +0 -0
  71. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/stddev.rs +0 -0
  72. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/sum.rs +0 -0
  73. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/topk.rs +0 -0
  74. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/wsum.rs +0 -0
  75. {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/zscore.rs +0 -0
  76. {betaquant-0.6.2 → betaquant-0.6.3}/src/lib.rs +0 -0
  77. {betaquant-0.6.2 → betaquant-0.6.3}/src/license/public_key.bin +0 -0
  78. {betaquant-0.6.2 → betaquant-0.6.3}/src/license.rs +0 -0
  79. {betaquant-0.6.2 → betaquant-0.6.3}/src//347/256/227/345/255/220/350/247/204/345/210/231/345/277/205/350/257/273.md" +0 -0
  80. {betaquant-0.6.2 → betaquant-0.6.3}/tag_release.py +0 -0
@@ -37,7 +37,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
37
37
 
38
38
  [[package]]
39
39
  name = "betaquant"
40
- version = "0.6.2"
40
+ version = "0.6.3"
41
41
  dependencies = [
42
42
  "anyhow",
43
43
  "base64",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "betaquant"
3
- version = "0.6.2"
3
+ version = "0.6.3"
4
4
  edition = "2024"
5
5
  authors = ["ZhaoJun"]
6
6
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: betaquant
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -69,22 +69,17 @@ result = betaquant.ts_ma(data, 3) # 已授权 → 正常计算
69
69
 
70
70
  ```python
71
71
  # 验签 + 校验(失败 / 过期 / 机器不符抛 ValueError),返回声明 dict
72
- claims = betaquant.verify_license(token, machine=machine)
72
+ # 机器绑定自动按本机指纹校验,无需传 machine
73
+ claims = betaquant.verify_license(token)
73
74
 
74
75
  # 判断某算子是否被授权(token 无效 / 过期直接返回 False)
75
- if betaquant.license_allows(token, "ts_ma", machine=machine):
76
+ if betaquant.license_allows(token, "ts_ma"):
76
77
  ...
77
78
  ```
78
79
 
79
80
  授权语义(**默认拒绝**):算子必须显式出现在 `allow`(或 `allow` 含 `"*"`)才放行;
80
81
  `deny` 优先级高于 `allow`。`allow=[]` 表示全部拒绝,并非不限制。
81
82
 
82
- > 过期判定使用本机系统时间,离线方案对“改系统时间”无法根治,属已知限制:用短有效期
83
- > + 定期换发缓解。
84
-
85
- 更完整的端到端示例(签发 → 启用 token → 算子硬门禁 → 过期续期 → 机器绑定)见
86
- `encryptor/license/examples/demo.py`。签发方封装见 `encryptor/license`
87
- (`LicenseService`)。
88
83
 
89
84
  ## 使用
90
85
 
@@ -53,22 +53,17 @@ result = betaquant.ts_ma(data, 3) # 已授权 → 正常计算
53
53
 
54
54
  ```python
55
55
  # 验签 + 校验(失败 / 过期 / 机器不符抛 ValueError),返回声明 dict
56
- claims = betaquant.verify_license(token, machine=machine)
56
+ # 机器绑定自动按本机指纹校验,无需传 machine
57
+ claims = betaquant.verify_license(token)
57
58
 
58
59
  # 判断某算子是否被授权(token 无效 / 过期直接返回 False)
59
- if betaquant.license_allows(token, "ts_ma", machine=machine):
60
+ if betaquant.license_allows(token, "ts_ma"):
60
61
  ...
61
62
  ```
62
63
 
63
64
  授权语义(**默认拒绝**):算子必须显式出现在 `allow`(或 `allow` 含 `"*"`)才放行;
64
65
  `deny` 优先级高于 `allow`。`allow=[]` 表示全部拒绝,并非不限制。
65
66
 
66
- > 过期判定使用本机系统时间,离线方案对“改系统时间”无法根治,属已知限制:用短有效期
67
- > + 定期换发缓解。
68
-
69
- 更完整的端到端示例(签发 → 启用 token → 算子硬门禁 → 过期续期 → 机器绑定)见
70
- `encryptor/license/examples/demo.py`。签发方封装见 `encryptor/license`
71
- (`LicenseService`)。
72
67
 
73
68
  ## 使用
74
69
 
@@ -15,6 +15,8 @@ import logging
15
15
  import time
16
16
 
17
17
  import betaquant
18
+ betaquant.set_license_token('')
19
+
18
20
  import numpy as np
19
21
  import pandas as pd
20
22
  import polars as pl
@@ -21,6 +21,7 @@ import numpy as np
21
21
  import pandas as pd
22
22
 
23
23
  import betaquant
24
+ betaquant.set_license_token('')
24
25
 
25
26
 
26
27
  # ---------------------------------------------------------------------------
@@ -4,7 +4,7 @@ import numpy as np
4
4
  import pandas as pd
5
5
 
6
6
  import betaquant
7
-
7
+ betaquant.set_license_token('')
8
8
  df = pd.DataFrame(
9
9
  data={
10
10
  "Animal": ["cat", "penguin", "dog", "spider", "snake"],
@@ -5,7 +5,8 @@
5
5
  python examples/quickstart/usage.py
6
6
  """
7
7
 
8
- import betaquant as al
8
+ import betaquant
9
+ betaquant.set_license_token('')
9
10
  import numpy as np
10
11
  import pandas as pd
11
12
 
@@ -13,35 +14,35 @@ np.set_printoptions(precision=3, suppress=True)
13
14
 
14
15
  # 3 周期均线,前两个值是窗口未填满时的部分均值(默认行为)
15
16
  data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).astype(np.float64)
16
- result = al.ts_ma(data, 3)
17
+ result = betaquant.ts_ma(data, 3)
17
18
  print(result)
18
19
  # Output: [1. 1.5 2. 3. 4. 5. 6. 7. 8. 9. ]
19
20
 
20
21
 
21
22
  # 严格窗口模式:窗口未满前返回 NaN
22
- al.set_ctx(flags=al.FLAG_STRICTLY_CYCLE)
23
- result = al.ts_ma(data, 3)
23
+ betaquant.set_ctx(flags=betaquant.FLAG_STRICTLY_CYCLE)
24
+ result = betaquant.ts_ma(data, 3)
24
25
  print(result)
25
26
  # Output: [nan nan 2. 3. 4. 5. 6. 7. 8. 9.]
26
27
 
27
28
 
28
29
  # 跳过 NaN
29
- al.set_ctx(flags=al.FLAG_SKIP_NAN)
30
+ betaquant.set_ctx(flags=betaquant.FLAG_SKIP_NAN)
30
31
  data_with_nan = np.array([1, 2, np.nan, 4, 5, 6, 7, 8, 9, 10], dtype=np.float64)
31
- result = al.ts_ma(data_with_nan, 3)
32
+ result = betaquant.ts_ma(data_with_nan, 3)
32
33
  print(result)
33
34
  # Output: [1. 1.5 nan 2.333 3.667 5. 6. 7. 8. 9. ]
34
35
 
35
36
 
36
37
  # 滚动线性回归(斜率、截距)
37
- al.set_ctx(flags=0, groups=2)
38
+ betaquant.set_ctx(flags=0, groups=2)
38
39
  data_slope = np.array([1, 3, 5, 7, 9, 1, 3, 5, 7, 9], dtype=np.float64)
39
- print("ts_slope(3):", al.ts_slope(data_slope, 3))
40
- print("ts_intercept(3):", al.ts_intercept(data_slope, 3))
40
+ print("ts_slope(3):", betaquant.ts_slope(data_slope, 3))
41
+ print("ts_intercept(3):", betaquant.ts_intercept(data_slope, 3))
41
42
 
42
43
 
43
44
  # 未来收益(Future Return)
44
- al.set_ctx(flags=al.FLAG_STRICTLY_CYCLE, groups=2)
45
+ betaquant.set_ctx(flags=betaquant.FLAG_STRICTLY_CYCLE, groups=2)
45
46
  open_p = np.array([10, 11, 12, 13, 14, 15] * 2, dtype=np.float64)
46
47
  high_p = np.array([11, 12, 12, 14, 15, 16] * 2, dtype=np.float64)
47
48
  low_p = np.array([9, 10, 12, 12, 13, 14] * 2, dtype=np.float64)
@@ -57,16 +58,16 @@ df_ohlc["is_calc"] = (
57
58
  is_calc = df_ohlc["is_calc"].to_numpy(dtype=np.float64)
58
59
 
59
60
  # ts_fret(delay=1, periods=3): Return = (Close[i+delay+periods-1] - Open[i+delay]) / Open[i+delay]
60
- print("ts_fret(1, 3):", al.ts_fret(open_p, close_p, is_calc, 1, 3))
61
+ print("ts_fret(1, 3):", betaquant.ts_fret(open_p, close_p, is_calc, 1, 3))
61
62
 
62
63
  # ts_fret(delay=2, periods=1):相对默认延后一日。
63
- print("ts_fret(2, 1):", al.ts_fret(open_p, close_p, is_calc, 2, 1))
64
+ print("ts_fret(2, 1):", betaquant.ts_fret(open_p, close_p, is_calc, 2, 1))
64
65
 
65
66
 
66
67
  # 截面分箱(cc_bins):每个时间点把跨 group 的值离散化到 0..n-1
67
- al.set_ctx(flags=al.FLAG_STRICTLY_CYCLE, groups=2)
68
+ betaquant.set_ctx(flags=betaquant.FLAG_STRICTLY_CYCLE, groups=2)
68
69
  data_bins = np.array([1, 2, 3, 4, 5, 11, 22, 33, 44, 0], dtype=np.float64)
69
- print("cc_bins(2):", al.cc_bins(data_bins, 2))
70
+ print("cc_bins(2):", betaquant.cc_bins(data_bins, 2))
70
71
 
71
72
 
72
73
  # 截面行业中性化(cc_neutralize):先按 category 分组减组均值,再做截面 rank
@@ -85,9 +86,9 @@ category = df["category"].to_numpy(dtype=np.float64)
85
86
  value = df["value"].to_numpy(dtype=np.float64)
86
87
 
87
88
  groups = df["stock"].nunique()
88
- al.set_ctx(flags=0, groups=groups)
89
+ betaquant.set_ctx(flags=0, groups=groups)
89
90
 
90
- result_neutralize = al.cc_neutralize(category, value)
91
+ result_neutralize = betaquant.cc_neutralize(category, value)
91
92
  print("cc_neutralize:", result_neutralize)
92
93
 
93
94
  df = df.assign(neutralize=result_neutralize)
@@ -95,6 +96,6 @@ print(df.pivot_table(index="time", columns="stock", values="neutralize"))
95
96
 
96
97
 
97
98
  # 序列与时间下标的滚动相关系数
98
- al.set_ctx(flags=0, groups=1)
99
+ betaquant.set_ctx(flags=0, groups=1)
99
100
  data_corr = np.array([1, 2, 3, 4, 5, 5, 4, 3, 2, 1], dtype=np.float64)
100
- print("ts_corr(5):", al.ts_corr(data_corr, 5))
101
+ print("ts_corr(5):", betaquant.ts_corr(data_corr, 5))
@@ -9,12 +9,8 @@ import sys
9
9
 
10
10
  import numpy as np
11
11
 
12
- try:
13
- import betaquant
14
- except ImportError:
15
- print("无法导入 alpha;请先执行 `maturin develop --release` 安装到当前环境。")
16
- sys.exit(1)
17
-
12
+ import betaquant
13
+ betaquant.set_license_token('')
18
14
 
19
15
  def test_sumif():
20
16
  a = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
@@ -15,6 +15,8 @@ import logging
15
15
  import time
16
16
 
17
17
  import betaquant
18
+ betaquant.set_license_token('')
19
+
18
20
  import numpy as np
19
21
  import pandas as pd
20
22
  import polars as pl
@@ -6,7 +6,7 @@
6
6
  import numpy as np
7
7
 
8
8
  import betaquant
9
-
9
+ betaquant.set_license_token('')
10
10
 
11
11
  def test_cc_rank_matches_pandas_pct_rank():
12
12
  rng = np.random.default_rng(20260526)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes