betaquant 0.5.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 (75) hide show
  1. betaquant-0.5.3/.gitea/builder/Dockerfile +121 -0
  2. betaquant-0.5.3/.gitea/builder/README.md +84 -0
  3. betaquant-0.5.3/.gitea/workflows/publish.yml +104 -0
  4. betaquant-0.5.3/.gitignore +82 -0
  5. betaquant-0.5.3/CHANGELOG.md +8 -0
  6. betaquant-0.5.3/Cargo.lock +376 -0
  7. betaquant-0.5.3/Cargo.toml +25 -0
  8. betaquant-0.5.3/LICENSE +22 -0
  9. betaquant-0.5.3/PKG-INFO +199 -0
  10. betaquant-0.5.3/README.md +182 -0
  11. betaquant-0.5.3/build.rs +585 -0
  12. betaquant-0.5.3/examples/gtja191/al/__init__.py +131 -0
  13. betaquant-0.5.3/examples/gtja191/al/alpha191.py +1371 -0
  14. betaquant-0.5.3/examples/gtja191/al/alpha191_context.py +1 -0
  15. betaquant-0.5.3/examples/gtja191/alpha191.txt +191 -0
  16. betaquant-0.5.3/examples/gtja191/main.py +31 -0
  17. betaquant-0.5.3/examples/quickstart/full_demo.py +298 -0
  18. betaquant-0.5.3/examples/quickstart/rank.py +18 -0
  19. betaquant-0.5.3/examples/quickstart/usage.py +100 -0
  20. betaquant-0.5.3/examples/quickstart/verify_sumif.py +39 -0
  21. betaquant-0.5.3/examples/wq101/al/__init__.py +114 -0
  22. betaquant-0.5.3/examples/wq101/al/alpha101.py +703 -0
  23. betaquant-0.5.3/examples/wq101/al/alpha101_context.py +9 -0
  24. betaquant-0.5.3/examples/wq101/alpha101.txt +101 -0
  25. betaquant-0.5.3/examples/wq101/main.py +31 -0
  26. betaquant-0.5.3/pyproject.toml +40 -0
  27. betaquant-0.5.3/python/betalib/__init__.py +13 -0
  28. betaquant-0.5.3/python/betalib/algo/__init__.py +6 -0
  29. betaquant-0.5.3/python/betalib/algo/algo_gen.py +722 -0
  30. betaquant-0.5.3/python/betalib/algo/manual.py +25 -0
  31. betaquant-0.5.3/python/betalib/algo.md +67 -0
  32. betaquant-0.5.3/python/betalib/context.py +446 -0
  33. betaquant-0.5.3/python/betalib/lang/__init__.py +4 -0
  34. betaquant-0.5.3/python/betalib/lang/__main__.py +20 -0
  35. betaquant-0.5.3/python/betalib/lang/alpha.lark +54 -0
  36. betaquant-0.5.3/python/betalib/lang/parser.py +3572 -0
  37. betaquant-0.5.3/python/betalib/lang/to_python.py +319 -0
  38. betaquant-0.5.3/python/betalib/perf.py +310 -0
  39. betaquant-0.5.3/python/betalib/transforms.py +76 -0
  40. betaquant-0.5.3/python/tests/test_grammar.py +26 -0
  41. betaquant-0.5.3/python/tests/test_rank.py +55 -0
  42. betaquant-0.5.3/python/tests/test_to_python.py +87 -0
  43. betaquant-0.5.3/rustfmt.toml +1 -0
  44. betaquant-0.5.3/src/algo/alpha.rs +143 -0
  45. betaquant-0.5.3/src/algo/backfill.rs +196 -0
  46. betaquant-0.5.3/src/algo/context.rs +85 -0
  47. betaquant-0.5.3/src/algo/cross.rs +431 -0
  48. betaquant-0.5.3/src/algo/drawdown.rs +236 -0
  49. betaquant-0.5.3/src/algo/ema.rs +418 -0
  50. betaquant-0.5.3/src/algo/entropy.rs +197 -0
  51. betaquant-0.5.3/src/algo/error.rs +21 -0
  52. betaquant-0.5.3/src/algo/extremum.rs +293 -0
  53. betaquant-0.5.3/src/algo/group.rs +299 -0
  54. betaquant-0.5.3/src/algo/internal.rs +78 -0
  55. betaquant-0.5.3/src/algo/ma.rs +299 -0
  56. betaquant-0.5.3/src/algo/misc.rs +373 -0
  57. betaquant-0.5.3/src/algo/mod.rs +87 -0
  58. betaquant-0.5.3/src/algo/moments.rs +208 -0
  59. betaquant-0.5.3/src/algo/neutralize.rs +179 -0
  60. betaquant-0.5.3/src/algo/quantile.rs +250 -0
  61. betaquant-0.5.3/src/algo/rank.rs +558 -0
  62. betaquant-0.5.3/src/algo/returns.rs +170 -0
  63. betaquant-0.5.3/src/algo/rolling.rs +575 -0
  64. betaquant-0.5.3/src/algo/scan.rs +109 -0
  65. betaquant-0.5.3/src/algo/series.rs +291 -0
  66. betaquant-0.5.3/src/algo/sharpe.rs +156 -0
  67. betaquant-0.5.3/src/algo/slope.rs +338 -0
  68. betaquant-0.5.3/src/algo/spec.rs +773 -0
  69. betaquant-0.5.3/src/algo/stats.rs +443 -0
  70. betaquant-0.5.3/src/algo/stddev.rs +106 -0
  71. betaquant-0.5.3/src/algo/sum.rs +386 -0
  72. betaquant-0.5.3/src/algo/zscore.rs +201 -0
  73. betaquant-0.5.3/src/lib.rs +130 -0
  74. betaquant-0.5.3/src//345/277/205/350/257/273.md +248 -0
  75. betaquant-0.5.3/tag_release.py +22 -0
@@ -0,0 +1,121 @@
1
+ # syntax=docker/dockerfile:1.7
2
+ #
3
+ # py-alpha-lib 构建环境
4
+ # ----------------------------------------------------------------------------
5
+ # 一切都烤进镜像:工具链 + cargo 依赖 + MSVC CRT/SDK。
6
+ # CI 不挂任何 volume,跑起来就是镜像内自带的状态,没有 docker-in-docker
7
+ # 的挂卷路径解析坑。
8
+ #
9
+ # 镜像内置:
10
+ # - Python 3.11
11
+ # - Rust stable + 三个 target (linux-gnu / linux-musl / windows-msvc)
12
+ # - sccache(编译缓存)
13
+ # - cargo-xwin + 预下载好的 MSVC CRT/SDK(写入 /opt/xwin/xwin/DONE)
14
+ # - maturin[zig] + twine
15
+ # - llvm / clang / lld(提供 llvm-dlltool / llvm-lib / lld-link / clang-cl)
16
+ # - Node.js 20(Gitea Actions / act 跑 actions/checkout 必需)
17
+ #
18
+ # 合规提示:
19
+ # 镜像里包含 Microsoft VC++ Build Tools 和 Windows SDK 文件,许可证见
20
+ # https://go.microsoft.com/fwlink/?LinkId=2086102
21
+ # 按 EULA 这些文件不得再分发到第三方。**只能推到对内可信的 registry**
22
+ # (内网 Gitea / Harbor),不要推到 Docker Hub 等公网仓库。
23
+ # ----------------------------------------------------------------------------
24
+
25
+ FROM python:3.11-slim-bookworm
26
+
27
+ LABEL org.opencontainers.image.title="py-alpha-lib builder" \
28
+ org.opencontainers.image.description="Pre-baked toolchain for building py-alpha-lib wheels (manylinux/musllinux/win_amd64) + sdist"
29
+
30
+ ENV DEBIAN_FRONTEND=noninteractive \
31
+ LANG=C.UTF-8 \
32
+ LC_ALL=C.UTF-8 \
33
+ PYTHONDONTWRITEBYTECODE=1 \
34
+ PYTHONUNBUFFERED=1
35
+
36
+ ENV RUSTUP_HOME=/usr/local/rustup \
37
+ CARGO_HOME=/usr/local/cargo \
38
+ PATH=/usr/local/cargo/bin:$PATH \
39
+ CARGO_INCREMENTAL=0 \
40
+ RUSTC_WRAPPER=sccache \
41
+ SCCACHE_DIR=/opt/sccache \
42
+ SCCACHE_CACHE_SIZE=2G \
43
+ XWIN_CACHE_DIR=/opt/xwin \
44
+ XWIN_ACCEPT_LICENSE=1 \
45
+ RUSTFLAGS="-C target-feature=+sse4.2 -C target-feature=+avx2 -C target-feature=+pclmulqdq"
46
+
47
+ # ---- 系统依赖 + LLVM 工具链(cargo-xwin 需要 llvm-dlltool / lld-link 等) ----
48
+ RUN apt-get update \
49
+ && apt-get install -y --no-install-recommends \
50
+ build-essential \
51
+ ca-certificates \
52
+ curl \
53
+ git \
54
+ gnupg \
55
+ pkg-config \
56
+ xz-utils \
57
+ llvm \
58
+ clang \
59
+ lld \
60
+ && rm -rf /var/lib/apt/lists/*
61
+
62
+ # ---- Node.js(actions/checkout@v4 等 JS action 必需) ----
63
+ ARG NODE_MAJOR=20
64
+ RUN set -eux; \
65
+ curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash -; \
66
+ apt-get install -y --no-install-recommends nodejs; \
67
+ rm -rf /var/lib/apt/lists/*; \
68
+ node --version; \
69
+ npm --version
70
+
71
+ # ---- Rust stable + 三个 target ----
72
+ ARG RUST_TOOLCHAIN=stable
73
+ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
74
+ | sh -s -- -y --default-toolchain "${RUST_TOOLCHAIN}" --profile minimal --no-modify-path \
75
+ && rustup target add x86_64-unknown-linux-gnu \
76
+ && rustup target add x86_64-unknown-linux-musl \
77
+ && rustup target add x86_64-pc-windows-msvc \
78
+ && rustc --version
79
+
80
+ # ---- sccache(mozilla 官方静态二进制) ----
81
+ ARG SCCACHE_VERSION=v0.10.0
82
+ RUN set -eux; \
83
+ curl -fL -o /tmp/sccache.tgz \
84
+ "https://github.com/mozilla/sccache/releases/download/${SCCACHE_VERSION}/sccache-${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz"; \
85
+ tar -xzf /tmp/sccache.tgz -C /tmp; \
86
+ install -m 0755 \
87
+ "/tmp/sccache-${SCCACHE_VERSION}-x86_64-unknown-linux-musl/sccache" \
88
+ /usr/local/cargo/bin/sccache; \
89
+ rm -rf /tmp/sccache*; \
90
+ sccache --version
91
+
92
+ # ---- maturin (含 zig) + twine ----
93
+ RUN python -m pip install --no-cache-dir --upgrade pip \
94
+ && python -m pip install --no-cache-dir \
95
+ "maturin[zig]>=1.10,<2.0" \
96
+ twine \
97
+ && maturin --version \
98
+ && twine --version
99
+
100
+ # ---- cargo-xwin(windows-msvc 交叉编译驱动) ----
101
+ RUN cargo install --locked cargo-xwin --root /usr/local/cargo \
102
+ && ls -l /usr/local/cargo/bin/cargo-xwin
103
+
104
+ # ---- 预下载并解包 MSVC CRT + Windows SDK 到 /opt/xwin/xwin/ ----
105
+ # cargo-xwin 命中缓存的关键文件是 $XWIN_CACHE_DIR/xwin/DONE。
106
+ # 直接把它写到镜像里 /opt/xwin,CI 不挂卷直接命中。
107
+ #
108
+ # 重要:cargo-xwin 命中缓存要求“请求架构 ⊆ DONE 中已下载架构”。
109
+ # 这里只 splat x86_64,所以 CI 调用 cargo-xwin 时也必须强制
110
+ # XWIN_ARCH=x86_64(默认是 [x86_64, aarch64]),否则会重新下载。
111
+ # 这条 ENV 不在镜像里,而是在 publish.yml 的 job env 中设置,
112
+ # 这样以后想换架构组合时只改一处即可,不需要重 build 镜像。
113
+ RUN set -eux; \
114
+ mkdir -p /opt/xwin; \
115
+ cargo xwin cache xwin --xwin-arch x86_64; \
116
+ test -f /opt/xwin/xwin/DONE; \
117
+ du -sh /opt/xwin; \
118
+ ls /opt/xwin/xwin
119
+
120
+ WORKDIR /work
121
+ CMD ["bash"]
@@ -0,0 +1,84 @@
1
+ # py-alpha-lib builder image
2
+
3
+ 把原来 `publish.yml` 里每次 CI 都重装一遍的 Rust 工具链、sccache、cargo-xwin、
4
+ maturin、twine、llvm 等全部烤进一个镜像,CI 只负责跑 `maturin build` 和
5
+ `twine upload`,构建更快、流程更短、跨 workflow 也能复用。
6
+
7
+ 镜像内容见同目录 `Dockerfile`。
8
+
9
+ ## 一、构建并推送镜像
10
+
11
+ 在能访问 docker.io 的机器上一次性构建好,再推到你自建的 Gitea 容器仓库
12
+ (或任意私有 registry)。下面以 `my-gitea` 上的命名空间 `infra` 为例:
13
+
14
+ ```bash
15
+ cd .gitea/builder
16
+
17
+ # 1) 构建(如需指定 rust 版本可加 --build-arg RUST_TOOLCHAIN=1.82.0)
18
+ docker build -t my-gitea/infra/py-alpha-builder:latest .
19
+
20
+ # 2) 登录并推送
21
+ docker login my-gitea
22
+ docker push my-gitea/infra/py-alpha-builder:latest
23
+ ```
24
+
25
+ > 如果暂时没有私有 registry,也可以直接在 act_runner 主机上 `docker build`
26
+ > 出本地镜像,然后让 workflow 里 `container.image` 指向同名 tag,
27
+ > 配合 `act_runner` 的 `pull: false`(或 `force_pull: false`)即可使用本地镜像。
28
+
29
+ ## 二、CI 中如何使用
30
+
31
+ `publish.yml` 里把 `container.image` 换成这个镜像就行:
32
+
33
+ ```yaml
34
+ container:
35
+ image: my-gitea/infra/py-alpha-builder:latest
36
+ options: --add-host=my-gitea:host-gateway
37
+ volumes:
38
+ # 真正“可变”的缓存仍然挂在宿主机,跨 workflow 复用
39
+ - /opt/act_cache/cargo-registry:/usr/local/cargo/registry
40
+ - /opt/act_cache/cargo-git:/usr/local/cargo/git
41
+ - /opt/act_cache/sccache:/opt/sccache
42
+ - /opt/act_cache/xwin:/opt/xwin
43
+ - /opt/act_cache/target:/work/target
44
+ ```
45
+
46
+ 宿主机一次性准备:
47
+
48
+ ```bash
49
+ sudo mkdir -p \
50
+ /opt/act_cache/cargo-registry \
51
+ /opt/act_cache/cargo-git \
52
+ /opt/act_cache/sccache \
53
+ /opt/act_cache/xwin \
54
+ /opt/act_cache/target
55
+ sudo chmod -R 0777 /opt/act_cache
56
+ ```
57
+
58
+ 并在 `act_runner` 的 `config.yaml` 里允许这些挂载:
59
+
60
+ ```yaml
61
+ container:
62
+ valid_volumes:
63
+ - /opt/act_cache
64
+ - /opt/act_cache/*
65
+ ```
66
+
67
+ ## 三、本地手动验证镜像
68
+
69
+ ```bash
70
+ docker run --rm -it \
71
+ -v "$PWD":/work \
72
+ -v /opt/act_cache/sccache:/opt/sccache \
73
+ -v /opt/act_cache/xwin:/opt/xwin \
74
+ my-gitea/infra/py-alpha-builder:latest bash -lc '
75
+ maturin build --release --out dist \
76
+ --target x86_64-unknown-linux-gnu --zig --compatibility manylinux_2_17 &&
77
+ maturin build --release --out dist \
78
+ --target x86_64-unknown-linux-musl --zig --compatibility musllinux_1_2 &&
79
+ maturin build --release --out dist \
80
+ --target x86_64-pc-windows-msvc &&
81
+ maturin sdist --out dist &&
82
+ ls -la dist
83
+ '
84
+ ```
@@ -0,0 +1,104 @@
1
+ name: Publish
2
+
3
+ # 在 Gitea Actions 上构建 Linux + Windows wheel + sdist,发布到公网 PyPI。
4
+ # 包名:betalib。
5
+ #
6
+ # 工具链 + 所有缓存都烤进了 .gitea/builder/Dockerfile 对应的镜像里:
7
+ # - rustup / 三个 target / sccache / maturin[zig] / twine / llvm
8
+ # - cargo-xwin + 预下载的 MSVC CRT/SDK(DONE 标记已就位)
9
+ # - cargo install 时拉取的依赖
10
+ #
11
+ # 所以这里不挂任何 volume,CI 起来就是镜像里自带的状态,没有
12
+ # docker-in-docker 挂卷路径解析问题;代价是 cargo target 增量编译
13
+ # 不跨 workflow 复用,每次 release 全量编译一次(~1 分钟可接受)。
14
+ #
15
+ # 触发:
16
+ # - push v* tag
17
+ # - workflow_dispatch(只构建不发布)
18
+ #
19
+ # Secrets:
20
+ # PYPI_API_TOKEN PyPI 项目级 API Token,前缀 "pypi-..."
21
+
22
+ on:
23
+ push:
24
+ tags:
25
+ - 'v*'
26
+ workflow_dispatch:
27
+
28
+ permissions:
29
+ contents: read
30
+
31
+ jobs:
32
+ build-and-publish:
33
+ runs-on: ubuntu-latest
34
+ defaults:
35
+ run:
36
+ # act/Gitea Actions 默认用 sh(dash) 跑 `run:`,dash 不认识
37
+ # `set -o pipefail`;强制 bash。镜像里有 bash。
38
+ shell: bash
39
+ env:
40
+ # 让 CI 容器里的 cargo-xwin 只请求 x86_64,匹配镜像里 DONE 标记
41
+ # 写入的架构(Dockerfile 里 cargo xwin cache xwin --xwin-arch x86_64)。
42
+ # 否则 cargo-xwin 默认 [x86_64,aarch64],与 DONE 不一致 →
43
+ # 重新下载整套 MSVC CRT/SDK(约 40 分钟)。
44
+ XWIN_ARCH: x86_64
45
+ container:
46
+ # 由 .gitea/builder/Dockerfile 构建并推送,里面已经预装好工具链 + SDK。
47
+ image: my-gitea/infra/py-alpha-builder:latest
48
+ options: --add-host=my-gitea:host-gateway
49
+
50
+ steps:
51
+ - uses: https://gitea.com/actions/checkout@v4
52
+
53
+ - name: Toolchain sanity check
54
+ run: |
55
+ set -euxo pipefail
56
+ python --version
57
+ rustc --version
58
+ cargo --version
59
+ sccache --version
60
+ cargo xwin --version || cargo-xwin --version
61
+ maturin --version
62
+ twine --version
63
+ which llvm-dlltool lld-link clang-cl || true
64
+ # 确认镜像内已有 MSVC CRT/SDK,跳过下载
65
+ test -f /opt/xwin/xwin/DONE && echo "✅ MSVC CRT/SDK ready" \
66
+ || echo "⚠️ cold xwin cache, will download"
67
+
68
+ - name: Build manylinux wheel
69
+ run: |
70
+ maturin build --release --out dist \
71
+ --target x86_64-unknown-linux-gnu \
72
+ --zig \
73
+ --compatibility manylinux_2_17 \
74
+ --interpreter "$(which python)"
75
+
76
+ - name: Build musllinux wheel
77
+ run: |
78
+ maturin build --release --out dist \
79
+ --target x86_64-unknown-linux-musl \
80
+ --zig \
81
+ --compatibility musllinux_1_2 \
82
+ --interpreter "$(which python)"
83
+
84
+ - name: Build Windows wheel (cargo-xwin, win_amd64 MSVC)
85
+ run: |
86
+ maturin build --release --out dist \
87
+ --target x86_64-pc-windows-msvc \
88
+ --interpreter "$(which python)"
89
+
90
+ - name: Build sdist
91
+ run: maturin sdist --out dist
92
+
93
+ - name: sccache stats
94
+ run: sccache --show-stats || true
95
+
96
+ - name: List built artifacts
97
+ run: ls -la dist
98
+
99
+ - name: Upload to PyPI
100
+ if: startsWith(github.ref, 'refs/tags/')
101
+ env:
102
+ TWINE_USERNAME: __token__
103
+ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
104
+ run: python -m twine upload --verbose --non-interactive --skip-existing dist/*
@@ -0,0 +1,82 @@
1
+ /target
2
+
3
+ # Byte-compiled / optimized / DLL files
4
+ __pycache__/
5
+ .pytest_cache/
6
+ *.py[cod]
7
+
8
+ # C extensions
9
+ *.so
10
+
11
+ # Distribution / packaging
12
+ .Python
13
+ .venv/
14
+ env/
15
+ bin/
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ eggs/
20
+ lib/
21
+ lib64/
22
+ parts/
23
+ sdist/
24
+ var/
25
+ include/
26
+ man/
27
+ venv/
28
+ *.egg-info/
29
+ .installed.cfg
30
+ *.egg
31
+
32
+ # Installer logs
33
+ pip-log.txt
34
+ pip-delete-this-directory.txt
35
+ pip-selfcheck.json
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .coverage
41
+ .cache
42
+ nosetests.xml
43
+ coverage.xml
44
+
45
+ # Translations
46
+ *.mo
47
+
48
+ # Mr Developer
49
+ .mr.developer.cfg
50
+ .project
51
+ .pydevproject
52
+
53
+ # Rope
54
+ .ropeproject
55
+
56
+ # Django stuff:
57
+ *.log
58
+ *.pot
59
+
60
+ .DS_Store
61
+
62
+ # Sphinx documentation
63
+ docs/_build/
64
+
65
+ # PyCharm
66
+ .idea/
67
+
68
+ # VSCode
69
+ .vscode/
70
+
71
+ # Pyenv
72
+ .python-version
73
+
74
+ uv.lock
75
+ dataPerformance.*
76
+
77
+ .cargo/
78
+
79
+ # mid-build files
80
+ al_alpha101.csv
81
+ al_timing.csv
82
+ comparison_results.csv
@@ -0,0 +1,8 @@
1
+ # ChangeLog
2
+
3
+ ## [0.3.9] - 2026-05-29
4
+
5
+ ### Added
6
+
7
+ - 新分支,正式上线
8
+