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