如何使用Python实时监控股票价格并发送邮件提醒

企业微信

为什么需要自己写监控程序

券商APP的提醒功能经常延迟,甚至不触发。期货夜盘波动大,人不可能24小时盯着屏幕。用Python自己写一个监控脚本,价格到了指定位置,邮件直接发到手机,比任何推送都可靠。

准备工作

安装两个库:akshare用于抓取股票和期货的实时行情,yagmail用于发邮件。命令行里执行:

如何使用Python实时监控股票价格并发送邮件提醒


pip install akshare yagmail

邮箱需要开启SMTP服务。以QQ邮箱为例,进入设置-账户,开启SMTP,生成授权码。这个授权码就是后面发邮件用的密码,不是你的邮箱登录密码。

获取实时价格

akshare的接口非常简单。股票用stock_zh_a_spot_em,期货用futures_zh_spot。下面是一个获取股票实时价格的函数:


import akshare as ak

def get_stock_price(symbol):

    df = ak.stock_zh_a_spot_em()

    row = df[df['代码'] == symbol]

    if row.empty:

        return None

    return float(row['最新价'].values[0])

期货实时行情需要指定合约代码,比如螺纹钢主力合约rb2310:


import akshare as ak

def get_futures_price(symbol):

    df = ak.futures_zh_spot(symbol=symbol, market='CF')

    return float(df['current_price'].values[0])

注意akshare的接口偶尔会变动,使用前最好查一下最新文档。

发送邮件提醒

yagmail发邮件只需要三行代码。把邮箱地址、授权码、收件人填好:


import yagmail

def send_email(subject, content):

    yag = yagmail.SMTP(user='你的邮箱@qq.com', password='授权码', host='smtp.qq.com')

    yag.send(to='收件邮箱@qq.com', subject=subject, contents=content)

如果想让邮件同时发到手机短信,可以用运营商的邮件短信提醒功能,或者用IFTTT转发。最直接的办法是邮箱绑定微信,邮件来了微信会弹通知。

完整监控逻辑

把获取价格和发送邮件组合起来。设定一个阈值,价格突破就发邮件。实际运行中要避免重复发送,加一个状态标记:


import time

symbol = '600519'

threshold_high = 1800

threshold_low = 1700

sent_high = False

sent_low = False

while True:

    price = get_stock_price(symbol)

    if price is None:

        time.sleep(10)

        continue

    if price >= threshold_high and not sent_high:

        send_email('价格突破提醒', f'{symbol} 当前价格 {price},已突破 {threshold_high}')

        sent_high = True

    if price <= threshold_low and not sent_low:

        send_email('价格跌破提醒', f'{symbol} 当前价格 {price},已跌破 {threshold_low}')

        sent_low = True

    time.sleep(30)

这个循环每30秒检查一次。实际使用时可以把sleep时间设短一点,但不要低于5秒,否则akshare接口可能返回空数据。

处理异常和网络问题

网络请求会失败,接口会超时。加一个try-except,记录错误但不中断程序:


try:

    price = get_stock_price(symbol)

except Exception as e:

    print(f'获取价格失败: {e}')

    time.sleep(30)

    continue

还有一个坑:akshare返回的DataFrame列名可能变化。每次运行前先打印一下列名,确保代码里的'最新价'、'代码'这些字段是对的。

多品种监控

股票和期货可以放在一个列表里遍历。期货代码需要区分交易所,上期所是SHFE,大商所是DCE,郑商所是CZCE。akshare的futures_zh_spot需要传market参数。写一个通用的监控函数:


def monitor(watchlist):

    for item in watchlist:

        if item['type'] == 'stock':

            price = get_stock_price(item['code'])

        else:

            price = get_futures_price(item['code'])

        check_and_alert(item, price)

watchlist里每个字典包含代码、类型、上下阈值、是否已触发。这样一套程序可以同时盯十几个品种。

让程序后台运行

Windows上可以用pythonw.exe运行脚本,没有控制台窗口。Linux或Mac用nohup:


nohup python monitor.py &

想更稳定的话,用systemd或者supervisor管理进程。程序崩溃自动重启。

重要提醒

邮件提醒有延迟,QQ邮箱到手机通常3到10秒。期货夜盘波动快,这个延迟可能错过最佳点位。程序只适合辅助盯盘,不能完全代替手动交易。

akshare的数据来自公开接口,偶尔会不准。关键决策前最好用交易软件再确认一次价格。

代码里的阈值和品种要根据自己的交易计划调整。不要用固定的百分比,用技术位或者波动率来定。

监控程序跑起来之后,把日志打印到文件里,方便回头检查哪里出了问题。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/Python-gupiaojiage-824.html