急性胃炎相关

注册

 

发新话题 回复该主题

用Python做个盯盘机器人,股票价 [复制链接]

1#

前言

Python凭借其开发效率高和功能强大的特性,在众多编程语言中脱颖而出,成为大数据时代的分析利器。

据我多年的领悟,编程语言只是一种按照人的意图去实现特定功能的高效工具而已,程序化所实现的核心决策功能依然需要人工智慧来支撑,在量化投资交易领域,投资者所思考的交易逻辑是非常重要,正所谓重剑无锋,大巧不工(真正的剑技不是要依靠剑锋,而是个人的修行,投资也是如此,投资者的素养最为重要),因此应当把80%的时间与精力放到投资模型构建的思考上,20%的时间与精力放到编程实现上。

即将走上量化投资交易的你,工欲善其事,必先利其器,将Python作为量化投资交易的首选语言,无疑是最为明智的,余生很短,请跟我一起用python!

思路

在量化交易方面,通过计算机程序自动实现股票盯盘与找到买卖信号,应该是很多人都比较向往的吧。但九层之台,起于累土,千里之行,始于足下,只有打下坚实的基础,将各个知识点逐一突破后加以综合运用,才能构建自己完整的量化交易体系。

今天就从量化交易最基础的入门知识点讲起,通过Python程序,编写股票价格实时盯盘的机器人,当股价触发一定的涨幅条件时,自动发送电子邮件或短信通知到投资者,这一场景可运用于平时喜欢炒股,但是没有时间盯盘的股民朋友。

通过该文章的学习,读者可以掌握对证券(包括股票和基金)实时价格的获取、电子邮件发送、程序定时运行和程序打包成exe文件等知识点。

盯盘机器人的工作流程图及效果图

为便于让各位读者从全局观了解整个程序运行的逻辑,特将流程图绘制如下。

1.程序工作流程图

2.股价监控的效果

例如:年7月19日,所监控的目标股票三峡能源(证券交易代码:)因某时点的涨跌幅达到监控水平线,自动触发邮件提醒,通过邮件方式告知投资者当前价格,涨跌幅和盈亏情况等数据,效果如下图所示。

代码实现

1.需要安装的第三方库及简要介绍

这里首先为大家介绍一下,本文需要用到的若干Python库。

Tushare:一个免费、开源的python财经数据接口包,通过该库的get_realtime_quotes(code)的方法(code为目标证券的交易代码,包括股票和ETF基金的交易代码都可以),可以返回股票的当前报价和成交信息,返回值的数据类型为DataFrame,该DataFram包括name(证券名称),open(今日开盘价),pre_close(昨日收盘价),price(当前价格)...time(时间)等,根据本次需求,仅需要部分维度即可,其他的维度,读者可以自行通过print()打印方式查看所有的维度信息。pandas:数据分析的核心库,因为调用Tushare库的get_realtime_quotes(code)方法返回DataFrame数据类型,所以需要该库对返回数据进行操作。schedule:在证券交易中的制度中,有交易和休市时间,要实现程序的定时运行,该库必不可少,详见程序部分对该库用法的介绍。smtplib:该库主要实现电子邮件的发送。sys:在交易日的15:00以后已经闭市,为避免资源的浪费,此时可以调用sys.exit()方法实现程序的自动退出。pyinstaller:用该库可以将程序打包成可执行的exe格式文件,便于程序的运行。

以上所需的第三方库,可以使用pip指令完成安装即可。

2.程序代码实现

①编写获取当前证券价格信息的方法

defget_now_jiage(code)f=ts.get_realtime_quotes(code)[[name,price,pre_close,date,time]]returndf

其中参数code为目标股票的交易代码,例如股票名称为“三峡能源”的证券交易代码为“”。调用Tushare的get_realtime_quotes(‘’)方法,即可返回一个DataFrame类型的数据,根据功能需要,我们只需要获取name(股票名称)、price(当前价格)、pre_close(昨日收盘价)、date(价格对应的日期)和time(价格对应的时间)即可。

编写好该方法后,主需要传递目标股票的交易代码至get_now_jiage方法,即可获取需要的数据。

②编写判断是否在交易时间段内的方法

在每个交易日,股票交易的时间为09:30-11:30,13:00-15:00,早上9:30程序开始监控,可以通过schedule来实现(后面讲解),在11:30-13:00之间的午间休市时间内,为避免造成资源浪费,就不必调用Tushare接口的数据,该时间段我们可以称为暂停交易时间。判断是否在暂停交易时间段的方法编写如下:

defpd_ztjytime()判断是否是交易时间now_time=datetime.datetime.now().strftime(%Y-%m-%d%H:%M:%S)now_datetime=datetime.datetime.strptime(now_time,%Y-%m-%d%H:%M:%S)d1=datetime.datetime.strptime(datetime.datetime.now().strftime(%Y-%m-%d)+11:30:01,%Y-%m-%d%H:%M:%S)d2=datetime.datetime.strptime(datetime.datetime.now().strftime(%Y-%m-%d)+13:00:00,%Y-%m-%d%H:%M:%S)delta1=(now_datetime-d1).total_seconds()delta2=(d2-now_datetime).total_seconds()ifdelta10anddelta20在暂停交易的时间内returnTrue#在暂停的交易时间范围内,返回Trueelse:returnFalse#不在暂停的交易时间范围内,返回False

③编写监控股价的主体运行程序

该模块作为股价监控与计算涨跌幅,判断是否发送通知的核心程序,为了与早间9:30定时运行程序的模块相配合,故该模块写成独立的方法,完整程序如下:

defdo_programe(code):ifpd_ztjytime()==False判断是否在暂停交易的时间范围内info=get_now_jiage(code)#调用方法获取当前的DataFramenow_jiage=float(info[price][0])#获取现价name=info[name][0]#获取证券名称pre_close=float(info[pre_close][0])#获取昨日收盘价riqi=info[date][0]#获取现价对应的日期sj=info[time][0]#获取价格对应的时间now_zdie=round((now_jiage-pre_close)/pre_close*,2)#计算现在的涨跌幅all_zdie=round((now_jiage-cbj)/cbj*,2)#计算股票持有期间内总的涨跌幅,其中cbj为购买时候的成本价,需要约定全局变量now_shizhi=round(shuliang*now_jiage,2)#计算股票现在的市值,其中shuliang为购买股票的数量,需要约定为全局变量ykui=round(now_shizhi-cbj*shuliang,2)#计算股票现在总的盈亏if(abs(now_zdie)=3andabs(now_zdie)3.09)or(abs(now_zdie)=6andabs(now_zdie)6.05)or(abs(now_zdie)=9andabs(now_zdie)9.1)判断现在的涨跌幅是否在目标范围内email_

分享 转发
TOP
发新话题 回复该主题