碼農技術炒股之路——架構和設計


        首先說明一下,我並沒打算把這個項目設計的多么高大上。一個最簡單的理由就是我沒有那么多資源。比如做架構設計,要考慮計算機性能、數據庫主從備份、服務多點部署和一些容災問題,而這些都需要機器。但是我只有一台機器,所以也只能盡可能將這台機器的性能榨干,而主從、多點部署都問題就不能涉及了。(轉載請指明出於breaksoftware的csdn博客)

架構

        為了比較貼近生產環境,我將架構設計如下圖


        鑒於實際情況,我並沒有在數據庫上做主從同步,因為在一台機器做主從意義不大。同時上圖中所有服務都部署在一台4核、2.8G主頻,8G內存,128G磁盤的機器上。

        實時抓取服務會在每個交易日的開始和結束時間之間定時抓取數據,保存到實時數據庫中。同時它也會把信息同步給實時計算服務。我統計過,一天的數據量不足500M,所以實時計算服務可以讓信息常駐內存,有利於其運行效率提升。如果實時計算服務崩潰,則它可以從實時數據庫中加載當天的數據恢復運行。

        在交易時間,更快地抓取數據,實時抓取服務和實時數據庫操作會占滿機器的CPU資源。過了交易時間后,則會通過離線計算服務,把實時數據庫中的數據經過計算保存到歷史數據庫中。

設計

數據庫結構的設計

        有人可能會問,為什么要區分實時數據庫和歷史數據庫?要回答這個問題,我需要先介紹下我得設計思路和遇到的問題。

        首先,我希望在有限的資源內,實時數據獲取的頻度高、間隔短。這樣可以保證我們數據的時效性。每次拉取時,我都是獲得盡可能多的數據,然后經過簡單的數據分拆,通過批量insert的方式保存到數據庫中。這樣的流程可以減少和數據源的交互時間、也大大減少數據庫的操作時間。

        由於實時數據庫中同類型數據都保存在一張表中,也就是說所有股票的同類型數據都在一張表中,這種設計就是為了高效記錄實時數據。而在對歷史數據的分析時,這樣的設計明顯不合適。於是我讓每支股票的信息保存在一張表中。在交易時間之后,機器處於空閑狀態時,離線計算服務會把實時數據插入到其對應的表中。這樣既可以讓數據獲取比較高效,也讓數據安全性得以提升。


        目前我的設計中,一支股票有四張表保存不同的信息,分別是:歷史真實數據、除權后數據、主力行為數據和交易詳情數據。以A股3千多支股票計算,則會產生一萬多張表。我曾嘗試過在一個數據庫中保存幾百個表,實際發現,隨着表數量增加,整個庫的訪問都會變得很慢。於是拆庫的問題擺在前言。還好每支股票都有唯一的代碼,我將其代碼通過取模的方式將它們拆分到300個庫中,這樣每個庫里表數量不足100個,可以保證數據庫的訪問效率。

        至於具體的表定義,我們將在之后的博文中做介紹。

程序結構的設計

        “實時抓取”和“離線計算”是我們程序的核心功能。它們具有如下特點:操作數據庫、記錄日志。在設計程序結構時,我希望相應模塊可以獨立工作,這樣可以讓不同任務公用相同的模塊。於是我划分出如下模塊:
  • 配置管理器。負責讀取和管理配置。它是以單例形式存在的。
  • 日志管理器。它負責管理日志的輸出方式。
  • 正則表達式管理器。因為抓取的內容需要通過正則表達式去提取,所以設計了一個單例模塊用於輔助該功能實現和使用。
  • 數據庫管理器。我們的數據被分布在不同的數據庫中,所以需要一個獨立的數據庫管理模塊讓底層分庫等復雜操作對上層隱藏。
  • 普通任務管理器。“實時抓取”和“離線計算”都是普通任務,這些任務統一通過該管理器進行管理。
  • 系統任務管理器。因為配置文件可能在程序運行時發生改變,所以我們需要定期去檢查改變,並通知各管理根據改變的內容做相應調整。
        
        普通任務管理器和系統任務管理都需要一個調度框架來支持。我沒有去造輪子,而是選用了Advanced Python Scheduler。它的詳細文檔可以見http://apscheduler.readthedocs.io/en/latest/。         最后我們看下工程的目錄結構
  • conf目錄用於保存框架和策略使用的各個配置文件。其下table_template用於保存創建數據庫中表的SQL模板。
  • log目錄用於保存運行時產生的各種日志文件。
  • src保存的是工程所有代碼。其下frame保存的是框架代碼;strategy保存的是各個抓取策略的代碼,其中還包括一部分離線計算的代碼;tools保存的是工具性的代碼,比如對數據庫進行統一的某種操作。
        經過這兩篇博文對數據源、架構結構的介紹,我們大致可以看出整個項目的設計。接下來我將介紹各個模塊的實現。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com