機器量化分析(一)——數據採集、預處理與建模

本系列主要介紹一套比較簡單且完備的量化框架,該框架基於現代投資組合理論,並應用主流的機器學習算法進行分析,旨在幫助大家拓展量化投資的思路,輔助構建科學合理的投資策略。

作爲系列第一篇,根據分析和計算流程,本篇主要介紹三部分:數據採集,數據預處理,利用SVM算法進行建模

>> 數據採集 <<

本系列的量化框架,全部採用本地化計算。爲什麼要本地化計算呢,因爲相比在線獲取數據進行分析計算,本地化計算有如下優勢:

  • 1. 穩定——不會因網絡不穩定而導致分析過程中斷。
  • 2. 快速——本地化運算對於數據的訪問速度比在線獲取數據快,當機器學習的算法涉及到海量數據做訓練集或迭代訓練的時候,這一點尤其重要。
  • 3. 可複用——無論基礎的行情數據還是加工處理後的數據,保存在本地後,對於後續進行結果分析或策略優化時更爲方便。

我們進行本地化計算,首先要做的,就是將所需的基礎數據採集到本地數據庫裏,本篇的示例源碼採用的數據庫是MySQL5.5,數據源是tushare pro接口。

我們現在要取一批特定股票的日線行情,部分代碼如下:

# 設置tushare pro的token並獲取連接
ts.set_token('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
pro = ts.pro_api()
# 設定獲取日線行情的初始日期和終止日期,其中終止日期設定爲昨天。
start_dt = '20100101'
time_temp = datetime.datetime.now() - datetime.timedelta(days=1)
end_dt = time_temp.strftime('%Y%m%d')
# 建立數據庫連接,剔除已入庫的部分
db = pymysql.connect(host='127.0.0.1', user='root', passwd='admin', db='stock', charset='utf8')
cursor = db.cursor()
# 設定需要獲取數據的股票池
stock_pool = ['603912.SH','300666.SZ','300618.SZ','002049.SZ','300672.SZ']
total = len(stock_pool)
# 循環獲取單個股票的日線行情
for i in range(len(stock_pool)):
    try:
        df = pro.daily(ts_code=stock_pool[i], start_date=start_dt, end_date=end_dt)
        # 打印進度
        print('Seq: ' + str(i+1) + ' of ' + str(total) + '   Code: ' + str(stock_pool[i]))

上述代碼的註釋部分已將每行代碼的功能解釋清楚了,實際上數據採集的程序主要設置三個參數:獲取行情的初始日期,終止日期,以及股票代碼池

當我們獲取數據後,就要往本地數據庫進行寫入(存儲)操作了,本篇代碼用的是SQL語言,需提前在數據庫內建好相應的表,表配置和表結構如下:

庫名:stock       表名:stock_all

其中 state_dt 和 stock_code 是主鍵和索引。state_dt 的格式是 ‘yyyy-mm-dd’(例:'2018-06-11')。這樣的日期格式便於查詢,且在MySQL內部能夠進行大小比較。
(完整的數據採集代碼詳見 Init_StockAll_Sp.py 文件)

>> 數據預處理 <<

無論是量化策略還是單純的機器學習項目,數據預處理都是非常重要的一環。以機器學習的視角來看,數據預處理主要包括數據清洗,排序,缺失值或異常值處理,統計量分析,相關性分析,主成分分析(PCA),歸一化等。本篇所要介紹的數據預處理比較簡單,只是將存在本地數據庫的日線行情數據整合成一份訓練集數據,以用於後續的機器學習建模和訓練。

在介紹具體的示例代碼之前,我們需要先思考一個問題,應用有監督學習的算法對個股進行建模,我們的輸入數據有哪些,我們期望得到的輸出數據又是什麼?

這個問題的答案因人而異,因策略而異。這個問題本身是將市場問題轉化爲數學問題的一個過程。依賴的是量化寬客自己的知識體系和對市場的理解。

回到正題,本篇示例我們將以最簡單的數據進行分析,我們輸入端的數據是個股每日基礎行情,輸出端數據是股價相較前一交易日的漲跌狀態。簡單點說就是,我們向模型輸入今天的基礎行情,讓模型預測明天股價是漲還是跌。

在代碼實現方式上,我們採用面向對象的思想,將整個數據預處理過程和結果,封裝成一個類,每次創建一個類實例,就得到了特定條件下的一份訓練集。示例代碼如下:

class data_collect(object):

    def __init__(self, in_code,start_dt,end_dt):
        ans = self.collectDATA(in_code,start_dt,end_dt)

    def collectDATA(self,in_code,start_dt,end_dt):
        # 建立數據庫連接,獲取日線基礎行情(開盤價,收盤價,最高價,最低價,成交量,成交額)
        db = pymysql.connect(host='127.0.0.1', user='root', passwd='admin', db='stock', charset='utf8')
        cursor = db.cursor()
        sql_done_set = "SELECT * FROM stock_all a where stock_code = '%s' and state_dt >= '%s' and state_dt <= '%s' order by state_dt asc" % (in_code, start_dt, end_dt)
        cursor.execute(sql_done_set)
        done_set = cursor.fetchall()
        if len(done_set) == 0:
            raise Exception
        self.date_seq = []
        self.open_list = []
        self.close_list = []
        self.high_list = []
        self.low_list = []
        self.vol_list = []
        self.amount_list = []
        for i in range(len(done_set)):
            self.date_seq.append(done_set[i][0])
            self.open_list.append(float(done_set[i][2]))
            self.close_list.append(float(done_set[i][3]))
            self.high_list.append(float(done_set[i][4]))
            self.low_list.append(float(done_set[i][5]))
            self.vol_list.append(float(done_set[i][6]))
            self.amount_list.append(float(done_set[i][7]))
        cursor.close()
        db.close()
        # 將日線行情整合爲訓練集(其中self.train是輸入集,self.target是輸出集,self.test_case是end_dt那天的單條測試輸入)
        self.data_train = []
        self.data_target = []

最終這個類實例化後是要整合出三個數據:

  • 1. self.train :訓練集中的輸入端數據,本例中是每日基礎行情。
  • 2. self.target :訓練集中的輸出數據,本例中相較於前一天股價的漲跌,漲爲1,不漲爲0。並且在排序上,每條 t 交易日的self.train裏的數據對應的是 t+1 天股價的漲跌狀態。
  • 3. self.test_case :在 t 末交易日的基礎行情數據,作爲輸入端,用於模型訓練完成後,對第二天的漲跌進行預測。

(完整的數據預處理代碼詳見 DC.py 文件)

>> SVM建模 <<

機器學習中有諸多有監督學習算法,SVM是比較常見的一種,本例採用SVM算法進行建模。關於SVM的理論原理本篇不做詳述,以下僅從實踐角度進行建模介紹。

先貼一段建模、訓練並進行預測的代碼大家感受一下:)

model = svm.SVC()               # 建模
model.fit(train, target)        # 訓練
ans2 = model.predict(test_case) # 預測

三行代碼,讓人想起了把大象裝冰箱分幾步的冷笑話……

不過這側面也說明Python在數據挖掘方面的強大之處:簡單,方便,好用。

本例用的機器學習框架是scikit-learn。是個非常強大的算法庫,熟悉算法原理的朋友可以查閱官方API文檔,可修改模型參數,進一步調優模型;亦可嘗試其他算法比如決策樹,邏輯迴歸,樸素貝葉斯等。

(完整的SVM建模代碼詳見 SVM.py 文件)

最後,我們雖然順利建模並作出預測,但仍面對兩個主要問題:1.模型預測能力如何?或者說該如何評估一個模型的質量?2.該如何結合模型進行倉位管理?風險如何?如何量化?

請關注下期內容【機器量化分析(二)——構建投資組合】

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