教你用Python做一個「盯盤機器人」,實時監控股票價格並通知你!

2022-01-07 CDA數據分析師

作者:做時間的朋友

來源:數據分析與統計學之美 

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:在證券交易中的制度中,有交易和休市時間,要實現程序的定時運行,該庫必不可少,詳見程序部分對該庫用法的介紹。sys:在交易日的15:00以後已經閉市,為避免資源的浪費,此時可以調用sys.exit()方法實現程序的自動退出。pyinstaller:用該庫可以將程序打包成可執行的exe格式文件,便於程序的運行。以上所需的第三方庫,可以使用pip指令完成安裝即可。2. 程序代碼實現① 編寫獲取當前證券價格信息的方法
def get_now_jiage(code):
   df = ts.get_realtime_quotes(code)[['name','price','pre_close','date','time']]
   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接口的數據,該時間段我們可以稱為暫停交易時間。判斷是否在暫停交易時間段的方法編寫如下:
def pd_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()
    if delta1>0 and delta2>0 : #在暫停交易的時間內
        return True  #在暫停的交易時間範圍內,返回 True
    else:
        return False #不在暫停的交易時間範圍內,返回 False

③ 編寫監控股價的主體運行程序該模塊作為股價監控與計算漲跌幅,判斷是否發送通知的核心程序,為了與早間9:30定時運行程序的模塊相配合,故該模塊寫成獨立的方法,完整程序如下:
def do_programe(code):
    if pd_ztjytime()==False: #判斷是否在暫停交易的時間範圍內
        info=get_now_jiage(code) #調用方法獲取當前的DataFrame
        now_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*100,2) #計算現在的漲跌幅
        all_zdie=round((now_jiage-cbj)/cbj*100,2)  #計算股票持有期間內總的漲跌幅,其中cbj為購買時候的成本價,需要約定全局變量
        now_shizhi=round(shuliang*now_jiage,2) #計算股票現在的市值,其中shuliang為購買股票的數量,需要約定為全局變量
        ykui=round(now_shizhi-cbj*shuliang,2)  #計算股票現在總的盈虧
        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) : #判斷現在的漲跌幅是否在目標範圍內
            email_comment = []
            email_comment.append('<html>')
            email_comment.append('<b><p><h3><font size="2" color="black">您好:</font></h4></p></b>')
            email_comment.append('<p><font size="2" color="#000000">根據設置參數,現將監控到'+name+'('+str(code)+')的證券價格異動消息匯報如下:</font></p>')
            email_comment.append('<table border="1px" cellspacing="0px"   width="600" bgcolor=' + color_bg_fg + ' style="border-collapse:collapse">')

            email_comment.append('<tr>')
            email_comment.append('<td align="center"><b>序號</b></td>')
            email_comment.append('<td align="center"><b>購買單價</b></td>')
            email_comment.append('<td align="center"><b>持股數</b></td>')
            email_comment.append('<td align="center"><b>現價</b></td>')
            email_comment.append('<td align="center"><b>現漲跌幅</b></td>')
            email_comment.append('<td align="center"><b>總漲跌幅</b></td>')
            email_comment.append('<td align="center"><b>現市值</b></td>')
            email_comment.append('<td align="center"><b>盈虧額</b></td>')
            email_comment.append('<td align="center"><b>異動時間</b></td>')
            email_comment.append('</tr>')

            email_comment.append('<tr>')
            email_comment.append('<td align="center">'+str(1)+'</td>')
            email_comment.append('<td align="center">'+str(cbj) + '</td>')
            email_comment.append('<td align="center">' + str(shuliang) + '</td>')
            email_comment.append('<td align="center">' + str(now_jiage) +'</td>')
            email_comment.append('<td align="center">' + str(now_zdie) + '%</td>')
            email_comment.append('<td align="center">' + str(all_zdie) + '%</td>')
            email_comment.append('<td align="center">' + str(now_shizhi) + '元</td>')
            email_comment.append('<td align="center">' + str(ykui) + '元</td>')
            email_comment.append('<td align="center">' + str(riqi) +' '+str(sj) +'</td>')
            email_comment.append('</tr>')
            email_comment.append('</table>')
            email_comment.append('<p><font size="2" color="black">祝:股市天天紅,日日發大財!</font></p>')
            email_comment.append('</html>')
            send_msg = '\n'.join(email_comment)
            send_Email(email_add[0], send_msg)

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%(不含)之間時,便通過發送電子郵件的形式發送通知,具體的漲跌幅觸發參數讀者可以自行修改。
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>。
def send_Email(Email_address, email_text):
    from_addr = '*****' #發出電子郵件的地址
    password = '*****'   #發出電子郵件的密碼
    title = '股票價格異動監控消息-' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  #電子郵件的標題
    msg = MIMEText(email_text, 'html', 'utf-8') #電子郵件的格式是HTML
    msg['From'] = from_addr
    msg['To'] = Email_address
    msg['Subject'] = title

    try:
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(from_addr, password)  # 發送郵件
        server.send_message(msg)
        server.quit()

        # print(Email_address+'  send success!')
        #send_info.append(Email_address + '  send success!\n')
    except Exception as e:
        a+1
        # print(e)
        #send_info.append(e + '\n')
        #send_info.append(Email_address + ' send failed!\n')
        # 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()方法入下所示:
def run():
    while True:
        do_programe('600905')
        now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        d1 = datetime.datetime.strptime(now_time, '%Y-%m-%d %H:%M:%S')
        d2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d')+' 15:00:00', '%Y-%m-%d %H:%M:%S')
        delta = d2 - d1
        if delta.total_seconds()<=0:
          sys.exit()
        time.sleep(1)

⑤ 編寫每天9點30分開始監控的主程序為了實現每個交易日交易時點開始監控,需要的程序如下所示:
if __name__ == '__main__':
    schedule.every().day.at("09:30").do(run)
    while True:
        schedule.run_pending()
        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,如果用爬蟲來實現,就不理想,因為調用太頻繁可能觸發網站的反爬蟲機制。六是該程序設置的是在本地計算機上自動開機運行,在程序不斷優化和增加功能後,感興趣的讀者可以了解購買雲伺服器部署監控程序。註:股市有風險,投資需謹慎。本文只進行技術探討,不提供任何投資建議。

 

超實用案例分享

解決99%業務問題的算法建模模板

9月2日晚 20:00點

掃描下方二維碼,

立即報名吧!

👇👇👇

 

 

相關焦點

  • 用Python做了一個 "盯盤機器人",股票價格實時監控,還能郵件通知你!
    即將走上量化投資交易的你,工欲善其事,必先利其器,將Python作為量化投資交易的首選語言,無疑是最為明智的,餘生很短,請跟我一起用python!思路 在量化交易方面,通過電腦程式自動實現股票盯盤與找到買賣信號,應該是很多人都比較嚮往的吧。但九層之臺,起於累土,千裡之行,始於足下,只有打下堅實的基礎,將各個知識點逐一突破後加以綜合運用,才能構建自己完整的量化交易體系。
  • 如何用 Python實時監控文件?
    在業務穩定性要求比較高的情況下,運維為能及時發現問題,有時需要對應用程式的日誌進行實時分析,當符合某個條件時就立刻報警,而不是被動等待出問題後去解決
  • 手把手教你搭建一個Python數據質量監控系統
    根據實際業務邏輯定義數據校準指標體系,搭建數據中心的質量監控面板及時發現數據異常,從而實現保證數據質量的目的。那如何實現一個數據質量監控工具?其實開發一個監控面板並不難,首先確定所關注的指標,定義量化,然後建立一個定時任務連接生產資料庫,通過業務功能處理函數將計算指標返回匯總,最後將結果映射到模板網頁上展示。
  • 一文教你如何用Python預測股票價格
    當然,當我一開始使用加性模型(additive model)來做時間序列預測時,我不得不先用模擬盤來驗證我的模型在股票市場上的表現。   一眾挑戰者們都希望在每日收益率上能夠跑贏市場,但是大多數都失敗了,我也未能倖免。不過,在這個過程中也學到了大量Python相關知識,包括面向對象編程、數據處理、建模、以及可視化等等。
  • 【Python量化】手把手教你用python做股票分析入門
    由於pandas庫不再支持yahoo資料庫後變得很不好用,而baostock最早記錄的數據是2006年,因此本文主要講講如何使用tushare獲取股票交易數據和可視化分析,tushare基本上記錄了股票自上市之日起所有的日交易數據,是目前分析國內A股(支持其他非股票行情數據,如期貨)比較好用的開源接口。
  • 如何用Python實現一個你問我答的翻譯機器人?
    from=zh&to=en&appid=20181023000223357&salt='+ str(salt) + '&q=' + urlq + '&sign=' + sign最後要做的就是使用python的網絡請求啦,和爬蟲一樣的方法。
  • 手把手教你用Python抓取AWS的日誌(CloudTrail)數據
    數據時代,利用數據做決策是大數據的核心價值。 本文手把手,教你使用python進行AWS的CloudTrail配置,進行日誌抓取。進行數據分析,發現數據價值!  如今是雲的時代,許多公司都把自己的IT架構部署在基礎架構雲(IaaS)上。著名的IaaS提供商有亞馬遜,微軟(Azure),IBM等,國內也有諸如阿里雲等。
  • 6種Python實現【實時】顯示進度條!
    庫的時候可以看到下載的進度,此外在下載文件時也可以看到類似的進度條,比如下圖這種:應用場景:下載文件、任務計時等今天辰哥就給大家分享Python的6種不同的實現實時顯示處理進度的方式,文中每一種方式都附帶一個案例,並提供官方文檔,供大家學習,自定義去修改。
  • 使用Python輕鬆獲取股票&基金數據
    我身邊有不少人,靠股票、基金賺了一波,這得益於大行情,當然也有人虧了錢。普通人炒股,其實大概率是虧的,一是因為貪婪、二是因為業餘,貪婪不一定壞事,業餘才真的要命,因為你永遠賺不到認知之外的錢。這次我們來研究下如何用Python獲取股票&基金數據,用作行業分析。
  • 學會用Python結合人工智慧嘗試預測股票,下一個股神就是你!
    用Python結合人工智慧嘗試預測股票,會成就下一個股神?預備條件:假設您熟悉python,並且已經在系統中安裝了python 3。本教程中使用了jupyter筆記本。使用的數據集:本教程中使用的數據集是基於Tushare獲取的股票信息。更多股票代碼可以用下面的搜索工具獲取。至於Tushare的使用,可以參考以前的python神級技巧,不要爬蟲一分鐘獲取股票基金持股情況文章學習。
  • Python搭建一個系統信息實時監控數據可視化大屏
    搭建伺服器應用的監控系統面板,主要流程如下:1、資料庫中創建數據表2、建立資料庫連接實時數據插入數據表,實時查詢更新面板數據準備3、監控中心大屏製作具體步驟:這裡為了方便將系統信息監控的CPU信息、內存信息、磁碟信息放在一張表中。
  • 埃斯頓機器人云監控與運維系統 ESTUN ECloud
    ·邊緣計算網關通過加密傳輸的方式將機器人數據安全地連接到網際網路,授權用戶可在任何地點、任何時間通過手機App實時監測機器人的運行狀態和報警故障信息。   基於這樣的邏輯,我們認為埃斯頓必然不會僅僅滿足於當前的設備遠程監控、故障和警報的實時分析和通知、遠程故障診斷和程序升級、以及設備維保管理等功能。
  • 從完全零基礎開始教你寫一個Python機器人!每天唯一秒回你的人!
    在本文中,我們將在python中基於NLTK庫構建一個簡單的基於檢索的聊天機器人。例如,如果我們要提取下列詞:「Stems」, 「Stemming」, 「Stemmed」, 「and Stemtization」,結果將是一個詞「stem」。詞形還原:詞幹提取的一個細微變體是詞形還原 。它們之間的主要區別在於,詞幹提取可以創建不存在的詞,而詞元是實際的詞。所以你的詞根,也就是你最終得到的詞,在字典裡通常是查不到的,但詞元你是可以查到的。
  • 比特大咖直播:江鳥老師教你解讀K線語言,帶你領略量化投資的神奇魅力
    江鳥:量化交易一般指用數學模型或者策略來替代人為的主觀判斷,通過用計算機處理實時數據,發現數據滿足模型或者策略時就自動下單的交易。不知道是不是足夠準確。現在還有一些團隊在做面向普通人使用的量化交易平臺,登錄之後,設置自己的策略就可以了,但很成熟易用的產品還沒有看到,這樣的產品未來會越來越多。問:作為一個普通的投資者,他不太懂計算機,能使用量化交易嗎?
  • 【課程】人工智慧+股票投資,手把手教你
    AI工程師們用獎勵和懲罰來引導人工智慧,就像訓練白老鼠來獲取食物一樣。從技術角度來說,他們會用到深度學習和強化學習。
  • 用Python幫你脫單,24小時關注女朋友的情緒變化
    用Python幫你脫單,24小時關注女朋友的情緒變化 程式設計師找個對象不容易啊,好不容易有了女朋友,可以有的時候太忙,經常加班,於是暗自下決心,下次一定要準時發消息給她,哪怕是幾句話,想來想去不如用Python做一個守護機器人 作者:一碼到底來源
  • 股票復盤是指什麼意思?股票復盤怎麼操作
    股票復盤是指什麼意思?  復盤就是利用靜態行情再看一邊市場全貌,這針對你白天動態盯盤來不及觀察、來不及總結等等情況,在收盤後或者定時你又進行一次翻閱各個環節,進一步明確一下,目標期後,那些股在資金流進活躍
  • 同花順股票交易手續費電腦版下載
    】公眾號,立即免費學習理財,基金,投資,股票(若資源失效,我們會儘快更新)同花順炒股是一款手機在線股票,這款同花順股票是市場上行情交易最快、數據最全、支持券商最多、領先支持滬港通,最受股民歡迎的完全免費的炒股(金融/投資/理財/證券)。同花順(300033)手機炒股 股票是市場上行情交易最快、數據最全、支持券商最多、領先支持滬港通,最受股民歡迎的完全免費的炒股(金融/投資/理財/證券)。
  • 「零基礎包學會」 手把手教你學python一:如何快速找到學習資源?
    基於以上的原因,本公眾號將開始轉載以及原創手把手教你學python系列,一開始的文章可能會有些無趣,學習一些基本知識,越到後面越深入,一步步的學會新時代利器!!轉發到群聊或者朋友圈即可獲得精選課件+培訓教程,不用998,只要動動手指關注轉發,關注與爾巖說,明天錢隨便花!!
  • 盯盤:25股均線盤中出現黃金交叉
    截至今日15:00,已有69隻股票突破半年線之上。【14:32 盯盤:江西銅業均線盤中黃金交叉】14:00至14:30 5日均線上穿10日均線形成黃金交叉的股票有:江西銅業(600362)。  截至今日14:30,已有35隻股票5日均線上穿10日均線形成黃金交叉。