请看下面的攻略。
使用Python写一个量化股票提醒系统
- 目的
- 准备工作
- 基本思路
- 代码实现
目的
本文的目的是介绍如何使用Python编写一个量化股票提醒系统,可以实现根据股票价格涨跌幅度提醒用户,以及灵活的设置提醒条件。
准备工作
在开始编写代码之前,需要完成以下准备工作:
- 安装Python环境,推荐使用Python 3.x版本。
- 安装tushare库,可使用pip命令进行安装,命令为
pip install tushare
。 - 注册一个tushare账号并获取api_token,在tushare官网注册即可。
基本思路
本提醒系统的基本思路如下:
- 使用tushare库获取股票实时行情数据。
- 对于每只股票,计算其当前价格相对于前一天收盘价涨跌的百分比。
- 如果当前价格上涨超过了用户设定的阈值,则发送提醒邮件给用户。
- 设定轮询时间,定时执行以上操作。
代码实现
下面是示例代码,其中包含了两个示例,一个是根据涨跌幅度提醒,另一个是根据股票代码提醒。
首先,需要导入tushare库和smtplib库,以及设置相关参数:
import tushare as ts
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from datetime import datetime, timedelta
# 设置tushare账号api_token
ts.set_token(api_token)
# 登录tushare接口
pro = ts.pro_api()
# 发送邮件的设置,这里以QQ邮箱为例
smtp_server = 'smtp.qq.com'
smtp_port = 465
mail_user = 'your@qq.com' # 发送邮件的邮箱地址
mail_pwd = 'yourpassword' # 发送邮件的邮箱密码或授权码
receivers = ['someone@qq.com'] # 接收邮件的邮箱地址,可设置多个
1. 根据涨跌幅度提醒
下面是代码,其中可自定义的参数为:
- codes:待查询的股票代码列表
- threshold:触发提醒的涨跌幅度阈值,例如0.03表示股票上涨3%或下跌3%时提醒用户
- interval:轮询时间间隔,单位为秒,默认为600秒(即10分钟)
- start_time:开始轮询的时间,格式为"hh:mm:ss",默认为下一个整10分钟时刻
def send_email(content):
# 发送邮件
message = MIMEMultipart()
message['Subject'] = '股票涨跌幅提醒'
message['From'] = mail_user
message['To'] = ','.join(receivers)
text = MIMEText(content)
message.attach(text)
smtpobj = smtplib.SMTP_SSL(smtp_server, smtp_port)
smtpobj.login(mail_user, mail_pwd)
smtpobj.sendmail(mail_user, receivers, message.as_string())
smtpobj.quit()
def main1(codes=['002594.SZ'], threshold=0.03, interval=600, start_time=None):
# 获取当前时间,并计算下一个整10分钟时刻
now = datetime.now()
if start_time is None:
start_time = datetime(now.year, now.month, now.day, now.hour, now.minute, 0) + timedelta(minutes=10)
else:
start_time = datetime(now.year, now.month, now.day, *map(int, start_time.split(':'))) + timedelta(days=(now.time() > datetime.strptime(start_time, '%H:%M:%S').time()))
print("提醒时间为:", start_time.strftime('%Y-%m-%d %H:%M:%S'))
# 开始轮询
while True:
# 计算当前时间距离开始时间的秒数
delta = (start_time - datetime.now()).total_seconds()
if delta > 0:
time.sleep(delta)
# 查询股票价格
df = pro.daily(ts_code=','.join(codes), start_date=datetime.now().strftime('%Y%m%d'), end_date=datetime.now().strftime('%Y%m%d'))
df = df.set_index('ts_code')
# 计算涨跌幅度
df['change_pct'] = (df['close'] - df['pre_close']) / df['pre_close']
# 过滤涨跌幅超过阈值的股票
alarms = df[abs(df['change_pct']) > threshold]
if not alarms.empty:
content = ""
for index, row in alarms.iterrows():
content += f"{index} 当前价格 {row['close']:.2f} 相对于前一个交易日收盘价 {row['pre_close']:.2f} 的涨跌幅为 {row['change_pct']:.2%}\n"
send_email(content)
# 等待下一次轮询
start_time += timedelta(seconds=interval)
运行示例:
if __name__ == '__main__':
main1()
2. 根据股票代码提醒
下面是代码,其中可自定义的参数为:
- codes:待查询的股票代码列表
- interval:轮询时间间隔,单位为秒,默认为600秒(即10分钟)
- start_time:开始轮询的时间,格式为"hh:mm:ss",默认为下一个整10分钟时刻
def main2(codes=['002594.SZ'], interval=600, start_time=None):
# 获取当前时间,并计算下一个整10分钟时刻
now = datetime.now()
if start_time is None:
start_time = datetime(now.year, now.month, now.day, now.hour, now.minute, 0) + timedelta(minutes=10)
else:
start_time = datetime(now.year, now.month, now.day, *map(int, start_time.split(':'))) + timedelta(days=(now.time() > datetime.strptime(start_time, '%H:%M:%S').time()))
print("提醒时间为:", start_time.strftime('%Y-%m-%d %H:%M:%S'))
# 开始轮询
while True:
# 计算当前时间距离开始时间的秒数
delta = (start_time - datetime.now()).total_seconds()
if delta > 0:
time.sleep(delta)
# 查询股票价格
df = pro.daily(ts_code=','.join(codes), start_date=datetime.now().strftime('%Y%m%d'), end_date=datetime.now().strftime('%Y%m%d'))
df = df.set_index('ts_code')
# 过滤股票价格低于10元的股票
alarms = df[df['close'] < 10.0]
if not alarms.empty:
content = ""
for index, row in alarms.iterrows():
content += f"{index} 当前价格为 {row['close']:.2f}\n"
send_email(content)
# 等待下一次轮询
start_time += timedelta(seconds=interval)
运行示例:
if __name__ == '__main__':
main2(codes=['600036.SH', '600519.SH'])
在以上示例代码中,使用了tushare库获取实时股票行情数据,通过计算涨跌幅度或价格,判断是否需要触发提醒,并通过smtplib库发送邮件提醒用户。用户可以自定义股票代码、提醒阈值、轮询时间等参数来达到自己的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python写一个量化股票提醒系统 - Python技术站