yfinance 不提供真正毫秒级实时行情,但对个人监控足够可靠——它获取的是 yahoo finance 免费延时数据(美股延时15–20分钟,a股/港股部分无数据),不可用于高频交易。

用 yfinance 获取实时(准实时)股价数据是否可靠?
直接说结论:yfinance 不提供真正毫秒级的“实时”行情,但对个人监控场景足够用——它拉取的是 Yahoo Finance 的免费延时数据(美股通常延时 15–20 分钟,A 股/港股部分代码可能无数据或返回空)。别指望靠它做高频交易提醒。
实操建议:
- 确认目标股票代码符合 Yahoo Finance 格式,例如 A 股用
"600519.SS"(上交所)、"000858.SZ"(深交所),不是"600519" - 首次调用
yf.Ticker(symbol).history(period="1d")可能卡住或抛TypeError,加timeout=10和异常捕获更稳 - 避免高频请求(如每秒查一次),Yahoo 会封 IP;间隔至少 30 秒以上,否则
HTTPError 403或返回空pd.DataFrame
怎么设置价格触发条件并避免重复提醒?
核心是状态缓存 + 条件去重。不能每次轮询都发一遍微信/邮件,得记住“上次已提醒过 600519 突破 180 元”这件事。
实操建议:
- 用一个本地 JSON 文件(如
"alerts_log.json")记录{"symbol": "600519.SS", "trigger_price": 180.0, "last_alerted_at": "2024-05-22T14:23:01"} - 每次检查前先读文件,若当前价 > 目标价 且 距上次提醒 > 5 分钟,才执行通知并更新文件
- 别用内存变量存状态——程序重启就丢,必须落盘;也别用全局 dict 模拟,多进程下不安全
用微信 / 邮件发提醒,哪个更简单且不易被拦截?
微信更可控:用企业微信自建应用 + Webhook,比邮箱 SMTP 更少被当成垃圾邮件,也不依赖你家宽带的 25 端口是否开放。
实操建议:
- 企业微信后台创建「自定义机器人」,复制 Webhook URL,发 POST 时 body 是
{"msgtype": "text", "text": {"content": "【提醒】600519.SS 当前价 182.50,突破目标 180.00"}} - 邮箱方案慎选:Gmail 需开启 App Password + 两步验证;国内邮箱(如 QQ、163)SMTP 往往要求 SSL/TLS 且端口固定(
smtp.qq.com:465),填错一个参数就SMTPAuthenticationError - 无论哪种,都把通知逻辑包进
try/except,失败不中断主循环,只打日志
怎么让脚本长期运行又不占满 CPU?
最常见错误是写个 while True: check(); time.sleep(1) —— 看似简单,实际每秒唤醒一次,系统负载虚高,还容易漏掉窗口期。
实操建议:
- 用
time.sleep(60)(至少 60 秒),配合datetime.now().time()过滤非交易时段(如 A 股避开 11:30–13:00),减少无效轮询 - 加信号处理:按
Ctrl+C时优雅退出,把最后状态写入日志,而不是直接 kill - 部署到 Linux 用
nohup python monitor.py > monitor.log 2>&1 &,但更推荐systemd服务管理,崩溃后自动重启
真正难的不是拉数据或发消息,而是让整个链路在断网、超时、磁盘满、微信接口抖动这些日常故障里自己扛住不崩——所有 IO 操作都要有 fallback,所有状态都要可恢复。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











