孫麗穎
(中山大學南方學院,廣東 廣州 510970)
20世紀80年代,一些投資者開始利用計算機研究金融數據,并初顯成效。20世紀末,投資者把計算機技術進一步應用在金融數據分析上,進行模型設計,構建股票投資組合。這時,金融數據趨于規范化,在日漸復雜的數據分析過程中,產生了更多類型的因子和更多樣化的投資策略。量化投資是借助量化金融分析方法進行資產管理,量化金融分析方法是結合金融數據、個人經驗、數學模型和計算機技術的一種復雜金融建模的分析方法[1]。實現量化投資的方法多達數十種,Python、Matlab、SPSS、Eviews、Excel、SAS、R在量化界都是非常好用的工具,尤其是在數據分析方面。除Python外,其余幾個工具的優勢都體現在數據分析方面,而量化投資是一個系統性工程,數據分析只是其中的一部分,不是全部。根據GitHub官網統計,量化交易開源項目共145個,其中使用Python以外的技術進行開發的項目共70個,應用Python語言進行開發的多達75個。Python的開源性促使開發者開發了大量的庫和模塊,而這些庫和模塊又使很多外行人能夠輕松入手,反過來又促進了Python在該領域的發展。應用Python語言爬取數據,進行數據挖掘和深度案例分析,能夠使量化投資基本實現從技術分析到金融設計,實現系統性掌控。因此,采用Python驅動量化股票投資,對優化股票投資策略和規避投資風險具有十分重要的意義。
將Python要應用到量化投資交易中,其步驟如圖1-1所示。

圖1-1 股票量化交易應用模塊庫流程圖
第一階段是數據收集。數據收集是很多券商機構在做的業務,有影響力的模塊庫有Tushare和Windpy,其中Windpy是Wind公司開發的一個開源接口。國內的金融終端一般是Wind、iFind和Choice終端,這些終端軟件就是把企業和行業的數據收集到數據庫,進行深度分析,并稍加整理成表格,然后上傳到服務器中,方便客戶進行相關的數據分析,一般情況下客戶都需要付費來獲得數據。
第二階段是數據分析。NumPy用來存儲和處理多維數組和大型矩陣,搭配SciPy進行計算;Pandas解決時間序列;用Matplotlib進行2D繪圖從而實現數據可視化。Wind終端和Choice終端也有相關的業務在平臺上銷售,而該服務的購買者通常是一些尚未具備分析能力和資格的小型機構或行外人。
第三階段是策略研究。IPython是一個Python的交互式shell,能進行變量的自動補全和縮進,支持bash shell命令,內置了一系列有用的功能和函數;Jupyter可以對數據進行清理和轉換,進行數值模擬和統計建模等,是比較方便的策略研究工具;Zipline(國內公司開發的是RQalpha回測引擎)對真實交易系統的運轉進行模擬,利用歷史數據對投資策略進行回測檢驗;具體的策略便可以理解為Python代碼的執行。
第四階段是實盤交易。vn.py是基于Python的開源交易平臺開發框架;easytrader也是開源模塊庫,比較適合個人投資者。通俗來說,狹義的量化投資的應用意義到第三階段為止,關于第四步的實盤交易還是需要經過投資者參考過量化投資的模型后作出的決定。因為工具只是投資者進行決策的輔助,人才是真實交易的決定者。
需要說明的是,數據收集及案例中的模型,直接采用第三方平臺供應的API數據源;數據分析因避免代碼繁冗多雜,直接采用第三方平臺的庫和框架進行Python編程,其中BOLL指標案例的策略使用到了Signal框架。利用第三方平臺的意義及其最終達到的回測效果與純自建量化交易策略項目無異,也非常適合個人投資者入手。本文選取A股市場進行研究,選取樣本的原因是A股市場的數據有利于簡化代碼量。比如,在A股市場上進行交易,1手即為100股,而在港股市場上,不同的股票1手的股數不盡相同,有的1手是交易50股,有的1手是交易200股,這樣的數據可以簡化很多代碼量。
雖然Python實現股票量化交易分為4個階段,但具體操作起來,為了更貼合實際,通常可以解析為8個流程,即:獲取數據、數據分析挖掘、構建信號、構建策略、回測、策略分析、模擬交易和實盤交易。如圖1-2所示。一是獲取數據。包括獲取公司新聞數據、關聯數據,產業上下游、主營業務、所屬行業主題等數據,基本行情數據,高頻數據,股票 Level-1數據,股票Level-2數據、期貨Level-1數據等。
二是數據分析。數據分析挖掘采用傳統分析方法、新興大數據、機器學習和數據挖掘方法[2];
三是構建信號。在構建信號前進行數據處理、標準化、去極值、中性化,基礎信號的研究、分組回測、衰減、行業分布,將基礎信號合成復雜信號。
四是構建策略。構建策略模板要兼容不同標的指標函數和參數的策略,適用于股票、基金、期貨等金融資產,兼容日線、分鐘線的策略,方便好用的策略函數,獲取歷史行情、歷史持倉信息、調倉記錄等,支持各種訂單類型:止盈止損單、限價單、市價單。
五是回測測試。回測要符合歷史的真實行情,并相應的進行股票分紅送轉、除權除息處理,股票漲跌停處理,股票停復牌處理,市場沖擊,交易滑點、手續費、期貨保證金交易,大單分筆成交處理等;
六是策略分析。包括策略歸因、風險歸因、實時監控,訂單分析、成交分析、持倉分析、交易行為分析,多策略分析。
七是模擬交易。模擬交易需要接入實時行情、實時獲取成交回報,籃子交易、算法交易,支持撤單處理,實時監控、實時歸因分析。
八是實盤交易,實盤交易就是接入真實券商賬戶,緊緊跟隨市場行情,實時進行下單,同時實時獲取訂單收益回報。

圖1-2 股票量化交易流程圖
利用BOLL指標進行模擬回測,構造一個BOLL指標買賣策略,根據個人投資者的賬戶情況,設置賬戶初始資金為10萬元,策略背景與規則如下:
(1)如果收盤價上穿BOLL上軌,買入;如果收盤價下穿BOLL下軌,則開盤賣掉;(2)回測策略時間區間設定為2018年全年,股票池為“滬深300”,參考指標為“滬深300”;(3)資金賬戶初始資金10萬,類型為股票賬戶;(4)每次每只股票買20 000元左右,出現重復信號時不重復買入;(5)當買入信號的股票數量比資金多時,隨機挑選買入,每個交易日全倉操作。(6)策略需導入第三方庫Pandas,框架為Signal。
利用Python語言編輯策略代碼并運行回測,得到BOLL指標買賣策略收益回測結果,如圖2-1所示。

圖2-1 BOLL指標策略回測
策略回測結果顯示,2018年全年,滬深300指數漲幅為-25.9%,依據滬深300制定的BOLL策略收益率僅為-6.9%,BOLL指標買賣策略的模擬收益曲線較平緩,波動幅度明顯小于滬深300的收益率波動幅度,收益率相對穩定,在2018的熊市環境下,規避降低風險的效果顯著。可見,構建最簡單的量化交易策略仍然是可行的,大環境熊市的影響,暫時不對策略的好壞進行評價。這次進行對策略的可行性進行檢測,策略收益率已遠勝于滬深300指數。
以格雷厄姆的成長股內在價值投資法[3]來制定策略與BOLL指標策略不同,價值投資需要長時間的驗證,因此用最近3年為宜。
“價值投資之父”格雷厄姆在《聰明的投資者》中給出了一個對成長股內在價值進行估值的簡單公式:

策略將以這條公式作為交易規則,策略的背景與規則如下:
(1)價值=當期(正常)利潤×(8.5+ 兩倍的預期年增長率);(2)如果股票價格低于價值,則買入;如果股票價格高于價值,則賣出;(3)回測策略時間選取2016年1月1日至2019年1月1日,股票池為“滬深300”,參考指標為“滬深300”;(4)資金賬戶初始資金10萬,類型為股票賬戶;(5)倉位以每支個股的持倉權重為標準買入,每支個股持倉最高不超過10%,出現重復信號時不重復買入;(6)當買入信號的股票數量比資金多時,隨機挑選買入,每個月第1個交易日全倉進行調倉操作;(7)用了因子庫中的“EGRO”因子,5年收益增長率來代表預期年增長率。篩選出低估值,即股票市值小于其格雷厄姆估值的股票。
利用Python語言編輯策略代碼并運行回測,得到格雷厄姆成長股內在價值投資法策略收益回測結果,如圖2-2所示。

圖2-2 格雷厄姆成長股內在價值投資法策略回測
策略回測結果顯示,滬深300指數三年間的基準年化收益率為-7.1%,而策略線的年化收益率是4.0%,格雷厄姆成長股價值投資法策略的模擬收益曲線較平緩,波動幅度明顯小于滬深300的收益率波動幅度,收益率相對穩定,降低了部分投資風險,利用格雷厄姆的投資法制定的策略也是可行的。
綜上,兩個策略案例都證明了Python驅動的量化股票投資方案在提高收益率和規避風險方面的有效性,同時Python量化投資還可以通過回測指標分析進行個股篩選,對于個人投資者來說,是行之有效的投資工具。如果投資者能夠深入研究,調整參數指標,將更會適應中國市場,獲得更理想的收益。
從表面上看,一串代碼實現了提高股票組合的收益率和模擬收益曲線,其實事情遠不止這么簡單,Python真正驅動的是背后龐大的數據源,這也是利用第三方平臺對策略回測的原因。搭建數據庫需要一整套龐大的設備,其中不乏價格高昂的服務器和硬盤,耗資巨大,普通投資者不會在這些設備方面投入資金。在量化投資領域中常用的一個詞“因子”,因子就是經過人為的采集、編譯并存儲到數據庫中的一個數據集合。不同的公司或數據庫搭建者都會根據自己的偏好對因子進行命名,存儲在數據庫中,等到策略運行的時候再調用出來。隨著量化投資的發展,股票市場中很多數據都是可以被量化的,尤其是報表指標和技術指標,這些指標被制作成兩種因子:價值派指標因子和技術派指標因子。價值派指標因子系列的分支有:股指市值型因子,償債能力型因子,收益型因子,盈利能力型因子,運營能力型因子等。技術派指標因子系列下也派生出很多的分支,比如:成交量型因子,趨勢型因子,能量型因子,超買超賣型因子,均線型因子等[4]。另外,很多當初被認為不能進行量化的數據也被實現了量化,比如分析師預期型因子,還有股民熱度型因子。其中股民熱度型因子在其他地區的股票市場上是發展不了的,比如美股市場上的投資者就不會像A股投資者一樣,在論壇上每天都討論的熱火朝天。A股投資者能對市場產生較大的影響,同時又很喜歡到股吧論壇上討論自己看空看多,因此這些數據在A股市場上獨樹一幟地發展了起來,數據量足夠的龐大,不少機構便把它做成了股民熱度型因子。
量化投資界的重量級人物數學家詹姆斯·西蒙斯(James Simons),創造了“用公式打敗市場”的傳奇。由他在1989年創辦的基金成立至今已有30年時間,該基金年均35%的凈回報率,遠遠超過了年均回報率20%左右的股神巴菲特。如果每位個人投資者都做到他的一半,也就是利用量化投資創造年均17.5%的凈回報率,都很了不起了。很多傳統投資者認為美國與中國的投資環境和制度不同,量化投資不一定能為投資者帶來可觀的收益。其實學習了量化投資的知識便會發現,只需要在Python編程的時候引入不同的因子便可以了。的確,在美股中的量化策略不適用于A股,但參數是可調的,在A股市場中制作量化策略,可以引入股民熱度型因子,再設置適當的權重。如果半數以上的個人投資者能夠熟練運用Python進行量化股票組合投資,不僅能避過2018年跌跌不休的熊市,做得好的更能收獲可觀的收益。
Python驅動的股票量化投資模型中的各指標參數的選取是關鍵,需要龐大的數據資料,對參數反復修正,才會獲得更接近實際情況的參數。根據各種參數創建的子模型只有通過實踐數據和時間的檢驗才是成功的。如何使模型具有普遍的可理解性,簡化投資者操作使用,還需要反復驗證、修正、提煉、升華與定型。
大部分投資者運用量化投資自制策略時,都是在第三方平臺上創建量化交易策略的,Python編寫的策略代碼也存放在第三方平臺處。不論是某個商業平臺還是某個開源平臺,這都會使投資者的數據文件面臨泄露威脅等一系列數據信息安全性問題。然而,在量化投資的后期,隨著資金池不斷發展壯大,安全性就越來越受到重視,特別是對相關的策略代碼進行保護。投資者若想規避這種數據的安全性風險,需要自掏腰包創建數據庫,置辦機房、服務器等,這樣就會大幅度提高投資成本,需要更高的技術水平和管理水平。如果是發展到這個階段,可以對數據及其安全性進行規范化管理了。目前加密算法也有很多,最著名的是Hash算法。Hash算法普遍應用于世界各地,同時安全性能相當高,各大互聯網公司、銀行、區塊鏈等都在用。在Python中運用更是簡單易上手,直接導入Hashlib模塊即可,在設置訪問數據庫時添加Hash函數即可。
取得的上市公司財務數據具有滯后性,對數據的修正容易造成很難察覺的微小錯誤,終值又很難確定,只能使用初始值進行修正分析,這種基于初始財務數據的調整修正會對量化投資策略產生影響,進而影響選股結果。另外,量化投資策略的第四個階段是實盤交易,實盤交易時由于市場上不乏“灰犀牛”和“黑天鵝”,因此,要根據不同的市場外在因素,不斷地調整策略參數,維護成本比較高[5]。
做量化交易的投資者必需具備很強的編程能力和數學基礎,在開發策略時需要分析大量數據,不斷進行回測,從而優化模型。就需要投資者具備經濟學知識和思維,同時對金融市場有著獨特的見解作為理論支撐,而這些見解往往都是帶有主觀色彩的。因此,投資者在做出決策規則前,內心都有一個既定的主觀判斷腳本,在做決策時往往希望找到相關的數據支持。所以在制作量化投資決策時,應盡量剔除投資者主觀因素的影響。
Python編寫的代碼具有“簡單易上手”的特點。然而,簡潔性暴露了缺點,即不嚴謹。不嚴謹的語法在應用到現實生活中的時候,往往會出現一點點小問題。沒有人知道會出現什么問題,也許就是忽然某一天出現的這一點兒問題虧損了投資人的部分資金。算法上需要優化的便是速度,因為Python并不是底層技術,它是上層的解析性語言,執行起來比較慢。如果某只小市值股票的莊家A發現有個投資者B在利用量化投資做自家的股票,這個莊家A便利用他的資金優勢和硬件優勢,開啟機械式掛單,直接斷崖式拉低股價,以極小的速度差搶在B的前面下了賣單。由于B的量化程序的速度不夠快,所以股票未賣出,而價格又達到了策略設置好的割肉價格。于是,B的量化程序便無奈地掛出更低的賣價掛單,此時莊家便可以掛買單收獲籌碼了。解決這兩個問題有效的途徑就是算法上的優化,因此,投資者需要終身學習,學習一些相關的編程語言,比如匯編語言:C語言。利用Python進行量化程序的大部分策略定制工作,同時利用C語言進行執行決策,這樣,雙劍合璧,更能高效快速地運行,以彌補Python在算法上的缺點。
股票投資是有風險的,量化并不能降低風險,但卻能通過數學的方式體現出來。通過研究,首先,闡明了目前股市環境中運用量化投資的意義;其次,論述了基于Python的股票量化投資交易的程序;然后,構建了基于Python的量化股票投資策略,其中,設計的兩個策略分別是根據經典的BOLL指標和格雷厄姆的成長股選股法進行設計的,雖然進行了策略回測,但因為未來的市場環境具有不確定性,得出的結論仍需要通過后續的實盤操作來檢驗;最后,根據實際情況和未來可能發生的操作風險提出了運用Python量化股票投資的保障措施,包括:加強數據庫的規范化管理、考慮策略執行結果的風險、剔除量化投資的主觀色彩和不斷優化量化投資的算法。充分證明了個人投資者運用Python語言進行量化股票組合投資是可行的。尤其為在熊市下虧損嚴重的個人投資者,提供了更科學的投資方式及應用工具,對改變A股的投資環境也是十分有益的。