ETF backtest engine for the QUANTAXIS ecosystem
Project description
qaetf-rs
qaetf-rs 是 QUANTAXIS 生态中的下一代高性能 ETF 回测引擎。它采用 Rust 编写核心计算逻辑,通过 PyO3 提供极致性能的 Python 接口。
🏗️ 架构设计
项目遵循 Ports-and-Adapters (Hexagonal Architecture) 架构原则,确保业务逻辑的纯粹性与确定性:
graph TD
User["Python 策略 / 研究员"] --> PyAdapter["qaetf-py (Adapter: PyO3)"]
PyAdapter --> Core["qaetf-core (Domain: 撮合 & 账户)"]
Data["MongoDB (Persistence)"] <-.-> DataAdapter["qaetf-data (Adapter)"]
DataAdapter <-.-> Core
- qaetf-core: 纯领域逻辑。包含确定性撮合引擎、多资产账户管理、QIFI 协议支持。
- qaetf-data: 数据持久化适配器。支持 MongoDB 8.2.6+,用于存储历史数据与回测结果。
- qaetf-py: Python 语言接口。基于 PyO3 构建,实现零拷贝数据传递。
✨ 核心特性
- 高性能: 相比纯 Python 回测引擎,在处理百万级 Bar 数据时速度提升 10x - 100x。
- 确定性: 核心撮合逻辑不依赖系统时间或随机数,保证回测结果 100% 可重复。
- QIFI 兼容: 原生支持 QUANTAXIS 交互式协议,易于在回测与实盘环境间切换。
- ETF 交易语义: 显式支持 ETF T+1、最小下单单位、价格 tick、手续费与滑点配置。
- 内存安全: 利用 Rust 所有权模型,消除复杂的并发数据竞争与内存泄漏风险。
🛠️ 安装与开发
环境要求
- Rust 1.75+
- Python 3.9 - 3.12
uv(推荐) 或pip
编译安装 (Python 环境)
使用 uv 进行快速开发编译:
# 克隆仓库
git clone https://github.com/your-repo/qaetf-rs.git
cd qaetf-rs
# 编译并安装 Rust 扩展到本地开发环境
uv run maturin develop
Rust 工作空间编译
cargo build --release
🚀 快速上手 (Python)
from qaetf import BacktestConfig, BacktestEngine, Bar, OrderIntent
def my_strategy(context):
bar = context["bar"]
if bar["datetime"] == "20240101093000":
return [OrderIntent(bar["code"], "buy", 100, None)]
return []
config = BacktestConfig("test_user", 100000.0)
engine = BacktestEngine(config, my_strategy)
bars = [
Bar(
code="510300",
datetime="20240101093000",
open=10.0,
high=10.5,
low=9.9,
close=10.2,
volume=100000,
adj_factor=None,
)
]
result = engine.run(bars)
print(f"最终净值: {result['summary']['final_equity']}")
v1.1 ETF 回测语义
默认构造保持兼容旧基线:BacktestConfig("account-1", 100000.0) 使用 legacy 交易规则、0 手续费、0 滑点。显式配置才启用新的 ETF 语义:
config = BacktestConfig(
"account-1",
100000.0,
commission_rate=0.0003,
min_commission=5.0,
slippage_bps=1.0,
trading_rule_preset="etf_t1",
)
trading_rule_preset="legacy":默认行为,最小下单单位为 1,不强制 price tick,允许同日买入后卖出,不允许裸空。trading_rule_preset="etf_t1":ETF T+1 行为,最小下单单位为 100,price tick 为 0.001,今日买入进入今仓,同日不可卖;交易日切换后今仓结转为昨仓,昨仓才可卖。commission_rate与min_commission:按max(price * volume * commission_rate, min_commission)计算手续费。买入扣notional + fee,卖出入账notional - fee,卖出已实现盈亏扣卖出 fee。为保持最小行为变更,买入 fee 不摊入average_cost,但 cash、final equity 和 total return 会体现买入 fee。slippage_bps:按基点调整成交价,买入价上浮,卖出价下浮。默认 0 不改变旧成交价。- Python result 中
trade["fee"]仅在手续费非零时出现,默认 0 手续费不改变旧 trade schema。
QIFI 字段兼容范围见 docs/qifi_compatibility_matrix.md。性能与测试收口说明见 docs/performance_report.md 和 docs/test_coverage.md。
v1.1 当前支持:
- A 股 ETF bar-only 回测。
- 日线与分钟线 Bar。
- 单策略、单账户、多标的持仓与订单维护。
- ETF T+1、手续费、滑点、最小下单单位和 price tick。
- Mongo 历史行情读写与回测结果 repository 存储。
- PyO3 Python 策略接口。
v1.1 当前不支持:
- Tick / L2 行情撮合。
- 实盘券商 API。
- 多策略共享账户。
- ETF 申赎。
- 复杂撮合、复杂订单类型和数据库迁移。
Python ETF 数据层
qaetf.data 提供最小可用的 ETF 行情采集、清洗、验证与 Mongo 导入链路。Python 数据层只负责数据侧适配,不修改 Rust core,也不参与回测撮合逻辑。
模块结构:
ETFDataProvider:数据源抽象。InMemoryETFDataProvider:测试和示例用内存数据源。PytdxETFDataProvider:pytdx 数据源入口,未安装 pytdx 时会在使用时给出明确错误。ETFDataFetcher:调用 provider 并返回统一 Bar schema。ETFBarValidator:校验和规范化 Bar。ETFMongoStorage:写入与读取 Mongo 行情集合。
默认安装不强制安装真实数据链路依赖。需要真实 Mongo 或 pytdx 时安装 optional extra:
uv sync --extra mongo
uv sync --extra pytdx
uv sync --extra data
统一 Bar schema 使用可排序字符串时间:日线为 YYYY-MM-DD,分钟线为 YYYY-MM-DD HH:MM:SS。字段包括:code, market, datetime, frequency, open, high, low, close, volume, amount, source。
validator 会检查必填字段、OHLC 非负与区间关系、volume/amount 非负、频率白名单,并按 ETF 代码前缀推断 SSE/SZSE。Mongo 行情集合为 etf_daily 与 etf_minute,均建立 { code: 1, datetime: 1, frequency: 1 } 复合唯一索引。
InMemory provider 示例:
from qaetf.data import ETFDataFetcher, InMemoryETFDataProvider
provider = InMemoryETFDataProvider(
daily_bars=[
{
"code": "510300",
"datetime": "2024-01-02",
"open": 1.0,
"high": 1.2,
"low": 0.9,
"close": 1.1,
"volume": 1000,
}
]
)
fetcher = ETFDataFetcher(provider=provider)
bars = fetcher.fetch_daily("510300", start="2024-01-01", end="2024-01-31")
Pytdx provider 示例:
from qaetf.data import ETFDataFetcher, PytdxETFDataProvider
provider = PytdxETFDataProvider()
fetcher = ETFDataFetcher(provider=provider)
bars = fetcher.fetch_daily("510300", start="2024-01-01", end="2024-01-31")
PytdxETFDataProvider 默认连接公开通达信行情服务器,适用于研究和测试场景;生产级数据链路应使用受控行情网关,并在落库前通过 ETFBarValidator 校验。
数据采集 CLI dry-run:
python -m qaetf.data.cli fetch \
--code 510300 \
--frequency 1d \
--start 2024-01-01 \
--end 2024-01-31 \
--dry-run
写入 Mongo:
python -m qaetf.data.cli fetch \
--code 510300 \
--frequency 1d \
--start 2024-01-01 \
--end 2024-01-31 \
--mongo-uri mongodb://localhost:27017 \
--database qaetf
JSON 输出:
python -m qaetf.data.cli fetch \
--code 510300 \
--frequency 1d \
--dry-run \
--json
CLI 会输出采集 summary、preview 和 quality report。安装后也可使用等价 console script:
uv run qaetf-fetch-etf fetch --code 510300 --frequency 1d --dry-run
Mongo URI 不应提交到代码或配置文件中;生产环境不要在命令行传递带账号密码的 Mongo URI,避免进入 shell history、进程列表或 CI 日志。生产数据采集调度不属于当前 v1.1 范围。
Mongo storage 示例:
from qaetf.data import ETFMongoStorage
storage = ETFMongoStorage(uri="mongodb://localhost:27017", database="qaetf_test_local")
storage.ensure_indexes()
storage.insert_bars(bars, frequency="1d")
loaded = storage.load_bars("510300", frequency="1d")
可选 integration test 默认跳过。需要手动启用:
QAETF_TEST_MONGO_URI=mongodb://localhost:27017 pytest tests/integration/test_mongo_storage_integration.py
QAETF_TEST_PYTDX=1 pytest tests/integration/test_pytdx_provider_integration.py
Mongo integration 默认只允许单机或多机本地 Mongo URI,mongodb+srv:// 和远程 host 必须额外设置 QAETF_TEST_MONGO_ALLOW_REMOTE=1;测试库名必须匹配 qaetf_test 或 qaetf_test_*,不要指向生产库。测试清理只删除本轮生成的唯一 source 数据。
🧪 测试
# 运行 Rust 单元测试
cargo test
# 运行 Python 集成测试
pytest tests/
Golden 回测基线
tests/fixtures/golden/510300_1d_dual_ma_bars.json 提供固定的 510300 日线小样本,tests/test_golden_dual_ma.py 使用 3/5 日双均线策略、next_bar_open 撮合和 100000 初始资金验证回测确定性。期望结果保存在 tests/fixtures/golden/dual_ma_510300_expected.json。
更新 golden expected:
uv run maturin develop
uv run python scripts/update_golden_dual_ma.py --update
uv run pytest tests/test_golden_dual_ma.py
Differential 回测测试
tests/test_differential_reference.py 使用极简 Python reference engine 对照正式 Rust/PyO3 BacktestEngine,用于验证核心回测语义没有偏离。当前覆盖范围包括单标的 510300 日线 dual-ma legacy 场景、分钟线 ETF T+1 + 手续费 + 滑点场景,以及多标的 ETF T+1 独立持仓场景。
多标的 deterministic 单元覆盖位于 tests/test_backtest_engine.py。Mongo repository/E2E 覆盖位于 crates/qaetf-data/tests/mongo_backtest_repository.rs,真实 Mongo 路径需要显式环境变量启用。
运行 differential test:
uv run pytest tests/test_differential_reference.py
Benchmark
Golden 和 differential tests 负责 correctness;性能观察由 benchmarks/ 中的 FFI、Mongo read 与 E2E benchmark 脚本完成。Benchmark 默认不作为普通 CI gate。覆盖率运行说明见 docs/test_coverage.md,性能报告模板见 docs/performance_report.md。
📏 编码规范
- 遵循 SOLID, KISS, DRY 原则。
- 核心逻辑层禁止直接使用 IO(必须通过 Adapter 注入)。
- 提交代码前请确保
cargo clippy与cargo fmt已通过。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qaetf-1.2.1.tar.gz.
File metadata
- Download URL: qaetf-1.2.1.tar.gz
- Upload date:
- Size: 87.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5988062a324dccc861cfca000be74a795221e0680780a83aaf09c120abe06d80
|
|
| MD5 |
fb3bebfd49b39b2ee78514124979c596
|
|
| BLAKE2b-256 |
33b721310a4f5dd33b9a3440d7f2b46d3222e79c4c3bba9377140ea7d8bd351d
|
Provenance
The following attestation bundles were made for qaetf-1.2.1.tar.gz:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1.tar.gz -
Subject digest:
5988062a324dccc861cfca000be74a795221e0680780a83aaf09c120abe06d80 - Sigstore transparency entry: 1566115144
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 210.2 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d31fdac36c99030ae1979e04ea7991661a28915c58fd60649ccfaf593eb92148
|
|
| MD5 |
3dbde74a964b8f49f3e267a8667ca045
|
|
| BLAKE2b-256 |
23066fd03f9b20926d5282340037327f883f39d606246bdd17582421f6b2acc5
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp312-cp312-win_amd64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp312-cp312-win_amd64.whl -
Subject digest:
d31fdac36c99030ae1979e04ea7991661a28915c58fd60649ccfaf593eb92148 - Sigstore transparency entry: 1566115181
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 303.1 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40aacc6fba9690b56cf9ca8fe40d289d2a0f14b502027e8488d91fa7201e6048
|
|
| MD5 |
3ad68f21439edf4973eb920e4ca9634e
|
|
| BLAKE2b-256 |
188c8b06772240d330eedf47d9f4fc428f55b43dec502c3fd00b23caf9176db8
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
40aacc6fba9690b56cf9ca8fe40d289d2a0f14b502027e8488d91fa7201e6048 - Sigstore transparency entry: 1566115441
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 290.9 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3861f7dfff28e9b91a24de3f4ea504012fae8e80b202fe714e9140b3fd9e970
|
|
| MD5 |
4b3e0dec511c0caec0c7702c8e93bffc
|
|
| BLAKE2b-256 |
086ad77f2b56d2b024e319bdfdcd271dbc87ba1a40dc5a126acecd1d78616282
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
d3861f7dfff28e9b91a24de3f4ea504012fae8e80b202fe714e9140b3fd9e970 - Sigstore transparency entry: 1566115491
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 270.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38afd6a2b850916123758589f38c48eb9c75a26dba59e5cf40517c609a4bc62e
|
|
| MD5 |
950eba9dad21121cab50d064d23c5906
|
|
| BLAKE2b-256 |
bd4bc943d2125a1887a4652ab1d41dc34e471e2e894d97a5503f3bc7131351b3
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp312-cp312-macosx_11_0_arm64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp312-cp312-macosx_11_0_arm64.whl -
Subject digest:
38afd6a2b850916123758589f38c48eb9c75a26dba59e5cf40517c609a4bc62e - Sigstore transparency entry: 1566115395
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 209.5 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e235eda4c9f232d51cebc57d5ce1f6bbbf03b4525209ec9146c90d67b658ff8a
|
|
| MD5 |
8febf492986329ebebbaf12b1eed46a1
|
|
| BLAKE2b-256 |
8d6c93a01542e4913a31d8c44d5470241a2de0d70cb9954f4fce2e580179462d
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp311-cp311-win_amd64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp311-cp311-win_amd64.whl -
Subject digest:
e235eda4c9f232d51cebc57d5ce1f6bbbf03b4525209ec9146c90d67b658ff8a - Sigstore transparency entry: 1566115202
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 301.5 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a167feb6498d5750cd26dedb9f0c9cfcd88f2733f63eb8c2e156ca72c3e5a1e
|
|
| MD5 |
4d4df0d703030f1f13e2e0d1756ef402
|
|
| BLAKE2b-256 |
e9ea5fb18587284f9800438da87c0881c6489a9c148f0a9f795d15ca95fa690e
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
0a167feb6498d5750cd26dedb9f0c9cfcd88f2733f63eb8c2e156ca72c3e5a1e - Sigstore transparency entry: 1566115508
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 291.0 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6c4989a093a9beecedd490c90280183e0e3cd1033c11156a6bc365e510674e2
|
|
| MD5 |
1797ee71d2729c222d52f839ee7754ff
|
|
| BLAKE2b-256 |
2f9ac14b76cfb485c1e2e89bb76b7351fe4b5b910984b17618c30de653a56cc3
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
b6c4989a093a9beecedd490c90280183e0e3cd1033c11156a6bc365e510674e2 - Sigstore transparency entry: 1566115229
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 270.5 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5eafdd44767b0216ba71bf7877c28abfe9d8692ccf5fbd81a457ddc0b057df9c
|
|
| MD5 |
ad02135c2c66ed707c8332959b4a7f35
|
|
| BLAKE2b-256 |
08a438eb95b91a5356313c2ce8f45b979e0e2eb22811eefd34c124d046a1addb
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp311-cp311-macosx_11_0_arm64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
5eafdd44767b0216ba71bf7877c28abfe9d8692ccf5fbd81a457ddc0b057df9c - Sigstore transparency entry: 1566115269
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 210.1 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f7d5e1af22d25ab00fcd1623facc82cd409e5ea7bb613d2275b4193643ef7c6
|
|
| MD5 |
51470c049319aa992f759f59c05ecb04
|
|
| BLAKE2b-256 |
3304fe2b73ddb23a5b21ea0be2352694660f18f1b5e5c7ce3a14701cc866f0bf
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp310-cp310-win_amd64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp310-cp310-win_amd64.whl -
Subject digest:
5f7d5e1af22d25ab00fcd1623facc82cd409e5ea7bb613d2275b4193643ef7c6 - Sigstore transparency entry: 1566115325
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 301.6 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
433714e38af5fce544dfec9195d1ccdd36ce1df0d8a9c10c373d242bf04bf82a
|
|
| MD5 |
4b5705057b7ad06a7dbd0297dfde03da
|
|
| BLAKE2b-256 |
30ad4a50057850d5d2f8e85ec072ee4f7dad5e7b2ab97d8f2117e7e8287efedf
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
433714e38af5fce544dfec9195d1ccdd36ce1df0d8a9c10c373d242bf04bf82a - Sigstore transparency entry: 1566115243
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 291.1 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e965004dcd5d40d06cc8f9819a98f3167f0c7fc2cbba9658d57e2a0d8f4e9958
|
|
| MD5 |
10c7d51bf29c842fe55c38ca9741e264
|
|
| BLAKE2b-256 |
1baa6d5dfe9ca287cfc386592924955d0ad5db80dc09a8bcdcd8fc915ee0bea0
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
e965004dcd5d40d06cc8f9819a98f3167f0c7fc2cbba9658d57e2a0d8f4e9958 - Sigstore transparency entry: 1566115458
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 270.6 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b41be254fc51772d58ecd8a0324bd5682a5d833524f8fa0b9bdbfef4ad91d149
|
|
| MD5 |
583f69ea01fc2abe9734d6fbbdb75700
|
|
| BLAKE2b-256 |
058641d88907e9926b08126df0e2d644205cc27ddce8fed744f8195512245894
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp310-cp310-macosx_11_0_arm64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp310-cp310-macosx_11_0_arm64.whl -
Subject digest:
b41be254fc51772d58ecd8a0324bd5682a5d833524f8fa0b9bdbfef4ad91d149 - Sigstore transparency entry: 1566115298
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 210.4 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f098920e0f70acede056ab628f08fb2d22e0b50aa755932d94f9a16599f1bb1
|
|
| MD5 |
6c67b8287388d0810b0ef5c3d01c4c03
|
|
| BLAKE2b-256 |
2672834cc7963b40ac73014e0964e3dc1b83126c0e9ced1e3796b3e6f7453c5c
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp39-cp39-win_amd64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp39-cp39-win_amd64.whl -
Subject digest:
1f098920e0f70acede056ab628f08fb2d22e0b50aa755932d94f9a16599f1bb1 - Sigstore transparency entry: 1566115341
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 302.1 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7a7e0b8b111bf983076104426c1537df94f53ddb6c5f2042a0b1c894b8c6a3f
|
|
| MD5 |
15a4f43c9f9d8f961bf55593a332667d
|
|
| BLAKE2b-256 |
e4d732bd7fedb33dc66138750a2edfaf04543077654d9399ddd48c60aa475dc3
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
a7a7e0b8b111bf983076104426c1537df94f53ddb6c5f2042a0b1c894b8c6a3f - Sigstore transparency entry: 1566115473
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 290.8 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c90908181328e9e1f1ecd71cdf3c332dd73e2ee7f894775ed7cd54d400762512
|
|
| MD5 |
62f6943ce09661398f02c45f75b9f6c1
|
|
| BLAKE2b-256 |
ea4a00ea159f648febd623b7dfeeee9d4a45d2c42fd177e178afc51dd3f3a493
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
c90908181328e9e1f1ecd71cdf3c332dd73e2ee7f894775ed7cd54d400762512 - Sigstore transparency entry: 1566115361
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file qaetf-1.2.1-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: qaetf-1.2.1-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 270.4 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af3bff08e0bb6eb4a738ff232d5ce0707f91a6fe287d3277559adbff0376233b
|
|
| MD5 |
b48df24bb7f8d8b09530033cfcebdf4d
|
|
| BLAKE2b-256 |
caffe1b17f4dcc11e7d0fa50a5f8d1bd19328cf9827abdf64b84ab4a31689aac
|
Provenance
The following attestation bundles were made for qaetf-1.2.1-cp39-cp39-macosx_11_0_arm64.whl:
Publisher:
release.yml on Hkxtor/qaetf-rs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qaetf-1.2.1-cp39-cp39-macosx_11_0_arm64.whl -
Subject digest:
af3bff08e0bb6eb4a738ff232d5ce0707f91a6fe287d3277559adbff0376233b - Sigstore transparency entry: 1566115421
- Sigstore integration time:
-
Permalink:
Hkxtor/qaetf-rs@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/Hkxtor
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8a32ac0967a9f661c24462e7e002dd13fde55b84 -
Trigger Event:
push
-
Statement type: