零基礎python代碼策略模型實戰
內容摘要
1
本文概述
本文主要介紹了python基礎、爬蟲、與資料庫交互、調用機器學習、深度學習、NLP等。分別介紹了各個模塊的安裝,環境的搭建等。並且以機器學習選股為例,把各個模塊連貫起來,核心代碼基本都有詳盡的解釋。
2
大數據AI時代,python無往不勝
Python的包裝能力、可組合性、可嵌入性都很好,可以把各種複雜性包裝在Python模塊里,非常友好的供調用。Python資源豐富,深度學習如keras,機器學習如sk-learn,科學計算如numpy、pandas,自然語言處理如jieba等。
3
Python將極大提高工作效率
無論是科學計算,還是圖形界面顯示;無論是機器學習還是深度學習;無論是操作excel,txt等還是連接資料庫;無論是搭建網站還是爬蟲;無論是自然語言處理還是打包成exe執行文件,python都能快速完成。以最少的代碼,最高效的完成。
4
人人可編寫人工智慧模型
人工智慧給人感覺難於入手,重要原因是機器學習、深度學習、自然語言處理等門檻太高;python則以最簡潔的方式,讓你快速使用人工智慧相關演算法。本文以實戰為目的,對模塊的安裝,搭建環境,核心代碼等進行了詳細的介紹。
5
人工智慧選股模型策略(Logistic為例)
以傳統因子滾動12個月值為特徵值,個股下一期按收益大小排序,排名前30%作為強勢股,排名靠後30%作為弱勢股。用機器學習演算法進行訓練預測。用當期因子作為輸入,預測未來一個月個股相對走勢的強弱。根據個股的相對強勢,我們把排名靠前20%的作為多頭,排名後20%的作為空頭進行了研究,樣本外20090105到20171130期間,行業中性等權年化多空收益差為16.45%,年化波動率為7.34%,最大回撤為10.84%。
◢ Part I ◣Python基礎介紹
Python是一種面向對象的解釋型計算機程序設計語言,由荷蘭人Guido van Rossum於1989年發明。有以下優點簡單、易學、免費開源、可移植性、解釋性強;缺點為單行語句輸出、同C++和Matlab比運行速度較慢。Python有較為強大的標準庫和模塊,方便用戶進行調用:如科學計算的Numpy、Pandas、Scipy庫;如機器學習和深度學習的Scikit-learn、Keras庫;如爬蟲的Pyquery、BeautifulSoup、Scrapy庫。Python的應用領域較為廣泛包括Web開發、人工智慧、雲計算、網路爬蟲,遊戲開發等。
一
Python的科學計算庫
1、Numpy庫
Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似於矩陣的表示形式,不過Numpy為我們提供了更多的函數。操作方法有以下幾種:
1) 導入模塊;
2) 以list或tuple變數為參數產生一維或者多維度的數組;
3) 通過reshape方法,創建一個只改變原數組尺寸的新數組,原數組的shape保持不變;
4) arange函數通過指定開始值、終值(不包括)和步長來創建一維數組;
5) linspace函數通過指定開始值、終值(包括)和元素個數來創建一維數組;
6) 合併數組可以分為vstack(垂直方向)和hstack(水平方向)操作;
2、Pandas庫
pandas核心為兩大數據結構,即Series和DataFrame。數據分析相關的所有事務都是圍繞著這兩種結構進行,pandas庫的Series對象是由一組數據(各種Numpy數據類型)以及一組與之相關的數據標籤(即Index)組成。DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型(數值、字元串、布尓值等),DataFrame既有行索引(Index),也有列索引(Columns)。
Pandas的相關操作有以下幾種:
1) 導入模塊(與Numpy類似);
2) 創建Series,DataFrame;
3) 用describe()函數對數據的快速匯總;
4) 運用concat合併DataFrame;
5) 進行groupby分組;
6) 按值進行排序。
3、Scipy庫
SciPy庫是基於Numpy構建的一個集成了多種數學演算法和方便的函數的Python模塊。通過給用戶提供一些高層的命令和類,SciPy在python互動式會話中,大大增加了操作和可視化數據的能力。
4、Matplotlib庫
Matplotlib庫是一個用於創建出版質量圖表的桌面繪圖包(主要是2D方面),這是一個用Python構建的MATLAB式的繪圖介面,所以庫函數的參數以及調用方法大都與MATLAB一致。以下是Matplotlib使用的簡單示例:
二
Python的爬蟲相關庫
網路爬蟲(Web crawler),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本,它們被廣泛用於互聯網搜索引擎或其他類似網站,可以自動採集所有其能夠訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。從功能上來講,爬蟲一般分為數據採集,處理,儲存三個部分。傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較為複雜,需要根據一定的網頁分析演算法過濾與主題無關的鏈接,保留有用的鏈接並將其放入等待抓取的URL隊列。然後,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,並重複上述過程,直到達到系統的某一條件時停止。
網路爬蟲的基本工作流程如下:
1) 首先選取一部分精心挑選的種子URL;
2) 將這些URL放入待抓取URL隊列;
3) 從待抓取URL隊列中取出URL,解析DNS,得到主機的IP,並將URL對應的網頁下載下來,存儲進已下載網頁庫中。此外,將這些URL放進已抓取URL隊列;
4) 分析已抓取URL隊列中的URL,分析其對應網頁中的其他子URL,並且將未抓取過的子URL放入待抓取URL隊列,從而進入下一個循環。
1、Scrapy庫
Scrapy是Python開發的一個快速,高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途廣泛,可以用於數據挖掘、監測和自動化測試、信息處理和歷史檔案等大量應用範圍內抽取結構化數據的應用程序框架,廣泛用於工業和大數據領域。Scrapy的安裝步驟如下:
1) 在dos窗口輸入:pip install scrapy回車;
2) 測試scrapy是否安裝成功,在dos窗口輸入scrapy回車;
Scrapy主要包括了以下組件:
1) 引擎,用來處理整個系統的數據流處理,觸發事務。
2) 調度器,用來接受引擎發過來的請求,壓入隊列中,並在引擎再次請求的時候返回。
3) 下載器,用於下載網頁內容,並將網頁內容返回給蜘蛛。
4) 蜘蛛,蜘蛛是主要幹活的,用它來制訂特定域名或網頁的解析規則。
5) 項目管道,負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清洗、驗證和存儲數據。當頁面被蜘蛛解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
6) 下載器中間件,位於Scrapy引擎和下載器之間的鉤子框架,主要是處理Scrapy引擎與 下載器之間的請求及響應。
7) 蜘蛛中間件,介於Scrapy引擎和蜘蛛之間的鉤子框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
調度中間件,介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應
2、BeautifulSoup庫
BeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式。BeautifulSoup對象表示的是一個文檔的全部內容。大部分時候,可以把它當作Tag對象,它支持遍歷文檔樹和搜索文檔樹中描述的大部分的方法。BeautifulSoup的安裝方法如下:
① 在dos窗口輸入pip install beautifulsoup4
② 進入python,輸入from bs4 import BeautifulSoup運行,若不報錯則安裝成功。
3、Pyquery庫
Pyquery是一個類似jquery的庫, 通過使用lxml來處理xml和html. 所以在使用pyquery時得先安裝lxml庫,在使用前需要先安裝lxml,下載地址如下:
① http://codespeak.net/lxml/lxml-2.2.8.tgz
② http://pypi.python.org/packages/source/p/pyquery/pyquery-0.6.1.tar.gz
快速簡便的安裝方法是在dos窗口輸入:
① pip install libxml2-devel, pip install libxslt (Anaconda一般默認已安裝,直接第下一步便可)
② pip install pyquery
到此時安裝已經完成。但以作者的經驗,不知是PyQuery的bug還是什麼原因,對於中文是亂碼,解決方法如下:
把pyquery/openers.py 的_requests 函數中的 if encoding: resp.encoding = encoding
換成 resp.encoding = encoding or None
以上是目前主流的一些爬蟲框架,相對來說,Scrapy功能最強大,BeautifulSoup比較經典,Pyquery則處理中文更加友好。當然,在爬蟲中,會比樣例複雜太多,爬蟲者對css,js等前端技術有了解則更好,有些目標網頁可能會有反爬蟲機制,這是一個鬥智斗勇的過程,你可能需要設置代理IP,模擬瀏覽器等相關技術。
三
Python的數據交互
Python提供了多種數據的介面包括與MySQL,SQL Server,Wind等多類資料庫,同時對於小批量的數據格式,例如csv、excel和txt等文件也可以完成數據的導入和導出。
1、Python與資料庫的交互
PyMySQL是用於Python連接MySQL資料庫的介面,在使用之前需要安裝,安裝的語句為:
pip install pymysql
其主要操作如下:
1) 查詢記錄;
2) 插入數據;
3) 更新數據;
4) 刪除數據。
Pyodbc是用於Python連接SQL Sever資料庫的介面,在使用之前需要安裝,安裝的語句為:
pip install pyodbc
其主要操作如下:
1) 查詢記錄;
2) 插入數據;
3) 更新數據;
4) 刪除數據。
二、 Python與csv、excel和txt文件的交互
對於csv、excel和txt格式的文件,Pandas和Python內置函數提供了導入和保存數據的方法,具體如下:
三、 Python與Wind客戶端的交互
1) 正常WindPy介面安裝
打開Wind資訊終端,點擊「量化」選項,出現下方的界面,點擊「Python插件」,會彈出廣告說明;
2) 特殊安裝WindPy方式
假設Wind終端安裝在C:WindWind.NET.ClientWindNET目錄(目錄下有bin等等子目錄),Python安裝在C:python28目錄。首先通過Windows進入cmd命令,然後輸入如下命令即可:
C:Python28python.exeC:WindWind.NET.ClientWindNETininstallWindPy.py C:windwind.net.clientwindnet
按任意鍵WindPy安裝過程結束。
說明:以上介面安裝說明來自於wind客戶端,若有更新,請參考最新wind說明。
◢ Part II ◣ python與人工智慧
一
Python自然語言的處理
1、jieba庫
jieba是一個python實現的分詞庫,對中文有著很強大的分詞能力。Jieba安裝方法為:
pip install jieba
jieba庫的優點如下:
1) 支持三種分詞模式;
精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
2) 支持繁體分詞
3) 支持自定義詞
除了jieba分詞外,還有以外分詞庫等也非常流行:
1) NLTK庫
在使用 Python 處理自然語言的工具中也處於領先的地位。它提供了 WordNet 這種方便處理辭彙資源的介面,以及分類、分詞、詞幹提取、標註、語法分析、語義推理等類庫。
網站
http://www.nltk.org/
安裝 :
pip install -U nltk
2) TextBlob庫
TextBlob 是一個處理文本數據的 Python 庫。它提供了一個簡單的 api 來解決一些常見的自然語言處理任務,例如詞性標註、名詞短語抽取、情感分析、分類、翻譯等等。
網站:
http://textblob.readthedocs.org/en/dev/
安裝:
pip install -U textblob
二
Python與機器學習
基於python的機器學習庫非常多,主要有以下幾類:
1)Scikit-learn 是一個簡單且高效的數據挖掘和數據分析工具,易上手,可以在多個上下文中重複使用。它基於NumPy, SciPy 和 matplotlib,開源,可商用(基於 BSD 許可)。
2)Statsmodels 是一個 Python 模塊,可以用來探索數據,估計統計模型,進行統計測試。對於不同類型的數據和模型估計,都有描述性統計,統計測試,繪圖功能和結果統計的詳細列表可用。
3)Shogun 是一個機器學習工具箱,它提供了很多統一高效的機器學習方法。這個工具箱允許多個數據表達,演算法類和通用工具無縫組合。
等等。以下主要介紹Scikit-learn。
1、Scikit-learn庫
Scikit-learn是Python裡面一個機器學習相關的庫,它是構建於NumPy, SciPy, and matplotlib基礎上的簡單高效的數據挖掘和數據分析工具,而且是開源的,內部自帶的演算法包較多。
安裝方法如下:
Anaconda一般都包含了這些包,但有時可能需要更新,更新方法為:
pip install -U scikit-learn
主要內容如下:
1) 按演算法的功能分類,分為分類(classification),回歸(regression),聚類(clustering),降維,預處理等。sklearn提供了很全面的演算法實現;
(具體清單可以參考http://scikit-learn.org/stable/index.html)
2) 測試數據集,比如iris,boston房價等,總共10個左右;
3) 數據預處理,比如二值化,正規化,特徵提取;
4) 測試數據選擇、測試演算法以及確定參數,甚至pipeline化的支持;
5) 其他支持功能,比如評分matrix;
使用sklearn進行計算的主要步驟:
1) 數據準備。需要把數據集整理為輸入X[sample_count, feature_count],結果y[label_count]的格式,其中sample_count應該等於label_count;
2) [可選的降維過程],原始數據維度大可能會出現The curse of dimensionality 問題,嚴重影響性能和演算法的擴展性,sklearn會以降維(PCA等)或者一些原型演算法(Kmeans,Lasso等,也叫shrinkage)去掉貢獻度低的一些維度;
3) 學習以及預測的過程。生成一個演算法的預測器Estimator,同時可以自己設置參數,比如K近鄰聚類;調用該預測器的fit(x,y)函數對輸入數據和結果label進行學習,從中得到學習的結果,即分類器的各種參數;對未知數據進行預測;
4) 反覆學習的過程。僅僅使用一個預測器,或者使用一個預測器的一種參數,對未知數據進行預測可能會有不準確性,所以會使用多種策略:把已知的數據分為多份進行多次計算,常用的是k-fold ,k-label-fold, leave-1, leave-1-lable等;多個預測器進行預測,或者獨立進行預測,或者組合預測;對一個預測器設置不同的參數進行多次進行預測,同時把數據分組。基本上每一種分類器都有cross- validation(交叉驗證)版本,即把預測器加上cv,比如LassoCV。
2、分類演算法,以樸素Bayes為例
單一的分類方法主要包括:決策樹、貝葉斯、人工神經網路、K-近鄰、支持向量機和基於關聯規則的分類等;另外還有用於組合單一分類方法的集成學習演算法,如Bagging和Boosting等。以下主要介紹樸素貝葉斯。
樸素貝葉斯方法,其中樸素指的是特徵條件獨立,貝葉斯指的是基於貝葉斯定理。分類:通過學到的概率,給定未分類新實例X,就可以通過上述概率進行計算,得到該實例屬於各類的後驗概率。具體步驟如下:先計算該實例屬於類的概率,再確定該實例所屬的分類其中。
下面用具體的sklearn中的案例來說明樸素Bayes分類的應用:
3、回歸演算法:以 Logistic為例
回歸演算法是試圖採用對誤差的衡量來探索變數之間的關係的一類演算法。常見的回歸演算法包括:最小二乘法(Ordinary Least Square),邏輯回歸(Logistic Regression),逐步式回歸(Stepwise Regression),多元自適應回歸樣條(Multivariate Adaptive Regression Splines)以及本地散點平滑估計(Locally Estimated Scatterplot Smoothing)。以下主要介紹Logistic回歸。
Logistic回歸是研究二分類觀察結果與一些影響因素之間關係的一種多變數分析方法。通常的問題是,研究某些因素條件下某個結果是否發生。根據線性回歸可以預測連續的值,對於分類問題,我們需要輸出0或者1。所以,在分類模型中需要將連續值轉換為離散值。我們可以預測: 當大於等於0.5時,輸出為y=1;當小於0.5時,輸出為y=0。
4、聚類演算法:以 k-means為例
聚類指事先並不知道任何樣本的類別標號,通過某演算法來把一組未知類別的樣本劃分成若干類別,叫作 unsupervised learning (無監督學習)。在本文中,我們主要介紹一個比較簡單的聚類演算法:k-means演算法。
我們把樣本間的某種距離或者相似性來定義聚類,即把相似的(或距離近的)樣本聚為同一類,而把不相似的(或距離遠的)樣本歸在其他類。
k-means演算法是一種很常見的聚類演算法,它的基本思想是:通過迭代尋找k個聚類的一種劃分方案,使得用這k個聚類的均值來代表相應各類樣本時所得的總體誤差最小。k-means演算法的基礎是最小誤差平方和準則。
k-means 演算法的主要實現步驟如下:
1) 從N個數據對象中隨機挑選k 個對象當作聚類的初始聚類的中心,即種子點;
2) 分別計算剩下其它對象與這些聚類的中心的相似度即其距離,然後將其分別將它們劃分給與相似最多的聚類心;
3) 計算該聚類中所有相關對象的平均值,即點群中心點,然後種子點移動到屬於他的「點群」的中心;重複2,3過程,一直到其標準測度的函數開始收斂結束,即種子點沒有移動。
三
Python與深度學習
目前常用的深度學習框架包括Caffe、CNTK、TensorFlow、Theano和Torch,keras等。
Caffe開始於2013年底,具有出色的卷積神經網路實現。在計算機視覺領域Caffe依然是最流行的工具包,但對遞歸網路和語言建模的支持很差。在Caffe中圖層需要使用C++定義,而網路則使用Protobuf定義。
CNTK中網路會被指定為向量運算的符號圖,運算的組合會形成層。CNTK通過細粒度的構件塊讓用戶不需要使用低層次的語言就能創建新的、複雜的層類型。
TensorFlow是一個理想的RNN(遞歸神經網路) API和實現,TensorFlow使用了向量運算的符號圖方法,使得新網路的指定變得相當容易,但TensorFlow並不支持雙向RNN和3D卷積,同時公共版本的圖定義也不支持循環和條件控制。
Theano支持大部分先進的網路,現在的很多研究想法都來源於Theano,它引領了符號圖在編程網路中使用的趨勢。Theano的符號API支持循環控制,讓RNN的實現更加容易且高效。
Torch對卷積網路的支持非常好。Torch通過時域卷積的本地介面使得它的使用非常直觀。Torch通過很多非官方的擴展支持大量的RNN,同時網路的定義方法也有很多種。與Caffe相比,在Torch中定義新圖層非常容易,不需要使用C++編程,圖層和網路定義方式之間的區別最小。
本文主要介紹keras,原因如下:
1) 純Python,方便查看/修改源代碼
2) 支持theano和Tensorflow兩種模式
3) 配置非常簡單,可快速搭建自己的模型
4)文檔齊全,社區非常活躍
5)封裝的非常好,簡單好用
1、Keras框架
1)簡單介紹
Keras是基於Theano、TensorFlow的一個深度學習框架,它的設計參考了Torch,用Python語言編寫,是一個高度模塊化的神經網路庫,支持GPU和CPU(使用的文檔為http://keras.io/)。以下是深度學習幾個說明:
激活函數:加入非線性因素的,因為線性模型的表達能力不夠
放棄層(Dropout):防止過擬合
損失函數:模型試圖最小化的目標函數,衡量模型預測的好壞
池化層:Mean pooling(均值採樣)、Max pooling(最大值採樣)、Overlapping (重疊採樣)、L2 pooling(均方採樣)、Local Contrast Normalization(歸一化採樣)、Stochasticpooling(隨即採樣)、Def-pooling(形變約束採樣)。其中最經典的是最大池化,作用是降維,可以擴大感知野
優化演算法:最常用的為SGD演算法,也就是隨機梯度下降演算法
全連接層(Dense):負責分類或者回歸;全連接層會丟失一些特徵位置信息,矩陣乘法,相當於一個特徵空間變換,可以把有用的信息提取整合;維度變換,尤其是可以把高維變到低維,同時把有用的信息保留下來。
2)框架搭建
1) 以Windows版本作為基礎環境
2) 目前Tensorflow不支持Windows版本,所以本文選用Theano安裝
3) Python環境建議使用Anaconda3
4) 安裝Theano ,首先要安裝C++ 編譯器,因為windows下面沒有,所以首先安裝MinGw,這是一個GCC的編譯環境:
1、在cmd中輸入conda install mingw libpython
2、配置環境變數:path:C:AnacondaMinGWin;C:AnacondaMinGWx86_64-w64-mingw32lib;
3)、path中還要加入:C:Anaconda2;C:Anaconda2Scripts;
註:以以路徑請修改為自己的anaconda所在位置
5) 安裝theano庫
pip install theano
6) 安裝keras庫
pip install keras
7) 在用戶文件夾的.keras子文件夾下找到keras.json,然後記事本編輯改"tensorflow"為"theano"(不能為Theano,必須全部小寫,否則報錯)
8) 驗證keras是否安裝成功
>>> import keras
Using Theano backend.
沒有報錯則恭喜您,深度學習環境已搭建成功!
2、長短期記憶網路
經濟學家靠ARMA模型預測的時間序列模型。該模型對小數據集效果很好,可容納時間序列的記憶效應,如持久性、均值回歸、季節性等。在深入學習中,長短期記憶(Long short-term memory,LSTM)可類比於ARIMA。LSTM是一個循環神經網路,能記憶通過網路預先輸入的信息。LSTM對RNN進行了結構上的修改,來避免長期依賴問題。
3、卷積神經網路
卷積神經網路(Convolutional Neural Network,CNN)一種專門處理圖像的特殊的多層神經網路,包括卷積層(alternating convolutional layer)和池層(pooling layer)。CNN的基本結構一般包括兩層,一為特徵提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特徵。隨著該局部特徵被提取,它與其它特徵間的位置關係也確定下來。二是特徵映射層,網路的每個計算層由多個特徵映射組成,每個特徵映射是一個平面,平面上所有神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數作為卷積網路的激活函數,使得特徵映射具有位移不變性。
◢ Part III ◣ 結論分析
一
人工智慧因子打分策略
1、策略代碼實戰
整體策略模型,我們基本都是模塊化編寫,即各功能都是嚴格分開編寫,方便後續修改,也方便代碼重用。各大模塊代碼實戰分析:
1) 提取資料庫模塊代碼分析
該模塊功能主要用於從資料庫提取數據,但不作任何處理。
核心代碼分析:
def conFactor():
該函數為資料庫連接模塊,顧名思義,就是連接資料庫模塊
import pyodbc:導入連接資料庫驅動模塊,pyodbc用於Python連接sql server資料庫
import configInfo:導入參數模塊,為了方便修改,我們把所有參數放在該模塊
sql_data:查詢語句,此處功能是查詢指定個股指定時間的指定因子值
cur.execute(sql_data):執行查詢語句
for row in cur.fetchall():用於獲取所有查詢到的數據,然後進行封裝。
Python需要嚴格縮進。否則代碼則出錯。比如函數體都需要縮進,for循環等也需要縮進。
2) 數據預處理模塊
a.沒滿一年的新股不進行機器學習因子計算:因為需要用最近歷史一年的數據作為訓練。
b.對於缺失值,用平均值代替,當缺失達到10%,則該因子丟棄。
c. z-score標準化,要求原始數據的分布可以近似為高斯分布,否則效果不好。
對a_value,turnover_1等這一類不不符合高斯分布因子,需要用ln(t1/t0)(同一個股當期與上期比值的對數)進行處理,才近似高斯分布。但對sec_return_1,MACD等這一類變化率等相關因子,直接用原始值便可以,因為他們本身已經近似符合正態分布。
預處理之所有沒有處理掉極值和去掉漲跌停個股因子,原因是因為此處只是訓練特徵,而不是最終選股。再次,我們所選的因子是經過人工核對的,基本沒有太多相似性,故也沒有降維這一步。
核心代碼分析:
from utils import publicVariables:有些公用變數,建議單獨建在一個模塊,這樣方便調用。
from sklearn import preprocessing:導入預處理模塊。
temp_factor[i,:] = np.log(factor[i]/temp[i-1]):經驗告訴我們,有些因子已經近似為高斯分布,比如動量因子,普通的因子經過取對數後與高斯分布比較接近,比如流動市值因子。
array_data = preprocessing.scale(array_data):z-score標準化,要求原始數據的分布可以近似為高斯分布,否則效果不好。
3) 中性化處理模塊
中性化處理我們包含二層含義,一是市值中性化,二是行業中性化。
首先,我們都知道,市值因子對個股的影響十分顯著,如果不考慮市值帶來的干擾,則我們的策略可能被市值因子帶來嚴重的影響。為此,我們市值分成20組,分別在不同市值組各選取20%作為策略多頭與空頭,使多頭與空頭有相同的市值分布,以消除市值可能帶來的影響。
其次,眾所周知,不同行業,因子特徵可能差異明顯,放在一起可能不具備可比性。為了去除行業帶來的影響,我們也分別在不同行業選取20%作為我們的空頭與多頭,使多頭與空頭保持同樣的行業暴露,以消除行業帶來的影響。
中性化處理代碼相對比較簡單,且基本是按照邏輯編寫便可,在此不作詳細介紹。
4) 機器學習模塊
機器學習模塊是核心,也是重點,也最簡單,因為一般情況下,我們沒有特殊要求,直接調用現在的機器學習包便可。重點要注意的是處理好數據成機器學習輸入的形式就可以了。一般機器學習演算法的輸入形式為:自變數為n*m數組,n為樣本數量,m為因子個數,因變數為對應的標籤列表。
核心代碼分析:
k = math.floor(np.sqrt(len(array_data))):經驗參數,n一般少於訓練集的平方根。表示n個鄰近。
knn=KNeighborsClassifier(n_neighbors=k,weights="distance"):實例化演算法,weights為加權方式,weights="distance",對距離加權,可以降低k值設定的影響。
knn.fit(array_data,list_target) :模型訓練擬合。
list_predict = list(knn.predict_proba(array_predict)[:,1]):模型預測結果。
1) 策略計算模塊
該模塊主要負責計算策略整體評估功能,主要包括:計算多空收益差模塊,計算IC模塊,分N組計算各組收益模塊。主要考慮了以下幾種情況:
a. 當期單個因子在全市場缺失達40%時,則該因子丟棄,不進行計算。
b. 調倉當天停牌,漲停,跌停個股剔除。
c. 新股一個月之內不能作為候選股(上市小於20個交易日)。
核心代碼分析:
import pandas as pd:導入pandas模塊
order_data = pd.Series(order_data):原型為pd.Series(data, index=index), data是數據源,可以是Python字典類型,ndarray或者標量值。index代表軸標籤,傳遞列表類型。若index省略,則默認為[0,1,2,…,len(data)-1]
order_data.corr(order_ret):計算序列order_data與序列order_ret的相關係數。
1) 結果入庫模塊
該模塊功能簡單明了,即只是把計算結果保存到資料庫。
核心代碼分析:
sql = "insert into "+table+tableField+" values("+factors_str+")":插入資料庫語句
cur.execute(sql):執行插入資料庫語句
conn.commit():提交執行插入資料庫語句
except pyodbc.Error as e:
print (sql) :若執行錯誤則輸出。目的是為了調試,出了問題也方便第一時間找到原因。
2、策略結果(以Logistic為例)
相關說明如下:
1) 所用因子:全市場訓練得到的個股未來相對強勢值。
2) L/S:全市場選股多空收益差凈值。相對強勢值排名靠前20%作為多頭,相對強勢值排名後20%作為空頭。
3) aL/Se:市值等權多空收益差凈值。分20小組,分別在組內選前20%作為多頭,後20%作為空頭,最後各組等權。
4) aL/Sw:市值加權多空收益差凈值。分20小組,分別在組內選前20%作為多頭,後20%作為空頭,最後各組以市值組權重加權得到多空組合。
5) iL/Se:行業等權多空收益差凈值。在中信一級行業,分別在行業內選前20%作為多頭,後20%作為空頭,最後各行業以等權到多空組合。
6) iL/Sw:行業加權多空收益差凈值。在中信一級行業,分別在行業內選前20%作為多頭,後20%作為空頭,最後各行業以滬深300行業內權重加權得到多空組合。
◢ Part IV ◣ 一些總結
一
Python股票策略打包成Exe文件
二
模型代碼編寫建議
作為一位量化投資相關人員,雖然編寫代碼不是核心,但擁有一個良好的編寫代碼習慣也是提高工作效率的關鍵。在此給出幾點個人的代碼編寫建議。
1) 在開始編碼之前,一定要有個大致的設計,比如模型分幾大塊:控制層模塊(相當於總設計),讀取數據模塊、數據預處理模塊、模型核心演算法模塊、數據結果保存或者展示模塊等(通過情況下,我們一個簡單的策略都可以分成這幾大塊)。
2) 優秀的代碼文檔跟編程語句一樣重要。在代碼源文件中,應該為主要的代碼段添加註釋,解釋代碼的基本邏輯,若模型交接方便接手人了解代碼也方便日後自己回顧。若是日後修正代碼,則應該註明修改日期,以及修改的原因。
3) 最好有一個README文件,註明每個源文件、數據文件等的作用。整個模型流程及功能及模型需要注意的事項也應該加以註明。
4) 變數名和函數名稱儘可能寫得有意義。例如,收盤價數組可定義為array_close,而不是直接寫close或者c,array_close非常直觀的可以讓人知道這是一個array數組,用來存放close的。
5) 重複的代碼一定不要出現。可用函數形式,用到時調用。這樣方便日後修改,也不會出現某處忘記修改的情況。
6) 最後一項,也不是最不重要的一項,每次修改版本之前,一定要備份,否則出了問題,無法回到之前版本,那將是令人抓狂的一件事情。
簡介
首席分析師 丁魯明
同濟大學金融數學碩士,中國准精算師,現任中信建投證券研究發展部金融工程方向負責人,首席分析師。10年證券從業,歷任海通證券研究所金融工程高級研究員、量化資產配置方向負責人;先後從事轉債、選股、高頻交易、行業配置、大類資產配置等領域的量化策略研究,對大類資產配置、資產擇時領域研究深入,創立國內「量化基本面」投研體系。多次榮獲團隊榮譽:新財富最佳分析師2009第4、2012第4、2013第1、2014第3等;水晶球最佳分析師2009第1、2013第1等。
團隊成員介紹:
?王贇傑:上海交通大學數學博士,5年證券從業經驗,2016年加入中信建投研究所金融工程團隊。專註於衍生品套利,基金產品研究。
?喻銀尤:復旦大學計算機碩士,通過CFA三級,兩年上交所相關部門工作經驗,專註於大數據、多因子、人工智慧等相關策略研究。
?陳元驊:哥倫比亞大學金融數學碩士,3年證券從業經驗,專註於衍生品定價及交易策略研究,研究成果包括分級A的輪動策略、期權套利策略等。
?段偉良:復旦大學經濟學院碩士, 2016年加入中信建投研究發展部,專註於量化基本面領域的研究,已有的成果包括:行業基本面量化跟蹤體系、投資時鐘模型下的行業輪動策略、次新股選股與倉位控制策略等。
?趙然:中國科學技術大學統計金融系碩士, 2016年加入中信建投研究發展部,專註於大類資產配置的相關研究,研究成果包括:基於BL和風險預算的資產配置框架、量化投資時鐘、黃金和原油擇時等。
TAG:魯明量化全視角 |