warproxxx/poly_data

GitHub: warproxxx/poly_data

一个用于获取、处理和分析 Polymarket 交易数据的完整数据管道,解决数据结构化与可恢复采集问题。

Stars: 1368 | Forks: 296

# Polymarket 数据 一个用于获取、处理和分析 Polymarket 交易数据的完整数据管道。该系统收集市场信息、订单成交事件,并将它们处理为结构化的交易数据。 ## 快速下载 **首次使用用户**:下载 [最新数据快照](https://polydata-archive.s3.us-east-1.amazonaws.com/orderFilled_complete.csv.xz)(感谢 [@PendulumFlow](https://x.com/PendulumFlow) 修复了数据中的部分缺失点并发送过来),并在首次运行前将其解压到主仓库目录中[(如果此方法无效请使用备用)](https://polydata-archive.s3.us-east-1.amazonaws.com/archive.tar.xz)。这将为您节省超过 2 天的初始数据收集时间。 ## 概述 该管道执行三个主要操作: 1. **市场数据收集** - 获取所有 Polymarket 市场及其元数据 2. **订单事件抓取** - 从 Goldsky 子图收集订单成交事件 3. **交易处理** - 将原始订单事件转换为结构化的交易数据 ## 安装 该项目使用 [UV](https://docs.astral.sh/uv/) 进行快速、可靠的包管理。 ### 安装 UV ``` # macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # 或者使用 pip pip install uv ``` ### 安装依赖 ``` # 安装所有依赖项 uv sync # 安装开发依赖项(Jupyter 等) uv sync --extra dev ``` ## 快速启动 ``` # 使用 UV 运行(推荐) uv run python update_all.py # 或者先激活虚拟环境 source .venv/bin/activate # On Windows: .venv\Scripts\activate python update_all.py ``` 这将按顺序运行所有三个管道阶段: - 从 Polymarket API 更新市场 - 从 Goldsky 更新订单成交事件 - 将新订单处理为交易 ## 项目结构 ``` poly_data/ ├── update_all.py # Main orchestrator script ├── update_utils/ # Data collection modules │ ├── update_markets.py # Fetch markets from Polymarket API │ ├── update_goldsky.py # Scrape order events from Goldsky │ └── process_live.py # Process orders into trades ├── poly_utils/ # Utility functions │ └── utils.py # Market loading and missing token handling ├── markets.csv # Main markets dataset ├── missing_markets.csv # Markets discovered from trades (auto-generated) ├── goldsky/ # Order-filled events (auto-generated) │ └── orderFilled.csv └── processed/ # Processed trade data (auto-generated) └── trades.csv ``` ## 数据文件 ### markets.csv 市场元数据,包括: - 市场问题、结果和代币 - 创建/关闭时间和 slug - 交易量和条件 ID - 负风险指标 **字段**: `createdAt`, `id`, `question`, `answer1`, `answer2`, `neg_risk`, `market_slug`, `token1`, `token2`, `condition_id`, `volume`, `ticker`, `closedTime` ### goldsky/orderFilled.csv 原始订单成交事件,包含: - 制造者/接受者地址和资产 ID - 填充数量和交易哈希 - Unix 时间戳 **字段**: `timestamp`, `maker`, `makerAssetId`, `makerAmountFilled`, `taker`, `takerAssetId`, `takerAmountFilled`, `transactionHash` ### processed/trades.csv 结构化交易数据,包括: - 市场 ID 映射和交易方向 - 价格、美元金额和代币金额 - 制造者/接受者角色和交易详情 **字段**: `timestamp`, `market_id`, `maker`, `taker`, `nonusdc_side`, `maker_direction`, `taker_direction`, `price`, `usd_amount`, `token_amount`, `transactionHash` ## 管道阶段 ### 1. 更新市场 (`update_markets.py`) 按时间顺序从 Polymarket API 获取所有市场。 **特性**: - 自动从上次偏移量恢复(幂等) - 速率限制和错误处理 - 批量获取(每请求 500 个市场) **用法**: ``` uv run python -c "from update_utils.update_markets import update_markets; update_markets()" ``` ### 2. 更新 Goldsky (`update_goldsky.py`) 从 Goldsky 子图 API 抓取订单成交事件。 **特性**: - 自动从上次时间戳恢复 - 处理带有分页的 GraphQL 查询 - 去重事件 **用法**: ``` uv run python -c "from update_utils.update_goldsky import update_goldsky; update_goldsky()" ``` ### 3. 处理实时交易 (`process_live.py`) 将原始订单事件处理为结构化交易。 **特性**: - 使用代币查找将资产 ID 映射到市场 - 计算价格和交易方向 - 识别 BUY/SELL 方向 - 通过交易发现缺失的市场 - 从上次检查点开始增量处理 **用法**: ``` uv run python -c "from update_utils.process_live import process_live; process_live()" ``` **处理逻辑**: - 识别每笔交易中非 USDC 的资产 - 映射到市场和结果代币(token1/token2) - 确定制造者/接受者方向(BUY/SELL) - 将价格计算为每个结果代币对应的 USDC 金额 - 将金额从原始单位转换(除以 10^6) ## 依赖项 依赖项通过 `pyproject.toml` 管理,并使用 `uv sync` 自动安装。 **关键库**: - `polars` - 快速 DataFrame 操作 - `pandas` - 数据操作 - `gql` - 用于 Goldsky 的 GraphQL 客户端 - `requests` - 对 Polymarket API 的 HTTP 请求 - `flatten-json` - 用于嵌套响应的 JSON 展平 **开发依赖项**(可选,通过 `--extra dev` 安装): - `jupyter` - 交互式笔记本 - `notebook` - Jupyter 笔记本界面 - `ipykernel` - Jupyter 的 Python 内核 ## 功能 ### 可恢复操作 所有阶段都会自动从上次中断处恢复: - **市场**:计算现有 CSV 行数以设置偏移量 - **Goldsky**:从 orderFilled.csv 读取最后时间戳 - **处理**:查找最后处理的交易哈希 ### 错误处理 - 网络故障时自动重试 - 速率限制检测和退避 - 服务器错误(500)处理 - 缺失数据的优雅回退 ### 缺失市场发现 处理阶段会自动发现初始 markets.csv 中不存在的市场(例如,上次更新后创建的市场),并通过 Polymarket API 获取它们,并保存到 `missing_markets.csv`。 ## 数据模式详情 ### 交易方向逻辑 - **接受者方向**:支付 USDC 为 BUY,接收 USDC 为 SELL - **制造者方向**:与接受者方向相反 - **价格**:始终以每个结果代币对应的 USDC 表示 ### 资产映射 - 资产 ID 为 "0" 表示 USDC - 非零 ID 是结果代币 ID(来自市场的 token1/token2) - 每笔交易涉及 USDC 和一个结果代币 ## 注意事项 - 所有金额均标准化为标准十进制格式(除以 10^6) - 时间戳从 Unix 纪元转换为 datetime - 平台钱包(`0xc5d563a36ae78145c45a50134d48a1215220f80a`, `0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e`)在 `poly_utils/utils.py` 中被跟踪 - 市场数据中的负风险市场会被标记 ## 故障排除 **问题**:处理过程中找不到市场 **解决方案**:先运行 `update_markets()`,或让 `process_live()` 自动发现它们 **问题**:重复交易 **解决方案**:自动去重 - 如有必要,请从头重新运行处理 **问题**:速率限制 **解决方案**:管道会自动处理并使用指数退避 ## 分析 ### 加载数据 ``` import pandas as pd import polars as pl from poly_utils import get_markets, PLATFORM_WALLETS # 加载市场 markets_df = get_markets() # 加载交易 df = pl.scan_csv("processed/trades.csv").collect(streaming=True) df = df.with_columns( pl.col("timestamp").str.to_datetime().alias("timestamp") ) ``` ### 按用户过滤交易 **重要**:在过滤特定用户的交易时,请按 `maker` 列过滤。即使看起来只获取了用户作为制造者的交易,这也是 Polymarket 在合约级别生成事件的方式。`maker` 列显示了从该用户视角(包括价格)的交易。 ``` USERS = { 'domah': '0x9d84ce0306f8551e02efef1680475fc0f1dc1344', '50pence': '0x3cf3e8d5427aed066a7a5926980600f6c3cf87b3', 'fhantom': '0x6356fb47642a028bc09df92023c35a21a0b41885', 'car': '0x7c3db723f1d4d8cb9c550095203b686cb11e5c6b', 'theo4': '0x56687bf447db6ffa42ffe2204a05edaa20f55839' } # 获取特定用户的所有交易 trader_df = df.filter((pl.col("maker") == USERS['domah'])) ``` ## 许可证 随意使用
标签:API收集, CSV处理, DeFi数据, ETL, Goldsky, GraphQL, JavaCC, Polymarket, Python, S3, URL抓取, UV包管理, 交易数据, 元数据, 子图, 字符串匹配, 实时数据, 市场数据, 数据归档, 数据抓取, 数据流水线, 数据管道, 数据转换, 无后门, 结构化, 订单事件, 软件工程, 逆向工具, 链上数据