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.
- {betaquant-0.6.2 → betaquant-0.6.3}/Cargo.lock +1 -1
- {betaquant-0.6.2 → betaquant-0.6.3}/Cargo.toml +1 -1
- {betaquant-0.6.2 → betaquant-0.6.3}/PKG-INFO +4 -9
- {betaquant-0.6.2 → betaquant-0.6.3}/README.md +3 -8
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/main.py +2 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/full_demo.py +1 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/rank.py +1 -1
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/usage.py +19 -18
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/quickstart/verify_sumif.py +2 -6
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/main.py +2 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_rank.py +1 -1
- {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/builder/Dockerfile +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/builder/README.md +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/.gitea/workflows/publish.yml +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/.gitignore +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/CHANGELOG.md +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/LICENSE +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/build.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/__init__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/alpha191.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/al/alpha191_context.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/gtja191/alpha191.txt +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/__init__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/alpha101.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/al/alpha101_context.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/examples/wq101/alpha101.txt +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/pyproject.toml +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/__init__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/__init__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/algo_gen.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo/manual.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/algo.md +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/context.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/__init__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/__main__.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/alpha.lark +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/parser.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/lang/to_python.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/perf.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/betaquant/transforms.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_grammar.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/python/tests/test_to_python.py +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/rustfmt.toml +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/alpha.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/backfill.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/context.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/cross.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/cut.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/drawdown.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/ema.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/entropy.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/error.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/extremum.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/group.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/internal.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/ma.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/misc.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/mod.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/moments.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/neutralize.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/quantile.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/rank.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/returns.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/rolling.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/series.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/sharpe.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/slope.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/spec.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/split.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/stats.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/stddev.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/sum.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/topk.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/wsum.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/algo/zscore.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/lib.rs +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/license/public_key.bin +0 -0
- {betaquant-0.6.2 → betaquant-0.6.3}/src/license.rs +0 -0
- {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
- {betaquant-0.6.2 → betaquant-0.6.3}/tag_release.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: betaquant
|
|
3
|
-
Version: 0.6.
|
|
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
|
-
|
|
72
|
+
# 机器绑定自动按本机指纹校验,无需传 machine
|
|
73
|
+
claims = betaquant.verify_license(token)
|
|
73
74
|
|
|
74
75
|
# 判断某算子是否被授权(token 无效 / 过期直接返回 False)
|
|
75
|
-
if betaquant.license_allows(token, "ts_ma"
|
|
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
|
-
|
|
56
|
+
# 机器绑定自动按本机指纹校验,无需传 machine
|
|
57
|
+
claims = betaquant.verify_license(token)
|
|
57
58
|
|
|
58
59
|
# 判断某算子是否被授权(token 无效 / 过期直接返回 False)
|
|
59
|
-
if betaquant.license_allows(token, "ts_ma"
|
|
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
|
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
python examples/quickstart/usage.py
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import betaquant
|
|
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 =
|
|
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
|
-
|
|
23
|
-
result =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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):",
|
|
40
|
-
print("ts_intercept(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
|
-
|
|
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):",
|
|
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):",
|
|
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
|
-
|
|
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):",
|
|
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
|
-
|
|
89
|
+
betaquant.set_ctx(flags=0, groups=groups)
|
|
89
90
|
|
|
90
|
-
result_neutralize =
|
|
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
|
-
|
|
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):",
|
|
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
|
-
|
|
13
|
-
|
|
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])
|
|
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
|
|
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
|