從程序員視角理解量化交易
量化交易屬于人工智能的一個應(yīng)用分支,它利用計(jì)算機(jī)強(qiáng)大運(yùn)算能力,用數(shù)學(xué)模型來模仿人的思維作出決策,通過數(shù)據(jù)建模、統(tǒng)計(jì)學(xué)分析、程序設(shè)計(jì)等工具從股票、債券、期貨的歷史數(shù)據(jù)分析中得到大概率下獲利的交易策略。
這么說有些官方,聽起來有些繞口,其實(shí)往簡單地說就是如何管理輸贏的概率,如何幫助我們做出準(zhǔn)確的決策,比如像玩德州撲克牌那樣,當(dāng)你持有的牌可以掌握勝算時便跟進(jìn),否則便蓋牌,沒贏錢的勝算咱們選擇不玩。
玩牌時勝算的概率在我們的大腦中時刻不停地計(jì)算著,而在量化交易中利用的是計(jì)算機(jī)、數(shù)學(xué)建模、程序設(shè)計(jì)這些更高級的手段,目的是為了高效快速地獲得勝算的概率,并依據(jù)概率去做出決策。
接下來我們用一個簡單的市場模型來介紹下量化交易的本質(zhì),這個模型是用Python實(shí)現(xiàn)的。win_rate為勝率、play_cnt為參與局?jǐn)?shù)、stock_num為股票數(shù)量、commission為手續(xù)費(fèi)。
假設(shè)我們投資的市場是一個具備短線交易特征的市場,可以不分晝夜的不停交易,而且還不需要交手續(xù)費(fèi)。那么我們的初始資金是1000元,每次隨機(jī)的買9個股票,如果有一半以上的股票漲了的話,我們暫定賺1元,否則一半以上的股票跌了,我們就虧一元。由于我們是隨機(jī)買的,那么贏錢的概率為50%。我們邀請50個人參與1000局看下效果:
結(jié)果還不錯,虧錢的人和賺錢的人基本一半一半,符合零和游戲的特征。不過市場要經(jīng)營是需要有收入的,那么就需要對交易收取手續(xù)費(fèi),為了更直觀的比較出手續(xù)費(fèi)對交易的影響,我們假定每次交易的手續(xù)費(fèi)為0.1元。我們邀請50個人參與1000局看下效果:
很不幸的是零和游戲變成了負(fù)和游戲,沒有一個人是賺錢的,大家都虧錢了,當(dāng)局?jǐn)?shù)再增大以后的結(jié)局一定是血本無歸。市場是一定會有手續(xù)費(fèi)的,那我們就這么心甘情愿的當(dāng)韭菜嗎?
如果我們想盈利的話就只能期待每局上漲的概率大于50%時才參與,否則不參與就不會虧錢了,并且每局贏的錢要比虧的錢多。其實(shí)這些需求映射到量化交易之中就是策略回測、倉位管理、止盈止損這些功能。那么我們改變概率這個因子,將它放大到55%,我們邀請50個人參與1000局看下效果:
看來結(jié)果還不錯,只要增加盈利的概率,就可以在市場中獲得收益。其實(shí)股票交易和玩一個游戲、做一個項(xiàng)目理念上是相通的,需要章法、需要制定策略,否則就和拋硬幣賭博一樣的,用量化交易可以幫助我們管理好概率,更理性的去下單!因此通過量化交易管理虧盈的概率,能夠更理性的將股票投資作為理財(cái)?shù)囊粋手段。
也許大家會覺得以上的市場模型每次都是獨(dú)立事件,概率上沒有連續(xù)性。股票和期貨市場的每次下注的結(jié)果是有連續(xù)性的,并不是純隨機(jī)的獨(dú)立事件。事實(shí)上我們真的不能確定明天的具體價格,不過量化交易的精髓在于,它能從歷史數(shù)據(jù)中得到大概率下獲利的策略。
有研究稱股票每天的價格變動就像醉漢行走一樣不可預(yù)知,那么我們假設(shè)一名喝醉了酒的醉漢,從一個路燈下開始漫無目的地行走,每一步即可能前進(jìn)也可能后退也可能拐彎。那么經(jīng)過一定時間之后,這名醉漢的位置在哪里呢?
為了便于理解,我們將醉漢的移動簡化為一維的移動,規(guī)定他只能在一條直線上隨機(jī)前進(jìn)或者后退。我們使用numpy.random.randint()函數(shù)來產(chǎn)生2000個隨機(jī)數(shù),作為隨機(jī)游走的路線,實(shí)現(xiàn)代碼如下所示:
draws = np.random.randint(0, 2, size=2000)
然后使用matplotlib.pyplot.plot()函數(shù)繪制出醉漢從0軸開始隨機(jī)游走2000步的模擬軌跡圖形,如圖所示:
由于醉漢的每一步都是完全隨機(jī)的,因此他最終準(zhǔn)確的位置無法被預(yù)測出,就像每天的股票價格變動一樣是不可預(yù)知的。但是,量化交易會從統(tǒng)計(jì)學(xué)的角度去分析問題,我們用1000次隨機(jī)漫步來模擬醉漢從0軸開始1000次隨機(jī)游走2000步的模擬軌跡圖形,如圖所示:
從統(tǒng)計(jì)學(xué)的角度來看,這名醉漢最終的位置的概率分布卻是可以計(jì)算出來的。圖中我們直觀地觀察出隨機(jī)游走的發(fā)展情況,每一條淡淡的藍(lán)線就是一次模擬,橫軸為行走的步數(shù),縱軸表示離開起始點(diǎn)的位置。藍(lán)色越深,就表示醉漢在對應(yīng)行走了對應(yīng)的步數(shù)之后,出現(xiàn)在此位置的概率越大,可見隨著醉漢可能出現(xiàn)的位置的范圍不斷變大,但是距離起始點(diǎn)越遠(yuǎn)的位置概率越小。
于是我們聯(lián)想到正態(tài)分布。正態(tài)分布描述的是某件事出現(xiàn)不同結(jié)果的概率分布情況,它的概率密度曲線的形狀是兩頭低,中間高,左右對稱呈鐘型,與我們模擬的隨機(jī)漫步圖很相似。
我們使用matplotlib.pyplot庫中的hist()函數(shù)將隨機(jī)漫步的位置繪制為直方圖。如圖所示:
從圖中的顯示可知醉漢的行走軌跡在一定意義上是符合正態(tài)分布的。正態(tài)分布現(xiàn)象在現(xiàn)實(shí)中意義重大,在自然界、人類社會、心理學(xué)等領(lǐng)域的大量現(xiàn)象中都服從或者近似服從正態(tài)分布,比如人們能力的高低,身高、體重等身體的狀態(tài),學(xué)生成績的好壞,人們的社會態(tài)度、行為表現(xiàn)等等。
數(shù)學(xué)的奇妙之處就在于,我們可以把不可預(yù)知性變?yōu)榭深A(yù)知。量化交易的精髓就是用數(shù)學(xué)公式來精確計(jì)算真實(shí)的概率分布,以應(yīng)對不確定性。
普及股票基礎(chǔ)知識及漲跌邏輯
股票是股份公司發(fā)行的所有權(quán)憑證,是股份公司為籌集資金而發(fā)行給各個股東作為持股憑證并借以取得股息和紅利的一種有價證券。每股股票都代表股東對企業(yè)擁有一個基本單位的所有權(quán)。
股票發(fā)行是在一級市場進(jìn)行的,投資者買賣交易的是二級市場,也稱股票交易市場,它是投資者之間買賣已發(fā)行股票的場所。二級市場為股票創(chuàng)造流動性,能夠迅速脫手換取現(xiàn)值。因?yàn)槟苜嶅X,所以這也是投資者熱衷于分析股票漲跌的原因。
關(guān)于股票漲跌的因素,其實(shí)驅(qū)動股票漲跌的因素?zé)o外乎這五個方面:公司自身的發(fā)展、市場估值變化、宏觀經(jīng)濟(jì)前景、行業(yè)發(fā)展環(huán)境、政治上的變化。
公司自身發(fā)展的因素是決定股票價值最基本的因素,主要取決于發(fā)行公司的經(jīng)營業(yè)績、資信水平、股息紅利派發(fā)狀況、領(lǐng)導(dǎo)者的決策、經(jīng)營管理情況、公司發(fā)展的前景、公司核心競爭力、公司的背景等。
市場估值變化受到投資者的動向的影響,包括交易的流動性、群體性交易情緒、市場熱錢的流向、大戶的意向和操縱等。
宏觀經(jīng)濟(jì)前景包括國家的財(cái)政狀況,經(jīng)濟(jì)的增速情況、通貨膨脹的情況、國家匯率的調(diào)整、世界經(jīng)濟(jì)的形式等。比如利率下降,存款準(zhǔn)備金率下調(diào),很多游資會從銀行轉(zhuǎn)向股市,股價往往會出現(xiàn)升勢;國家抽緊銀根,市場資金緊缺,利率上調(diào),股價通常會下跌。
行業(yè)發(fā)展環(huán)境主要包括行業(yè)在國民經(jīng)濟(jì)中地位的變更,這會引起國家支持力度的變化,行業(yè)的發(fā)展前景、所處發(fā)展階段、發(fā)展?jié)摿Α⒏偁幎龋屡d行業(yè)引來的沖擊等,以及上市公司在行業(yè)中所處的位置,經(jīng)營業(yè)績,經(jīng)營狀況,資金組合的改變及領(lǐng)導(dǎo)層人事變動等都會影響股票的價格。
政治變化是指國家的政策調(diào)整或改變,領(lǐng)導(dǎo)人更迭,國際政治的變動,國家間發(fā)生戰(zhàn)事,某些國家發(fā)生勞資糾紛甚至罷工風(fēng)潮等導(dǎo)致股價波動。
市場中成千上萬的專業(yè)人士會對以上因素進(jìn)行詳細(xì)的分析,對于中小股民來說,技術(shù)指標(biāo)分析會比基本面分析似乎更靠譜些。因?yàn)橐灾行」擅竦哪芰κ呛茈y解讀政策層面實(shí)質(zhì)性是利好還是利空,利好多大,利空多大,也無法了解上市公司內(nèi)部運(yùn)營的實(shí)質(zhì)狀況,發(fā)布的公告對股價的影響有多大。而股價的走勢則涵蓋了所有的盤面信息,當(dāng)主力做多,表明有資金進(jìn)場,此時一切指標(biāo)都會走好,我們只需要跟著主力進(jìn)場就行,當(dāng)資金離場時一切指標(biāo)都會走壞,我們也只需要跟著主力離場即可。
如何用Python獲取股票數(shù)據(jù)
既然是金融數(shù)據(jù)的分析,那么第一步獲取數(shù)據(jù)很重要。目前,獲取股票數(shù)據(jù)的渠道有很多,而且基本上是免費(fèi)的,比如同花順、東方財(cái)富這些行情軟件,新浪財(cái)經(jīng)、騰訊財(cái)經(jīng)、和訊網(wǎng)這些門戶網(wǎng)站。
Python也有不少免費(fèi)的開源API可以獲取交易行情數(shù)據(jù),比如pandas專門處理金融數(shù)據(jù)模塊pandas-datareader、tushare、baostock等。這樣無需使用Python網(wǎng)絡(luò)爬蟲,可以節(jié)省不少精力。
這里推薦使用tushare獲取股票交易數(shù)據(jù),基本上tushare記錄了股票自上市之日起所有的日交易數(shù)據(jù),而baostock最早記錄的數(shù)據(jù)是2006年,總的來說tushare是目前分析國內(nèi)A股、期貨等比較好用的開源接口。
目前團(tuán)隊(duì)推出了Tushare Pro版本,這個版本相比于舊版本來說數(shù)據(jù)更加穩(wěn)定、質(zhì)量也更好了,使用的話需要先注冊獲取TOKEN憑證,不過舊版本仍然可以使用,只是團(tuán)隊(duì)不再維護(hù)數(shù)據(jù)獲取的接口。
下圖是使用pro.index_daily()接口獲取上證綜指2003年至2018年日交易數(shù)據(jù),結(jié)合可視化方法對指數(shù)走勢進(jìn)行分析。可以看到股指分別在2005-2007年和2014-2015年有兩波大牛市,然后又從高峰跌入谷底,目前處于下跌通道,期待下一次大牛市。
獲取到大量的股票數(shù)據(jù),可以用數(shù)據(jù)庫來高效地管理。目前流行的數(shù)據(jù)庫有Oracle、MySQL、MongoDB、Redis、SQLite……關(guān)于數(shù)據(jù)庫的選型通常取決于性能、數(shù)據(jù)完整性以及應(yīng)用方面的需求。
如果我們僅僅是用于本地的數(shù)據(jù)管理,無需多用戶訪問,數(shù)據(jù)容量小于2T,無需海量數(shù)據(jù)處理,關(guān)鍵是要求移植方便、使用簡單、處理迅速的話, SQLite確實(shí)是個很不錯的選擇。
Python 2.5.x 以上版本默認(rèn)內(nèi)置SQLite3,無需單獨(dú)安裝和配置,直接使用就行。
建立了本地SQLite數(shù)據(jù)庫,可以進(jìn)一步查詢和操作。比如查詢股價日漲幅超過5%的個股在19年1月至2月的分布。如下所示:
除了獲取行情數(shù)據(jù),我們也需要尋找宏觀經(jīng)濟(jì)、行業(yè)、公司相關(guān)的信息,這些信息是驅(qū)動股票漲跌的因素。關(guān)于這些信息,我們可以通過爬蟲的方式去各大網(wǎng)站和論壇獲取。這里我們列出一部分信息來源:
政府網(wǎng)站:國家統(tǒng)計(jì)局、工業(yè)和信息化部、財(cái)政部、中國人民銀行……
證券官方網(wǎng)站:上海證券交易所、深圳證券交易所、證監(jiān)會、證券業(yè)協(xié)會……
信息披露網(wǎng)站:東方財(cái)富網(wǎng)、巨潮資訊網(wǎng)……
股票論壇:點(diǎn)金投資家園、股天下、MACD股票論壇、創(chuàng)幻論壇、和訊股吧、東方財(cái)富股吧
量化交易的Python庫有哪些
量化交易的第三方Python庫是為了實(shí)現(xiàn)量化交易的需求而封裝的,以下是量化交易初級入門所設(shè)計(jì)到的一些功能和基礎(chǔ)工具。
我們對這些第三方庫的應(yīng)用場景簡單地做個介紹,后續(xù)大家在需要使用的時候,可以有側(cè)重地去查找相關(guān)資料:
Matplotlib——應(yīng)用于可視化繪圖
Bokeh——應(yīng)用于Web交互式可視化繪圖
WxPython——應(yīng)用于創(chuàng)建本地GUI界面
Urllib3——應(yīng)用于HTTP客戶端網(wǎng)絡(luò)請求
Numpy——應(yīng)用于科學(xué)計(jì)算
Pandas——應(yīng)用于金融數(shù)據(jù)分析
Statsmodels——應(yīng)用于統(tǒng)計(jì)模型和分析
TA-Lib——應(yīng)用于金融技術(shù)指標(biāo)計(jì)算
Tushare——應(yīng)用于財(cái)經(jīng)數(shù)據(jù)的獲取
Django——應(yīng)用于Web框架的搭建
scrapy——應(yīng)用于爬蟲框架的搭建
初學(xué)者入門的話可以先開發(fā)一個桌面版的股票行情界面:
關(guān)于這幅界面的實(shí)現(xiàn),我們簡單地介紹下方法,主要包括:
使用TuShare、Pandas庫來獲取金融數(shù)據(jù);
使用Pandas、Numpy庫對原始數(shù)據(jù)進(jìn)行規(guī)整化的處理;
使用Talib庫從原始數(shù)據(jù)計(jì)算出均線、MACD、KDJ指標(biāo);
使用Matplotlib庫實(shí)現(xiàn)股票技術(shù)指標(biāo)的可視化圖形;
使用WxPython庫實(shí)現(xiàn)GUI界面的交互;
再比如可以使用Urllib3、scrapy庫爬取東方財(cái)富網(wǎng)的財(cái)經(jīng)數(shù)據(jù),作為量化分析的基礎(chǔ)數(shù)據(jù)。
圖片描述
概述股票量化交易的基本過程
最后我們概述下量化交易的基本過程。當(dāng)然實(shí)際上這個過程并沒有以下流程圖顯示的那么簡單,這里只是讓大家有個整體的概念。
首先是把歷史行情、基本面信息、新聞資訊等數(shù)據(jù)進(jìn)行初步清洗和處理,而后輸入到量化模型中。
量化模型包括了數(shù)學(xué)建模、編程設(shè)計(jì)等工具所形成的交易策略,通過分析這些數(shù)據(jù)最終產(chǎn)生出交易的信號,比如買什么股、什么時候買、買多少、什么時候賣等信息。
分解量化模型可以看到模型是通過各種策略來實(shí)現(xiàn)的,常見的策略有均線策略、Alpha策略、布林帶策略、海龜策略、動量策略等等,也包括自主開發(fā)的策略,不過要良心的聲明下凡事公開的、用的人多的策略,基本也就不賺錢了,當(dāng)然并不影響我們學(xué)習(xí)這些策略從中借鑒其中的精髓,站在巨人的肩膀上看問題。
策略層再往下分解則是我們熟悉的Pyhon、Pandas、Matplotlib、Numpy、統(tǒng)計(jì)學(xué)、數(shù)學(xué)模型這些基礎(chǔ)工具。
關(guān)于上圖的回測階段,我們要提一下。當(dāng)我們制定了一個交易策略后,我們并不能立即將該策略應(yīng)用于實(shí)盤交易之中,原因很簡單,我們無法評價該策略的具體效果如何。對此,我們需要將策略基于一段歷史股票數(shù)據(jù)進(jìn)行模擬的買入和賣出,以驗(yàn)證交易策略的可行性,我們稱這個環(huán)節(jié)為“回測階段”。
在回測階段,策略的收益和風(fēng)險(xiǎn)是度量策略效果非常關(guān)鍵的兩個指標(biāo),比如我們將N日突破擇時策略應(yīng)用在華勝天成股票上時,可以通過直觀的圖形分析來了解下策略的執(zhí)行效果。如下所示: