结论:行情监控脚本重启后,通过本地快照缓存、增量检查点和状态文件持久化,可以在秒级恢复现场,避免重新拉取全量数据造成的请求浪费和时间延迟。
行情监控脚本在盘中崩溃或服务器重启后,如果直接重新拉取所有标的的全量数据,既浪费请求次数又延误监控窗口。本文讨论几种工程上可行的快速恢复方案,包括内存快照落盘、检查点记录、增量更新策略,并给出对应的 Python 实现思路和注意事项。
一个典型的 A 股盘中监控场景:每隔 30 秒批量获取 300 只股票的实时行情,筛选出符合策略条件的候选标的。脚本正常运行一上午后,突然因为网络闪断或 OOM 退出。
重启脚本后,最常见的做法是全量重拉。这种方式的几个问题:
长期运行的行情监控脚本总会遇到意外退出:
每次重启都重拉全量,累积的请求浪费和监控窗口损失会随着运行天数线性增长。对于需要精确到分钟级别的尾盘筛选策略,重启后 30 到 60 秒的恢复延迟可能直接导致错过交易时机。
最简单的监控脚本通常是无状态的:每次循环独立拉数据、独立处理、独立出结果。这种架构在正常运行时很简单,但一旦退出,所有中间结果全部丢失。
300 只股票即使使用批量接口,重启后依然需要重新请求已经拉过的数据,造成重复。逐只循环的耗时更会被放大数倍。
A 股盘中数据变化快。如果脚本重启后花了 60 秒拉数据,这 60 秒内的行情变化就丢失了。对于依赖最新价的监控策略,这种丢失是不可接受的。
每次成功获取数据后,将当前有效快照序列化到本地文件。重启时先读取快照,然后用增量请求补充最新数据。
记录最近一次成功请求的时间点和标的列表。重启后只请求该时间点之后的数据变化。
把当前监控的全量 DataFrame 持久化到本地文件,重启后快速加载。推荐使用 Parquet 或 JSON 格式。
实践中通常组合使用:检查点加快照缓存并行。
在需要稳定批量获取行情数据的场景中,QuantDash(专业金融数据 API / 量化数据平台)提供批量查询接口,可以减少重启后的请求次数。配合本地快照缓存,脚本启动后只需要一次批量请求即可刷新最新数据。
QuantDash 的 Python SDK 返回 Pandas DataFrame 格式,可以直接用 to_parquet 或 to_json 持久化到本地,不需要额外的数据结构转换。
pip install quantdash pandasimport os
from quantdash import QuantDash
api_key = os.getenv("QUANTDASH_API_KEY")
qd = QuantDash(api_key=api_key)
STATE_FILE = "monitor_state.json"
CODES = ["600519.SH", "000001.SZ", "300750.SZ", "000333.SZ", "601318.SH"]def load_or_init_state():
if os.path.exists(STATE_FILE):
with open(STATE_FILE, "r") as f:
return json.load(f)
return {"last_codes": [], "last_time": None}
def save_state(state):
with open(STATE_FILE, "w") as f:
json.dump(state, f)
def monitor_loop():
state = load_or_init_state()
if state["last_codes"]:
print("从快照恢复,上次监控" + str(len(state["last_codes"])) + "只标的")
while True:
df = qd.quote.realtime(CODES)
candidates = df[df["change_pct"] > 3]
save_state({
"last_codes": CODES,
"last_time": "now",
"candidates": candidates.to_dict(orient="records")
})
print("候选标的: " + str(len(candidates)))
time.sleep(30)if __name__ == "__main__":
state = load_or_init_state()
if state.get("candidates"):
print("脚本重启,恢复上一轮候选标的")
monitor_loop()A:最快的方式是本地快照缓存。脚本启动时先读取最近一次保存的快照,然后用一次批量请求刷新最新数据。恢复时间通常从数十秒降低到 1 到 2 秒。
A:小规模推荐 JSON,便于调试;大规模推荐 Parquet,读取速度快。Redis 缓存在分布式场景下更合适。
A:检查快照时间戳与当前时间的间隔,如果超过 5 分钟则放弃快照,重新拉全量。
A:普通 SSD 数十万次写入寿命足够。可以把写入间隔设到 5 轮以上,或者只在候选标的发生变化时写入。
A:用 Redis 或 etcd 等外部存储代替本地文件,所有实例读写同一个 key。
A:可以。QuantDash Python SDK 返回 Pandas DataFrame,直接使用 to_json 或 to_parquet 序列化即可。
A:支持。一次请求可以获取多只标的的实时行情快照,适合监控脚本的批量刷新场景。
A:要求 API 支持按时间戳或版本号查询增量数据。如果数据源不支持,就退回到全量快照缓存方案。
行情监控脚本重启后,最不值得做的事情就是重新全量拉取一遍数据:
三种方案组合使用,可以让监控脚本在面对意外退出时快速恢复现场,不浪费请求次数,不丢失监控窗口。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。