成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Python做 "盯盤機器人",股票價格實時監控并郵件通知你!

開發 后端
Python憑借其開發效率高和功能強大的特性,在眾多編程語言中脫穎而出,成為大數據時代的分析利器。

前言

Python憑借其開發效率高和功能強大的特性,在眾多編程語言中脫穎而出,成為大數據時代的分析利器。

據我多年的領悟,編程語言只是一種按照人的意圖去實現特定功能的高效工具而已,程序化所實現的核心決策功能依然需要人工智慧來支撐,在量化投資交易領域,投資者所思考的交易邏輯是非常重要,正所謂重劍無鋒,大巧不工(真正的劍技不是要依靠劍鋒,而是個人的修行,投資也是如此,投資者的素養最為重要),因此應當把80%的時間與精力放到投資模型構建的思考上,20%的時間與精力放到編程實現上。

即將走上量化投資交易的你,工欲善其事,必先利其器,將Python作為量化投資交易的首選語言,無疑是最為明智的,余生很短,請跟我一起用python!

思路

在量化交易方面,通過計算機程序自動實現股票盯盤與找到買賣信號,應該是很多人都比較向往的吧。但九層之臺,起于累土,千里之行,始于足下,只有打下堅實的基礎,將各個知識點逐一突破后加以綜合運用,才能構建自己完整的量化交易體系。

今天就從量化交易最基礎的入門知識點講起,通過Python程序,編寫股票價格實時盯盤的機器人,當股價觸發一定的漲幅條件時,自動發送電子郵件或短信通知到投資者,這一場景可運用于平時喜歡炒股,但是沒有時間盯盤的股民朋友。

通過該文章的學習,讀者可以掌握對證券(包括股票和基金)實時價格的獲取、電子郵件發送、程序定時運行和程序打包成exe文件等知識點。

盯盤機器人的工作流程圖及效果圖

為便于讓各位讀者從全局觀了解整個程序運行的邏輯,特將流程圖繪制如下:

1. 程序工作流程圖

2. 股價監控的效果

例如: 2021年7月19日,所監控的目標股票三峽能源(證券交易代碼:600905)因某時點的漲跌幅達到監控水平線,自動觸發郵件提醒,通過郵件方式告知投資者當前價格,漲跌幅和盈虧情況等數據,效果如下圖所示。

代碼實現

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. 程序代碼實現

① 編寫獲取當前證券價格信息的方法 

  1. def get_now_jiage(code):  
  2.    df = ts.get_realtime_quotes(code)[['name','price','pre_close','date','time']]  
  3.    return df 

其中參數code為目標股票的交易代碼,例如股票名稱為“三峽能源”的證券交易代碼為“600905”。調用Tushare的get_realtime_quotes(‘600905’)方法,即可返回一個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接口的數據,該時間段我們可以稱為暫停交易時間。判斷是否在暫停交易時間段的方法編寫如下: 

  1. def pd_ztjytime():#判斷是否是交易時間  
  2.     now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  
  3.     now_datetime = datetime.datetime.strptime(now_time, '%Y-%m-%d %H:%M:%S')  
  4.     d1 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d') + ' 11:30:01', '%Y-%m-%d %H:%M:%S')  
  5.     d2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d') + ' 13:00:00', '%Y-%m-%d %H:%M:%S')  
  6.     delta1 = (now_datetime - d1).total_seconds()  
  7.     delta2 = (d2-now_datetime).total_seconds()  
  8.     if delta1>0 and delta2>0 : #在暫停交易的時間內  
  9.         return True  #在暫停的交易時間范圍內,返回 True  
  10.     else:  
  11.         return False #不在暫停的交易時間范圍內,返回 False 

③ 編寫監控股價的主體運行程序

該模塊作為股價監控與計算漲跌幅,判斷是否發送通知的核心程序,為了與早間9:30定時運行程序的模塊相配合,故該模塊寫成獨立的方法,完整程序如下: 

  1. def do_programe(code):  
  2.     if pd_ztjytime()==False: #判斷是否在暫停交易的時間范圍內  
  3.         info=get_now_jiage(code) #調用方法獲取當前的DataFrame  
  4.         now_jiage=float(info['price'][0]) #獲取現價  
  5.         name=info['name'][0] #獲取證券名稱  
  6.         pre_close=float(info['pre_close'][0]) #獲取昨日收盤價  
  7.         riqi=info['date'][0] #獲取現價對應的日期  
  8.         sj=info['time'][0] #獲取價格對應的時間 
  9.         now_zdie=round((now_jiage-pre_close)/pre_close*100,2) #計算現在的漲跌幅  
  10.         all_zdie=round((now_jiage-cbj)/cbj*100,2)  #計算股票持有期間內總的漲跌幅,其中cbj為購買時候的成本價,需要約定全局變量  
  11.         now_shizhi=round(shuliang*now_jiage,2) #計算股票現在的市值,其中shuliang為購買股票的數量,需要約定為全局變量  
  12.         ykui=round(now_shizhi-cbj*shuliang,2)  #計算股票現在總的盈虧  
  13.         if (abs(now_zdie)>=3 and abs(now_zdie)<3.09) or (abs(now_zdie)>=6  and abs(now_zdie)<6.05)  or (abs(now_zdie)>=9 and  abs(now_zdie)<9.1) : #判斷現在的漲跌幅是否在目標范圍內 
  14.             email_comment = []  
  15.             email_comment.append('<html>')  
  16.             email_comment.append('<b><p><h3><font size="2" color="black">您好:</font></h4></p></b>')  
  17.             email_comment.append('<p><font size="2" color="#000000">根據設置參數,現將監控到'+name+'('+str(code)+')的證券價格異動消息匯報如下:</font></p>')  
  18.             email_comment.append('<table border="1px" cellspacing="0px"   width="600" bgcolor=' + color_bg_fg + ' style="border-collapse:collapse">')  
  19.             email_comment.append('<tr>')  
  20.             email_comment.append('<td align="center"><b>序號</b></td>')  
  21.             email_comment.append('<td align="center"><b>購買單價</b></td>')  
  22.             email_comment.append('<td align="center"><b>持股數</b></td>')  
  23.             email_comment.append('<td align="center"><b>現價</b></td>')  
  24.             email_comment.append('<td align="center"><b>現漲跌幅</b></td>')  
  25.             email_comment.append('<td align="center"><b>總漲跌幅</b></td>')  
  26.             email_comment.append('<td align="center"><b>現市值</b></td>')  
  27.             email_comment.append('<td align="center"><b>盈虧額</b></td>')  
  28.             email_comment.append('<td align="center"><b>異動時間</b></td>')  
  29.             email_comment.append('</tr>')  
  30.             email_comment.append('<tr>')  
  31.             email_comment.append('<td align="center">'+str(1)+'</td>')  
  32.             email_comment.append('<td align="center">'+str(cbj) + '</td>')  
  33.             email_comment.append('<td align="center">' + str(shuliang) + '</td>')  
  34.             email_comment.append('<td align="center">' + str(now_jiage) +'</td>') 
  35.             email_comment.append('<td align="center">' + str(now_zdie) + '%</td>')  
  36.             email_comment.append('<td align="center">' + str(all_zdie) + '%</td>')  
  37.             email_comment.append('<td align="center">' + str(now_shizhi) + '元</td>')  
  38.             email_comment.append('<td align="center">' + str(ykui) + '元</td>')  
  39.             email_comment.append('<td align="center">' + str(riqi) +' '+str(sj) +'</td>')  
  40.             email_comment.append('</tr>')  
  41.             email_comment.append('</table>')  
  42.             email_comment.append('<p><font size="2" color="black">祝:股市天天紅,日日發大財!</font></p>')  
  43.             email_comment.append('</html>')  
  44.             send_msg = '\n'.join(email_comment)  
  45.             send_Email(email_add[0], send_msg) 

在上述程序中,判斷是否發送通知的判斷語句為: 

  1. if (abs(now_zdie)>=3 and abs(now_zdie)<3.1) or (abs(now_zdie)>=6  and abs(now_zdie)<6.1)  or (abs(now_zdie)>=9 and  abs(now_zdie)<9.1)  

上述if判斷語句表示現在漲跌幅的絕對值在3%(含)至3.1%(不含)(使用絕對值可以同時兼顧漲和跌的幅度),或6%(含)至6.1%(不含),或9%(含)至9.1%(不含)之間時,便通過發送電子郵件的形式發送通知,具體的漲跌幅觸發參數讀者可以自行修改。

電子郵件發送的關鍵程序為:

  1. send_Email(email_add[0], send_msg) 

其中,email_add為列表形式,可以存放多個接收通知的電子郵件地址,此例中僅設置一個接收地址,全局變量email_add=['......'],故獲取該地址的程序為email_add[0]。send_msg即為要發送的郵件內容,郵件內容使用列表email_comment進行添加,這里發送的郵件格式為html格式,使用html格式是為了方便繪制表格。html文件的開頭應當是,而結尾則是與之配對的,其中繪制表格的標簽是<table>及配對的</table>,表格行的標簽是<tr>,而列的標簽則是<td>。

發送電子郵件send_Email方法的程序如下: 

  1. def send_Email(Email_address, email_text):  
  2.     from_addr = '*****' #發出電子郵件的地址  
  3.     password = '*****'   #發出電子郵件的密碼  
  4.     title = '股票價格異動監控消息-' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  #電子郵件的標題  
  5.     msg = MIMEText(email_text, 'html', 'utf-8') #電子郵件的格式是HTML  
  6.     msg['From'] = from_addr  
  7.     msg['To'] = Email_address  
  8.     msg['Subject'] = title  
  9.     try: 
  10.         server = smtplib.SMTP_SSL('smtp.qq.com', 465)  
  11.         server.login(from_addr, password)  # 發送郵件  
  12.         server.send_message(msg) 
  13.         server.quit()  
  14.         # print(Email_address+'  send success!')  
  15.         #send_info.append(Email_address + '  send success!\n')  
  16.     except Exception as e: 
  17.         a+1  
  18.         # print(e)  
  19.         #send_info.append(e + '\n')  
  20.         #send_info.append(Email_address + ' send failed!\n')  
  21.         # print(Email_address+' send failed!') 

from_addr為發件人的郵箱地址,而password則是發件人的授權碼,這里需要根據實際情況進行修改和填寫。

另外,程序中的:

server = smtplib.SMTP_SSL('smtp.qq.com', 465)

是選擇QQ郵箱的SMTP服務器地址smtp.qq.com,默認端口為465,如果是其他郵箱,則應該進行相應的服務器和端口號進行修改。

如何獲取發件人的授權碼呢?以QQ郵箱為例說明:

第一步:登錄QQ郵箱,單擊頂部的“設置”鏈接,然后單擊“賬戶”標簽,如下圖所示。

第二步:在“賬戶”選項卡中向下滾動,直到看到如下圖所示的選項,單擊“POP3/SMTP服務”右側的“開啟”鏈接,如下圖所示。

第三步:單擊“開啟”鏈接后,會有一個驗證密保的過程。按照頁面中的說明,向指定號碼發送指定內容的手機短信,發送完畢后單擊頁面中的“我已發送”按鈕,會彈出一個框,里面就包含SMTP授權碼,把它復制并存儲起來,方便以后調用。

④ 編寫調用do_programe(code)的監控程序

為了實現主體程序的調用,編寫run()方法如下所示: 

  1. def run():  
  2.     while True:  
  3.         do_programe('600905')  
  4.         now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  
  5.         d1 = datetime.datetime.strptime(now_time, '%Y-%m-%d %H:%M:%S')  
  6.         d2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d')+' 15:00:00', '%Y-%m-%d %H:%M:%S')  
  7.         delta = d2 - d1  
  8.         if delta.total_seconds()<=0:  
  9.           sys.exit()  
  10.         time.sleep(1) 

⑤ 編寫每天9點30分開始監控的主程序

為了實現每個交易日交易時點開始監控,需要的程序如下所示: 

  1. if __name__ == '__main__':  
  2.     schedule.every().day.at("09:30").do(run)  
  3.     while True:  
  4.         schedule.run_pending()  
  5.         time.sleep(1) 

⑥ 程序打包與自動運行

當編寫完程序以后,就需要通過打包的形式把程序轉化為exe格式,該格式下的程序可以點擊或者設置自動運行,打包的庫是pyinstaller ,使用命令pyinstaller -w -F程序路徑\程序名.py 即可。其中-w表示生成的exe文件運行時不出現黑色的DOS界面,我們只需要該程序 “悄悄” 在后臺運行即可。

為了實現程序在電腦開機的時候自動運行,可以將生成的exe文件復制到windwos系統的Startup文件夾下,點擊windows的開始菜單-所有程序,找到“啟動”或者“Startup”的文件夾,將exe文件復制到該文件夾內,每次開機,電腦就可以自動運行該監控程序。

因為程序運行不出現任何界面,為了查看程序是否在運行,可以用快捷鍵“Ctrl Alt Delete”的快捷鍵打開任務管理器,在進程里面可以查看到“股票監控.exe”(這里的文件名是作者改的文件名)的文件,表明程序在監控中。

展望

該程序只是設置了一只股票來作為簡單功能實現的案例,仍然有一定的改進空間,說明如下:

一是在實踐中,往往都是構建一個股票池(數只股票)來動態監測股價和自動判斷交易時點(比如MACD,均線,KDJ指標等),往往需要結合數據庫技術,才能便于靈活構造股票池。

二是對于發送短信的功能,本文中并未做介紹,僅介紹了電子郵件,其實短信通知的思路和郵件的思路一致。如果要實現免費發短信功能,讀者可以在twilio 網站上(https://www.twilio.com)上注冊和調用相應功能即可,讀者可以再網上搜索。

三是關于Tushare數據接口,本文中用的是Tushare老的接口API,目前官方主要維護的是Tushare Pro接口,相應的調用功能要達到一定的積分才可以,但是相比其他收費接口,Tushare是屬于業界的良心之作,關于Tushare Pro,參考的網址詳見https://waditu.com/document/2

四是其他商業的量化接口,可以推薦聚寬量化接口,大約有半年左右的免費試用期,但是免費過后,每個月還是有幾千元的收費,讀者可選擇使用聚寬網址https://www.joinquant.com/view/community/list?listType=1

五是關于爬蟲獲取證券交易數據,現在證券交易數據比較豐富的網站有東方財富、同花順、新浪財經以及和訊網等。通過爬蟲也可以獲取相應的數據,但是應當注意的是,像本文中每個交易日每秒鐘調用一次API,如果用爬蟲來實現,就不理想,因為調用太頻繁可能觸發網站的反爬蟲機制。

六是該程序設置的是在本地計算機上自動開機運行,在程序不斷優化和增加功能后,感興趣的讀者可以了解購買云服務器部署監控程序。 

責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2021-08-06 09:35:37

Python盯盤機器人編程語言

2023-12-06 15:10:11

2020-08-06 16:37:25

機器學習技術股票

2015-11-25 14:03:29

LinuxMop股票

2019-04-26 13:26:00

預測股票深度學習股票

2024-09-30 05:43:44

2021-10-31 15:51:30

機器人人工智能監控

2021-04-27 08:16:48

勒索軟件攻擊贖金

2022-01-24 11:16:13

PHP服務器惡意

2020-10-15 15:42:00

人工智能

2021-09-03 16:12:52

機器人人工智能編程

2020-08-24 09:08:17

機器人自主研發技術

2020-03-20 10:10:21

機器人人工智能系統

2018-04-16 12:14:34

數據科學機器學習神經網絡

2019-04-19 16:30:30

Python機器人代碼

2021-07-22 10:17:55

加密機器人加密貨幣機器人

2021-06-10 09:00:32

Java項目實戰Java編程

2021-08-19 15:44:20

機器人人工智能機器學習

2015-07-28 09:36:11

機器人

2017-08-22 17:30:14

Python爬蟲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品毛片一区二区在线看 | 亚洲色欲色欲www | 精品亚洲二区 | 一区二区中文字幕 | 高清黄色网址 | 91久久精品| 日韩精品在线免费观看 | 在线国产小视频 | 国产一区二区在线免费观看 | 日韩欧美视频网站 | 欧美亚洲另类丝袜综合网动图 | 日韩精品一区二区三区中文在线 | 色嗨嗨 | 日本成人福利 | 99这里只有精品视频 | 国产伦精品一区二区三区在线 | 96av麻豆蜜桃一区二区 | 国产精品一区在线 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 99reav| 天天人人精品 | 久草成人 | 中文字幕亚洲精品 | 亚洲精品二区 | 美国av毛片| 国产精品三级 | 国产亚洲一区二区三区在线观看 | 久久久久一区 | 99pao成人国产永久免费视频 | 国产日韩一区二区三免费高清 | 日日摸天天添天天添破 | 久久久爽爽爽美女图片 | 久草视| 久久国产精品无码网站 | 日韩一级精品视频在线观看 | hsck成人网 | 国产亚洲一区二区三区 | 亚洲人成免费 | 人妖一区| 美人の美乳で授乳プレイ | 久久九精品 |