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包管理, 交易数据, 元数据, 子图, 字符串匹配, 实时数据, 市场数据, 数据归档, 数据抓取, 数据流水线, 数据管道, 数据转换, 无后门, 结构化, 订单事件, 软件工程, 逆向工具, 链上数据