股票提醒系统

前言

前几天读到一篇微信公众号的文章熬了一晚上,小白用Python写了一个股票提醒系统,看了评论之后感觉意犹未尽,随心血来潮写下这篇文章,以纪念此刻的心情。

架构篇

基本上按照作者的思路可以顺利的完成整个股票提醒系统,本文在原作者的基础上增加了如下内容:

  1. 查询多支股票实时价格信息
  2. 增加微信信息通知、提醒以及告警
  3. 通过微信更新所选股票的买入下限阈值和卖出上限阈值

实现篇

实时获取股票价格

这部分内容与作者的基本一致,没啥好说的。

邮件系统

这部分内容,我按照我之前写过的脚本运行,其代码如下:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
'''
@author: Haffner2010
@contact: myprojtest@example.com
@Software: Pycharm + Python3.6
@OS:Windows 7 64 bit
@Site:https://www.jianshu.com/u/e031670b216b
@file: EmailAutoSend.py
@time: 2018/4/1 20:03
@desc:
'''

#MIME邮件格式分析及信息提取http://www.pythonclub.org/python-files/mime-type
# SMTP模块
import smtplib
from email.mime.text import MIMEText
from email.header import Header


def MySMTP(UserInfo,Message):
    SmtpServer=UserInfo['server']
    user=UserInfo['username']
    port=UserInfo['port']
    Receiver=UserInfo['receiver']
    # print(type(str(Receiver)))
    sender=user # 发件人和登录账户名是同一个地址
    password=UserInfo['password']
    Message['From'] = sender
    Message['To'] = Receiver
    # Message['To'] = ";".join(Receiver)
    # Message['Subject'] = Header(Subject, 'utf-8')
    if port==25:
        smtp=smtplib.SMTP(SmtpServer,port)
    elif(port==465 or port==994):
        smtp = smtplib.SMTP_SSL(SmtpServer, port)  # 使用SSL加密登录,详见http://help.163.com/09/1223/14/5R7P3QI100753VB8.html
    else:
        print('SMTP协议端口号有误,请核对信息!')
    smtp.helo(SmtpServer)
    smtp.ehlo(SmtpServer)
    # smtp.starttls() # 启动安全传输模式
    smtp.login(user, password)
    smtp.sendmail(sender, Receiver, Message.as_string())
    print('Mail sent successfully!')
    smtp.quit()




# 一些基本账户信息的定义
myaccinfo={
    'username':'your_account@example.com', # 登录账户
    'password' : 'Auth Code', # 此为授权码,非登录密码
    'receiver':'your_account@example.com',
    'server' : 'smtp.example.com', # 邮箱服务器地址
    'port':25 # 登录端口号
}




if __name__=="__main__":
    # 邮件信息
    subject = 'subject'
    # 纯文本邮件定义,邮件正文内容
    msg = MIMEText('main body text', 'plain', 'utf-8')
    # 定义发送人,接收人,以及描述信息(主题)
    msg['Subject'] = Header(subject, 'utf-8')
    MySMTP(myaccinfo,msg)

其中,基本账户信息中需要修改为自己邮箱的用户名和密码,以及邮箱登陆可以通过POP3、SMTP和IMAP来查看相关服务,并按照要求修改如下信息:

# 一些基本账户信息的定义
myaccinfo={
    'username':'your_account@example.com', # 登录账户
    'password' : 'Auth Code', # 此为授权码,非登录密码
    'receiver':'your_account@example.com',
    'server' : 'smtp.example.com', # 邮箱服务器地址
    'port':25 # 登录端口号
}

邮件自动发送的代码,可以参考廖大的文章SMTP发送邮件加以了解。
邮件自动发送的源码已上传到我的GitHub上AutoEmailSend.py
关于邮件发送,最近看到一个不错的项目zmail,但我没用过,只是看介绍好像不错的样子。。

预警系统

预警系统,首先就要设置好预警值,我们以五大行为例,进行相关设置:

stock_code=['601288','601328','601988','601398','601939']
stock=Stock(q,stock_code)
setting={
    '农业银行':[3.45,3.5],
    '交通银行':[5.4,5.7],
    '中国银行':[3.4,3.5],
    '工商银行':[5.3,5.4],
    '建设银行':[6.5,6.9]
} # 设置股票的期望买入下线和卖出上限

stock_code为五大行的股票代码,setting字典为我们期望买入以及卖出的价格区间。

死循环监控数据

在部分代码在原作者的基础上进行修改,代码如下:

while True:
    
    now_dt = datetime.datetime.now() # 当前股价查询时间
    if not start_dt < now_dt < stop_dt:
        title = f'Current Time {now_dt} is not between {start_dt} and {stop_dt},we will stop!'
        print(title)
        bot.file_helper.send(title)
        # 邮件信息
        subject = 'Stop Running!'
        # 纯文本邮件定义,邮件正文内容
        msg = MIMEText(title, 'plain', 'utf-8')
        # 定义发送人,接收人,以及描述信息(主题)
        msg['Subject'] = Header(subject, 'utf-8')
        MySMTP(myaccinfo, msg)
        stock.stop_run() # 不在开市范围内,停止执行
        break

    if not q.empty():
        cur_price_dict = q.get()
        print(cur_price_dict)
        print(f'Current stock price:{cur_price_dict}')        
        for item in cur_price_dict:
            cur_price = float(cur_price_dict[item])
            if cur_price > setting[item][1]:
                title = f'股票[{item}]:当前价格{cur_price},高于max:{setting[item][1]}'
                print(title)
                bot.file_helper.send(title)
                # 邮件信息
                subject = '高阈值警告!'
                # 纯文本邮件定义,邮件正文内容
                msg = MIMEText(title, 'plain', 'utf-8')
                # 定义发送人,接收人,以及描述信息(主题)
                msg['Subject'] = Header(subject, 'utf-8')
                MySMTP(myaccinfo, msg)
                time.sleep(3)


            if cur_price < setting[item][0]:
                title = f'股票[{item}]:当前价格{cur_price},低于min:{setting[item][0]}'
                print(title)
                bot.file_helper.send(title)
                # 邮件信息
                subject = '低阈值警告!'
                # 纯文本邮件定义,邮件正文内容
                msg = MIMEText(title, 'plain', 'utf-8')
                # 定义发送人,接收人,以及描述信息(主题)
                msg['Subject'] = Header(subject, 'utf-8')
                MySMTP(myaccinfo, msg)
                time.sleep(3)

第一个if not语句表示如果不在开市时间范围内则停止运行,退出程序。
第二个if not语句中的for循环用来实时查询当前价格与买入价和卖出价的关系,高于卖出价或者低于买入价都通过邮件以及微信文件传输助手进行提醒。

setting区间阈值更新

本部分在原作者的基础上进行增加,用了wxpy提供的API,方便实时修改setting

# 消息接收监听器,通过接收文件传输助手的信息获取个人最新配置
@bot.register(chats=file_helper, except_self=False)
def print_others(message):
    # 输出监听到的消息
    print(message) # 此处的消息每次只能修改一只股票信息,对于实际应用来说已经足够
    msg_price = re.search('(.*?) : (.*?) \(Text\)', str(message)).group(2)
    print(msg_price)
    try:  # 格式code:high_pri,low_pri
        code, low_pri, high_pri = re.split('[:, ]', msg_price)
        print(code, low_pri, high_pri)
        name = ts.get_realtime_quotes(code)[['name']].values[0][0]
        setting.update({name:[float(low_pri),float(high_pri)]})
        print(setting)
    except:
        print('nothing')
    # return msg_price # 本来想通过return给外部函数接收以便修改setting的数据的,结果不知道如何使用,只能在register里面处理setting

关于return的内容如果有哪位大神知道还请告知,多谢!
整个股票提醒系统的源码见share.py

看看效果

刚开始设置了三家银行的高阈值低于当前价,微信端收到如下告警信息:


image.png

接下来提高农行的高阈值告警值,新的微信告警信息如下:


image.png

后记

大多数内容均来源于网络,如果构成侵权请联系删除。如果有什么不懂的可以一起交流,我也是初学者哈~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容