本篇文章是”Python股市數(shù)據(jù)分析”兩部曲中的第一部分,內(nèi)容基于我在猶他州立大學(xué)MATH 3900 (Data Mining)課程上的一次講座。在這些文章中,我將介紹一些關(guān)于金融數(shù)據(jù)分析的基礎(chǔ)知識(shí),例如,使用pandas獲取雅虎財(cái)經(jīng)上的數(shù)據(jù),股票數(shù)據(jù)可視化,移動(dòng)均線,開(kāi)發(fā)一種均線交叉策略,回溯檢驗(yàn)以及基準(zhǔn)測(cè)試。第二篇文章會(huì)介紹一些實(shí)踐中可能出現(xiàn)的問(wèn)題,而本篇文章著重討論移動(dòng)平均線。
注意:本篇文章所涉及的看法、意見(jiàn)等一般性信息僅為作者個(gè)人觀點(diǎn)。本文的任何內(nèi)容都不應(yīng)被視為金融投資方面的建議。此外,在此提供的所有代碼均無(wú)法提供任何保證。選擇使用這些代碼的個(gè)人需自行承擔(dān)風(fēng)險(xiǎn)。
引言
高等數(shù)學(xué)與統(tǒng)計(jì)學(xué)已在金融領(lǐng)域應(yīng)用了一段時(shí)間。 在20世紀(jì)80年代以前,銀行業(yè)和金融界以”枯燥乏味”而聞名;投資銀行與商業(yè)銀行不同,銀行的主要職責(zé)在于處理”簡(jiǎn)單的”(至少與今天相比)金融商品,如貸款。里根政府的放松管制,再加上一大批數(shù)學(xué)天才,將整個(gè)行業(yè)從”枯燥的”銀行業(yè)務(wù)轉(zhuǎn)變成了今天這個(gè)樣子,而且,從那時(shí)起,金融便融入了其他自然學(xué)科,激勵(lì)著數(shù)學(xué)領(lǐng)域的研究與發(fā)展。比如,近期數(shù)學(xué)領(lǐng)域最大的成就之一,便是Black-Scholes公式的推導(dǎo),這一成果可用于股票期權(quán)(一種賦予持有人以特定價(jià)格向期權(quán)發(fā)行商購(gòu)買或出售股票權(quán)利的合約)的定價(jià)。可以說(shuō),在一定程度上,包括 Black-Scholes公式在內(nèi)的糟糕的統(tǒng)計(jì)學(xué)模型導(dǎo)致了2008年金融危機(jī)的爆發(fā)。
近幾年來(lái),為了在買賣金融資產(chǎn)的過(guò)程中賺取利潤(rùn),計(jì)算機(jī)科學(xué)也同高等數(shù)學(xué)一起,參與到了金融與貿(mào)易領(lǐng)域的變革當(dāng)中。最近幾年,計(jì)算機(jī)主導(dǎo)著貿(mào)易的進(jìn)行;算法相比人類能夠更快速地做出交易決策(如此之迅速,以至于在設(shè)計(jì)系統(tǒng)時(shí),光的傳導(dǎo)速度成為了約束)。此外,機(jī)器學(xué)習(xí)與數(shù)據(jù)挖掘技術(shù)在金融領(lǐng)域越來(lái)越受歡迎,而且以后也可能會(huì)繼續(xù)這樣下去。實(shí)際上,大部分的算法交易都屬于高頻交易(HFT)。盡管算法的表現(xiàn)可能超過(guò)人類,但是這項(xiàng)技術(shù)并不成熟,應(yīng)用的領(lǐng)域又充滿著高風(fēng)險(xiǎn)與動(dòng)蕩。高頻交易導(dǎo)致了2010年與2013年市場(chǎng)的閃電崩盤,其中,2013年的崩盤是由一條美聯(lián)社被黑客偽造的關(guān)于白宮受到攻擊的推文所引發(fā)的。
然而,本篇文章并不會(huì)討論如何使用糟糕的數(shù)學(xué)模型和交易算法使股市崩盤。相反,我打算向大家介紹一些用于處理和分析股市數(shù)據(jù)的Python工具。我還將討論移動(dòng)均線、如何使用移動(dòng)均線來(lái)構(gòu)建交易策略、如何在進(jìn)入倉(cāng)位時(shí)制定退出策略以及如何使用回溯檢驗(yàn)評(píng)估交易策略等方面的內(nèi)容。
聲明:這不是關(guān)于金融投資的建議!?。《?,我從未從事過(guò)交易員等工作(許多這方面的知識(shí)我都是在鹽湖城社區(qū)學(xué)院中一門為期一學(xué)期的股市交易課程中接觸到的)!這些只是單純的入門級(jí)知識(shí),并不足以讀者在股市中進(jìn)行實(shí)際的交易操作。股市有風(fēng)險(xiǎn),入市需謹(jǐn)慎!
獲取并可視化股票數(shù)據(jù)
使用pandas從雅虎財(cái)經(jīng)中獲取數(shù)據(jù)
在我們處理股票數(shù)據(jù)之前,我們首先需要通過(guò)一些可行的途徑獲取它們。股票數(shù)據(jù)可以從雅虎財(cái)經(jīng)、谷歌財(cái)經(jīng)或者其他數(shù)據(jù)源中獲得,而pandas可以輕松訪問(wèn)雅虎財(cái)經(jīng)、谷歌財(cái)經(jīng)以及其他來(lái)源中的數(shù)據(jù)。在本篇文章中,我們從雅虎財(cái)經(jīng)獲取股票數(shù)據(jù)。
以下代碼演示了直接創(chuàng)建一個(gè)包含股票信息的DataFrame對(duì)象的過(guò)程。(你可以在這里http://pandas.pydata.org/pandas-docs/stable/remote_data.html?spm=5176.100239.blogcont66878.21.CzC8e3了解更多關(guān)于遠(yuǎn)程數(shù)據(jù)訪問(wèn)的信息。)
讓我們簡(jiǎn)單介紹一下。開(kāi)盤價(jià)是指股票在交易日開(kāi)市時(shí)的股價(jià)(并不一定是前一交易日的收盤價(jià)格),最高價(jià)是指在交易日當(dāng)天股價(jià)的最高價(jià)格,最低價(jià)是指在交易日當(dāng)天股價(jià)的最低價(jià)格,收盤價(jià)是指股票在交易日收盤時(shí)的股價(jià)。交易量表示被交易股票的數(shù)量。調(diào)整收盤價(jià)是根據(jù)公司行為調(diào)整后的股票收盤價(jià)格。盡管我們認(rèn)為大多數(shù)股票的價(jià)格是由交易員設(shè)定的,但是股票分割(公司將當(dāng)前的一張股票拆分成價(jià)值一半的兩張股票)和派付股息(為每份股份支付公司紅利)仍然會(huì)影響到股票的價(jià)格,這些情況我們都應(yīng)該考慮進(jìn)來(lái)。
股票數(shù)據(jù)可視化
既然我們現(xiàn)在有了股票數(shù)據(jù),我們可以通過(guò)可視化的形式展示它。我首先演示如何使用matplotlib來(lái)可視化股票數(shù)據(jù)。注意,名為apple的DataFrame對(duì)象有一個(gè)很方便的方法plot(),這個(gè)函數(shù)使創(chuàng)建圖表更加容易。
折線圖是很不錯(cuò),但是每個(gè)日期都至少包含四個(gè)變量(開(kāi)盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)),我們希望有一些可視化的方法能夠同時(shí)展示這四個(gè)變量,而不是簡(jiǎn)單地畫四條折線。金融數(shù)據(jù)通常以日本蠟燭圖(即K線圖)的形式繪制,這種圖表最早在18世紀(jì)由日本米市商人命名。matplotlib可以繪制這樣的圖表,但操作起來(lái)比較復(fù)雜。
我實(shí)現(xiàn)了一個(gè)函數(shù),你可以更容易地在pandas數(shù)據(jù)框架中創(chuàng)建蠟燭圖,并使用它繪制我們的股票數(shù)據(jù)。(代碼基于這個(gè)例子,你可以在這里http://matplotlib.org/api/finance_api.html?spm=5176.100239.blogcont66878.23.nfKR7Q找到相關(guān)函數(shù)的文檔)
在蠟燭圖中,黑色蠟燭表示交易日當(dāng)天收盤價(jià)高于開(kāi)盤價(jià)(盈利),而紅色蠟燭表示交易日當(dāng)天開(kāi)盤價(jià)高于收盤價(jià)(虧損)。燭芯表示最高價(jià)與最低價(jià),蠟燭體則表示開(kāi)盤價(jià)與收盤價(jià)(顏色用來(lái)區(qū)分哪一側(cè)為開(kāi)盤價(jià),哪一側(cè)為收盤價(jià))。蠟燭圖在金融領(lǐng)域很受歡迎,根據(jù)圖表中蠟燭的形狀、顏色以及位置,技術(shù)分析中的一些策略可以使用它來(lái)制定交易策略。但在這里我不會(huì)介紹有關(guān)這類策略的內(nèi)容。
我們可能希望在同一張圖表中繪制多個(gè)金融商品的數(shù)據(jù);我們可能想要對(duì)比股票,將它們與市場(chǎng)進(jìn)行比較,或者看看其他證券,比如交易所交易基金(ETFs)。之后,我們可能還想看看如何根據(jù)一些指標(biāo),如移動(dòng)均線,來(lái)繪制金融商品。對(duì)于這種情況,你最好使用折線圖而不是蠟燭圖。(如何將多個(gè)蠟燭圖相互疊加在一起而不使圖表混亂?)
在下面的代碼中,我獲取了一些其他科技公司的股票數(shù)據(jù),并把它們的調(diào)整收盤價(jià)格繪制在了一起。
這張圖有什么問(wèn)題?盡管絕對(duì)價(jià)格很重要(昂貴的股票很難購(gòu)買,這不僅影響著這類股票的價(jià)格波動(dòng),也影響著你交易這類股票的能力),但是在交易過(guò)程中,相比絕對(duì)價(jià)格,我們更加關(guān)心資產(chǎn)的相對(duì)變化。谷歌的股票比蘋果和微軟的股票貴得多,這種差異使得蘋果和微軟股票的波動(dòng)看起來(lái)比實(shí)際情況小得多。
一種解決方案是在繪制圖表時(shí)使用兩種不同的尺度;一種尺度用于蘋果和微軟的股票,另一種尺度用于谷歌股票。
然而,一個(gè)”更好的”解決方案是,僅在圖表中繪制我們真正想要的信息:股票的回報(bào)。這就需要我們根據(jù)需求將數(shù)據(jù)轉(zhuǎn)換成更有用的形式。這里有幾種我們可以應(yīng)用的轉(zhuǎn)換。
一種方式是考慮股票自利息周期開(kāi)始以來(lái)的回報(bào)。換句話說(shuō),我們繪制:
正如我下面演示的這樣,這意味著轉(zhuǎn)換stocks對(duì)象中的數(shù)據(jù)。
這樣的圖表就更有用了?,F(xiàn)在,我們可以看到每只股票在周期開(kāi)始以來(lái)的盈利。而且,我們還能發(fā)現(xiàn)這些股票密切相關(guān);它們通常朝同一個(gè)方向發(fā)展,在其他的圖表中很難發(fā)現(xiàn)這樣的事實(shí)。
除此之外,我們還可以繪制每只股票在每一個(gè)交易日的變化。比如,我們可以通過(guò)比較第t天與第t+1天的價(jià)格來(lái)繪制股票增長(zhǎng)的百分比,公式如下:
但是這種變化也可以通過(guò)如下公式定義:
這些公式多少有些不同,可能會(huì)分析出不同的結(jié)論,但是還有另外一種對(duì)股票增長(zhǎng)建模的方法:對(duì)數(shù)差值。
(這里的log為自然對(duì)數(shù),我們的定義并不關(guān)心使用的是第t天與第t-1天的對(duì)數(shù)差值還是第t+1天與第t天的對(duì)數(shù)差值。)使用對(duì)數(shù)差值的好處在于,這種差值可以理解為股價(jià)的百分比變化,且不依賴于計(jì)算過(guò)程中分?jǐn)?shù)的分母。
我們可以通過(guò)如下方式獲取并繪制stocks對(duì)象中數(shù)據(jù)的對(duì)數(shù)差值:

你傾向于哪一種轉(zhuǎn)換?關(guān)注股票以往的盈利情況會(huì)使得證券的整體趨勢(shì)更加明顯。但是,在對(duì)股票的行為模式建模時(shí),更先進(jìn)的方法實(shí)際考慮的是交易日間股價(jià)的變化。因此,我們不應(yīng)該忽略這部分的信息。
移動(dòng)均線
圖表是很非常有用的。實(shí)際上,一些交易員做出的策略幾乎完全基于圖表(他們屬于”技術(shù)人員”,因?yàn)榛谠趫D表中查找模式的交易策略是被稱為技術(shù)分析的貿(mào)易規(guī)則的一部分)。現(xiàn)在,讓我們考慮如何才能找到股票的趨勢(shì)。
對(duì)于序列xt以及時(shí)刻t,q天均線表示過(guò)去q天股價(jià)的均值:也就是說(shuō),如果MAtq表示t時(shí)刻的q天均線,那么:
移動(dòng)均線平滑了數(shù)據(jù)序列,并有助于識(shí)別股市的發(fā)展趨勢(shì)。q值越大,移動(dòng)均線就越難反映序列xt中的短期波動(dòng)。這里的想法是,移動(dòng)均線過(guò)程能夠從”噪聲”中識(shí)別股市的發(fā)展趨勢(shì)。短期均線具有較小的q值,比較緊密地跟隨股票的趨勢(shì)發(fā)展,而長(zhǎng)期均線的q值較大,進(jìn)而使得均線對(duì)股票波動(dòng)的響應(yīng)較小,而且更加平穩(wěn)。
pandas提供了輕松計(jì)算移動(dòng)均線的功能。下面的代碼展示了這部分功能,我首先為蘋果股票創(chuàng)建了一條20天(1個(gè)月)均線,隨后,將其與股票數(shù)據(jù)一同繪制在圖表中。
注意滾動(dòng)均值是從什么時(shí)候開(kāi)始的。只有在積累了20天的交易日數(shù)據(jù)之后,我們才能計(jì)算股票的20天均線。這個(gè)限制對(duì)于長(zhǎng)期均線而言更加嚴(yán)重。如果我們想要計(jì)算股票的200天均線,我們需要多少蘋果公司的股票數(shù)據(jù)才行?在這里,我們將主要關(guān)注2016年的股票走勢(shì)。
你會(huì)注意到,移動(dòng)均線要比實(shí)際的股票數(shù)據(jù)平滑得多。此外,這是一個(gè)難以處理的標(biāo)志;股票需要在移動(dòng)均線的上方或下方,以便改變股票走勢(shì)的方向。因此,股票走勢(shì)越過(guò)移動(dòng)均線的情況表明了股票一種可能的走向,應(yīng)該引起我們的注意。
交易員通常對(duì)多條移動(dòng)均線感興趣,比如20天均線、50天均線以及200天均線。同時(shí)檢查多條移動(dòng)均線也很容易。
其中,20天均線對(duì)局部變化最為敏感,而200天均線對(duì)局部變化最不敏感。在這里,200天均線表明股票整體呈熊市行情:股票隨著時(shí)間的推移趨勢(shì)向下。20天均線有時(shí)呈熊市行情,而在其他時(shí)候呈牛市行情,預(yù)期股票會(huì)出現(xiàn)積極的波動(dòng)。你還可以看到,移動(dòng)均線的交叉表示著股票趨勢(shì)的變化。我們將這些交叉看作交易信號(hào)或指示器,表示金融證券正在改變趨勢(shì),我們可能從中獲取利潤(rùn)。
下周我將發(fā)布第二部分的文章,介紹如何基于移動(dòng)均線設(shè)計(jì)并測(cè)試一個(gè)交易策略。
更正:本篇文章的早期版本提到過(guò)算法交易是高頻交易的同義詞。正如評(píng)論所指出的,實(shí)際情況并不是這樣;算法也能用于處理非高頻率的交易。盡管高頻交易在算法交易中占很大比例,但二者并不相等。
文 | Curtis Miller
編譯 | 阿里云棲社區(qū)
CDA數(shù)據(jù)分析師考試相關(guān)入口一覽(建議收藏):
? 想報(bào)名CDA認(rèn)證考試,點(diǎn)擊>>>
“CDA報(bào)名”
了解CDA考試詳情;
? 想學(xué)習(xí)CDA考試教材,點(diǎn)擊>>> “CDA教材” 了解CDA考試詳情;
? 想加入CDA考試題庫(kù),點(diǎn)擊>>> “CDA題庫(kù)” 了解CDA考試詳情;
? 想了解CDA考試含金量,點(diǎn)擊>>> “CDA含金量” 了解CDA考試詳情;