【Python量化投資】基於技術分析研究股票市場
一
金融專業人士以及對金融感興趣的業餘人士感興趣的一類就是歷史價格進行的技術分析。維基百科中定義如下,金融學中,技術分析是通過對過去市場資料(主要是價格和成交量)的研究預測價格方向的證券分析方法。
下面,我們著重對事後驗證過去市場資料的研究,而不是過多低關注對未來股價變動的預測。我們選取的研究目標是標準普爾(S&P)500指數,這是美國股票市場有代表性的指標,包括了許多著名公司的股票,代表著高額的市場資本,而且,該指數也具有高流動性的期貨和期權市場。
二
我們將從Web資料來源讀取歷史指數水平資訊,並未一個基於趨勢訊號的交易系統實現簡單的事後驗證。但是,首先需要資料才能開始工資,這裡我們主要靠pandas庫,因為NumPy庫比較常用,所以還是把該庫匯入。
(PS:除NumPy和SciPy,pandas也是Python的重要庫之一)
這裡DataReader函式來自pandas.io.data,可以用來從不同資料來源,尤其是雅虎財經網站上獲取金融資料。
這裡我們讀取了從2000年的第一個交易日到結束日期的S&P500指數事件序列資料,而且自動地用TimeStamp物件生成一個時間索引。
收盤價的時間序列圖如下:
所以先在pandas DataFrame物件上新增一個新列,用於兩個趨勢之間的差值。
此處的趨勢策略是基於兩個月(42個交易日)和一年(252個交易日)的趨勢(也就是兩種期間指數水平的移動平均數)。Pandas可以高效地生成各個時間序列。
首先先生成趨勢資料:
三
現在資料已經已經完整,開始設計一條規則來生成趨勢訊號。規則如下:
買入訊號(多頭):
42天趨勢第一次高於252天趨勢SD點。
等待(持幣):
42天趨勢在252天趨勢的+/-SD點範圍內。
賣出訊號(空頭):
42天訊號第一次低於252天趨勢SD點。
Pandas數值運算通常以向量方式進行,這樣可以取兩列的全部差值:
在最後一個可用交易日上,42日趨勢線遠遠高於252趨勢線。儘管兩個趨勢列中的專案數量不相等,pandas通過在相應的指數位置放入NaN處理這種情況:
現在生成我們的投資機制,此處假定訊號閾值為50:
即在1489個交易日中,42日趨勢線高於252日趨勢線SD個點以上,1232個交易日中,42日趨勢線低於252日趨勢線SD個點以上。所以,如果短期趨勢線與長期趨勢線交叉,它很可能在持續一段時間,即所謂的投資機制。圖形如下:
四
至此,測試基於訊號投資策略所需的資料都已準備就緒。為簡化,假定投資者可以直接投資於指數或者直接做空指數,現實中要通過指數基金、交易所交易基金或者指數期貨完成。這也會造成一些交易成本。因為不打算頻繁交易,所以此處忽略交易成本。
根據投資機制,投資者可以選擇做空、做多市場指數,或者持幣觀望。這種簡化策略使我們只注意市場收益。當投資者做多時形成市場收益(1),做空時形成負的市場收益(-1),持幣時不行成任何市場收益(0)。所以,需要先計算對數收益率。其中,shift方法按照所需指數輸入項數量移動時間序列----這裡,每移動一個交易日,就能得到每日的對數收益率:
而基於趨勢的投資策略的收益,將Regime列乘以下一天的Returns列(用“昨天”的頭寸得出今天的收益):
所以比較指數累計持續收益和我們所用策略的累積持續收益即可: