人工智能與量化投資--股票日線數據閉環的實現

在使用人工智能或者說目前最流行的深度學習和神經網絡的時候,可能大家都有一個共識,就是數據是最重要的。事實上,深度神經網絡發展到現在,或者說人工智能發展到現在,數據並沒有我們想象的那麼重要。

有些剛接觸人工智能和深度神經網絡的同學們可能會說,沒有數據,你拿什麼來做訓練呢?其實,我們可以去通過各種方法生成我們所需要的數據,尤其是我們在數據不足的情況下。其實目前對於人工智能或者說深度學習模型來說,優質的數據太少太少了,以至於其實優質的數據和質量不夠好的數據訓練出來的模型的泛化準確率可以差到幾個百分點。但是事實上,巨大的數據量靠人工去檢查和更正是一個不可能完成的任務。

回過頭來討論我們今天的話題,前面我說了,這個專題是《深度學習與金融市場》這個專題的延續,在上一個專題我們已經討論過數據閉環的重要性。而這個專題我們來討論具體的實現方法和邏輯。

本文裏我們僅僅討論日線數據閉環,原因是因爲篇幅不夠,我會採用tushare的接口來實現部分的代碼給大家。事實上我自己是沒有用tushare的接口,我使用的是完全自己開發的數據接口,主要是因爲更穩定,後期不用去爲此修改代碼!初期大家可以使用tushare的開源接口,等到使用人工智能量化投資穩定盈利了,再開發自己的數據接口。

可能有的同學會覺得tushare的數據接口已經很好用了,事實上我們實戰的時候其實就知道,這只是一個基礎接口,並且實時數據的部分也是缺失的。而我們即便是做日線,也是需要實時的數據的,比如我需要一個14:30的策略,那麼其實tushare都是在15:00到16:00間更新日線數據的。但是,我們用來做一些基礎的研究也勉強夠用了。

事實上我自己抓取的OHLCV是分鐘數據,其他的我都沒有去抓,因爲其他的數據都可以由分鐘數據計算出來。本文中,爲大家介紹抓取日線數據,因爲tushare的分鐘數據並不完善,我們可以通過日線數據建立我們的數據閉環。

我們來列出我們的數據接口需要實現哪些功能。

一、獲得單隻股票的歷史OHLCV數據。

二、獲得指定多隻股票的歷史OHLCV數據。

三、獲得所有股票的歷史OHLCV數據。

四、獲得單隻股票的實時OHLCV數據。

五、獲得指定多隻股票的實時OHLCV數據。

六、獲得所有股票的實時OHLCV數據。

七、將所有股票的OHLCV數據更新到最新。

接下來我們逐一來實現這些功能,當然我們會將這些數據根據需要寫入到本地,避免重複低效勞動,我們會將每隻股票的數據按其代碼作爲文件名來存儲爲CSV文件。事實上,我自己在做的時候是存儲爲數據庫的,本質上也沒有太大的差別,主要由於我存儲的是分鐘線數據,相對來講數據量較大。

其中歷史數據的部分,我會用tushare來實現一個給大家,完全是現寫給大家,因爲我自己並不用這個接口。而實時數據的部分,我們也說了tushare並不方便去獲取。因此我們本文中只實現獲得歷史數據的部分,其實對於我們剛剛使用人工智能量化來說,歷史數據也僅僅是沒有當天的數據而已,也是夠用的。我們本文只實現一、二、三、七四個功能。

這四個功能我們分兩個方法來完成,我這裏的方法是指的類中的方法。我們直接根據代碼來講吧!爲了方便截圖,我的代碼中沒有加註釋,我們在文章中來解釋。首先我們import一些我們需要的包。

然後我們來定義一個名爲OHLCV的類,我們先來看看我們的__init__裏面要做些什麼事情?首先我們定義一個路徑,用來存放我們的數據,這是必須的,我們不可能每次都從網絡上去抓取數據,所以建立本地數據庫,並不斷去同步到最新是非常有必要的。接下來我們定義了token,這個是tushare的接口所必須要的。這兩個變量我們在實例化對象的時候會指定。接下來我們定義了一個countPerRead的變量,這是因爲tushare一次只能讀取4000個數據。然後我們實例化了一個tushare的pro的類,這樣我們在後面就不用再去實例化了。

然後我們來看一些在我們主要的兩個方法裏會用到的一些基礎方法。get_local_date這個方法用來取得本地的時間,也就是說是你電腦的時間,當然我們也可以從網絡上去取這個時間,但是一般大家的電腦時間都是準確的。get_basic_info這個方法則是用來獲取A股所有上市公司的基本信息,在這裏主要是爲get_stock_list和get_IPO_date這兩個方法所用,一個是用來獲得所有上市公司的代碼列表,一個是用來獲得股票的上市時間供我們抓取歷史數據的時候使用。

接下來就進入到我們重頭戲了,get_one_history用來獲取一隻股票的歷史數據。我們先來介紹一下參數,股票代碼是必須的;而後是是否從網絡更新數據到本地,這意味着你有可能只想從本地讀取數據;而後就是開始和結束日期了。

首先,我們讀取本地的數據,如果本地數據存在,我們將我們從網絡抓取數據的起始時間設置爲本地數據最後一條的時間。如果本地數據不存在,我們將起始時間設置爲股票的上市日期。而結束時間我們一律設置爲當天的時間。然後我們判斷是否需要更新本地數據,一種情況是本地數據已經是最新,另一種情況是你只想讀取本地數據,這兩種情況下我們都直接返回本地數據對應的日期段。

其次,我們就要通過tushare的接口來讀取數據,由於tushare一次只能讀取4000條,那麼我們用一個循環來讀取,並且我們將循環讀取的數據連接起來。當一次讀取小於4000條的時候,我們認爲讀取結束,跳出循環後,我們將刪除日期重複的行,爲什麼會用重複呢?因爲我們在每次循環裏選取日期的時候,我們使用的是上一次讀取的數據裏的最後一條日期。

最後,刪除重複數據之後,我們再使用tushare的另一個接口讀取所有的復權因子,沒有復權因子的OHLCV是沒有靈魂的。然後我們將復權因子和歷史OHLCV用concat做成一個Dataframe。現在我們就有了一段OHLCV數據,然後我們把它和我們本地讀取到的歷史數據連接起來,這樣就構成了我們這隻股票的所有的歷史數據,並且這個歷史數據是帶復權因子的。我們就可以返回我們所需要歷史數據段,並且將更新的數據寫入到我們本地,保證我們本地數據是最新的。

到這裏,get_one_history就講完了。接下來我們看看get_multi_history這個方法,其實就很簡單了對嗎,我們針對每一隻列表裏的股票去做get_one_history就好了。

我們來看看,基礎邏輯是這樣,我們判斷有沒有傳codeList,如果沒有,我們就認爲你需要的是所有的A股上市公司,如果有,那麼codeList就是你指定的列表。然後我們對每一隻股票來做get_one_history。你只需要選定update爲True,那麼你的本地數據都會全部被更新到最新。

接下來我們來看實際調用的例子,我們分別來獲得單隻、多隻和所有股票的數據。

我們來看看data1和data2的打印結果,data3由於太過龐大,我們就不打印了,大家可以自行試試。

所以大家其實可以看到,這樣的數據纔是我們所需要的數據,爲什麼我說網上這些個數據接口都不實用,因爲這些人並不是做人工智能量化的,所以在數據的組織和結構上並不能很好的適應我們的使用,實際上在大家跟我後面的內容的時候就會發現,合適的數據接口,能事半功倍。當然我們這裏的數據接口還缺實時數據接口,如果做日線,我們需要的實時性並不是特別高。

本文代碼,同學們可以加關注後私信或者留言向我索取。

人工智能與深度學習做量化請關注:AI量化(https://t.zsxq.com/RvfY37y) 星球限時免費,如需加入,請私信我獲得免費邀請碼!

零基礎學習Python與深度學習應用請關注星球:Python與深度學習 https://t.zsxq.com/bUFayZ3

微信公衆號:QTechAI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章