加跨地部署脚本与站点对比,数据全表加 site 列

目的是在第二台机器(AWS)上跑一套完全相同的采集,看不同地理位置的数据差异。
滑点里最大的一项是延迟漂移,而延迟含网络传输,所以机房选址是可优化参数。

数据侧两处必需改动:

- 全部输出加 site 列(三张 CSV 加 gzip 里的盘口与成交流)。没有这一列,两台
  机器的数据合起来就分不清来源。为免四处 writerow 漏加一处产生静默空值,
  改在 _SiteWriter 里统一注入。
- start.sh 在时钟未同步或偏移超 10ms 时**拒绝启动**。所有延迟数字都是
  「本地时钟 − 交易所 K 线收盘」,时钟偏 50ms 就全部同向偏 50ms,且不报错,
  只会让跨地对比得出一个干净且完全错误的结论。

deploy/ 下四个文件:setup.sh(docker + chrony + 拉镜像)、start.sh(校验时钟、
写运行元数据、起容器)、status.sh(健康速查)、README。运行元数据记 git commit、
镜像摘要、时钟偏移——两地数据对不上时,这三项任一不同都足以解释差异。

compare_sites.py 做配对对比:只取各站都有的 K 线(不取交集可能在比不同时段,
而延迟对市场活跃度敏感),并报配对差的符号占比而非两个中位数相减。已用注入
120ms 的合成数据验证能精确还原。另有一条自检:同一固定延迟点上两站漂移应当
相同——漂移是市场性质,若也差很多则先查时钟与时段对齐。

status.sh 里按列名取字段下标而非写死数字:加 site 列时字段整体右移过一次,
写死 $8 会静默变成读 lag_signal_ms 而非 lag_data_ms。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 02:39:47 +08:00
co-authored by Cursor
parent 01c4a4ab4d
commit 631d97e493
6 changed files with 580 additions and 6 deletions
+87
View File
@@ -0,0 +1,87 @@
#!/usr/bin/env bash
# 影子采集器的机器初始化。幂等,可重复跑。
#
# 用途:在另一台机器(如 AWS)上部署一套完全相同的采集,用来看不同地理位置
# 的数据采集有无差异。要比的主要是延迟——「本地接收 − K线收盘」这个量直接
# 取决于机器到交易所的网络距离。
#
# 时钟同步是硬前置条件,不是可选项。所有延迟数字都是本地时钟减交易所时间戳,
# 时钟偏 50ms 就等于所有延迟凭空多(或少)50ms,而且不会有任何报错。所以这里
# 装并启用 NTP,start.sh 里还会再校验一次、不合格拒绝启动。
#
# bash research/live/deploy/setup.sh
set -euo pipefail
IMAGE="${SHADOW_IMAGE:-hummingbot/hummingbot:latest}"
say() { printf '\n\033[1m==> %s\033[0m\n' "$*"; }
say "系统信息"
uname -a
echo "内存:$(free -g | awk '/^Mem:/{print $2"GB 总 / "$7"GB 可用"}')"
echo "CPU$(nproc)"
say "安装 docker"
if command -v docker >/dev/null 2>&1; then
echo "已有 docker $(docker --version)"
else
if command -v apt-get >/dev/null 2>&1; then
sudo apt-get update -qq
sudo apt-get install -y -qq ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" \
| sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt-get update -qq
sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io
elif command -v dnf >/dev/null 2>&1; then
# Amazon Linux 2023
sudo dnf install -y -q docker
sudo systemctl enable --now docker
else
echo "不认识的包管理器,请手动装 docker" >&2
exit 1
fi
sudo usermod -aG docker "$USER" || true
echo "已装 docker。若本次 shell 无权限,重新登录后再跑 start.sh"
fi
say "启用时钟同步(延迟测量的前置条件)"
if command -v chronyc >/dev/null 2>&1; then
echo "已有 chrony"
elif command -v apt-get >/dev/null 2>&1; then
sudo apt-get install -y -qq chrony
elif command -v dnf >/dev/null 2>&1; then
sudo dnf install -y -q chrony
fi
sudo systemctl enable --now chrony 2>/dev/null \
|| sudo systemctl enable --now chronyd 2>/dev/null || true
sleep 3
if command -v chronyc >/dev/null 2>&1; then
chronyc tracking | grep -E 'Reference ID|System time|Last offset' || true
else
timedatectl 2>/dev/null | grep -i synchron || true
fi
say "拉镜像 $IMAGE"
docker pull "$IMAGE"
docker image inspect "$IMAGE" --format '摘要 {{index .RepoDigests 0}}' 2>/dev/null || true
say "准备输出目录"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
mkdir -p "$REPO_ROOT/research/out"
echo "$REPO_ROOT/research/out"
say "完成"
cat <<'EOF'
下一步:
SHADOW_SITE=aws-tokyo bash research/live/deploy/start.sh
SHADOW_SITE 必须显式给且两台机器不能相同——它会写进每一行数据,
是之后区分数据来源的唯一依据。
EOF