用Python做股市數據分析(二)


本文由 伯樂在線 - 小米雲豆粥 翻譯。未經許可,禁止轉載!
英文出處:Curtis Miller。歡迎加入翻譯組

這篇博文是用Python分析股市數據系列兩部中的第二部,內容基於我在猶他大學 數學3900 (數據科學)的課程 (閱讀第一部分)。在這兩篇博文中,我會討論一些基礎知識,包括比如如何用pandas從雅虎財經獲得數據, 可視化股市數據,平均數指標的定義,設計移動平均交匯點分析移動平均線的方法,回溯測試和 基准分析法。這篇文章會討論如何設計用移動平均交匯點分析移動平均線的系統,如何做回溯測試和基准分析,最后留有一些練習題以饗讀者。

注意:本文僅代表作者本人的觀點。文中的內容不應該被當做經濟建議。我不對文中代碼負責,取用者自己負責

交易策略

在特定的預期條件達成時一個開放頭寸會被關閉。多頭頭寸表示交易中需要金融商品價格上升才能產生盈利,空頭頭寸表示交易中需要金融商品價格下降才能產生盈利。在股票交易中,多頭頭寸是牛市,空頭頭寸是熊市,反之則不成立。(股票期權交易中這個非常典型)

例如你在預計股價上漲的情況下購入股票,並計划在股票價格上漲高於購入價時拋出,這就是多頭頭寸。就是說你持有一定的金融產品,如果它們價格上漲,你將會獲利,並且沒有上限;如果它們價格下降,你會虧損。由於股票價格不會為負,虧損是有限度的。相反的,如果你預計股價會下跌,就從交易公司借貸股票然后賣出,同時期待未來股票價格下降后再低價買入還貸來賺取差額,這就是空頭股票。如果股價下跌你會獲利。空頭頭寸的獲利額度受股價所限(最佳情況就是股票變得一文不值,你不用花錢就能將它們買回來),而損失卻沒有下限,因為你有可能需要花很多錢才能買回股票。所以交換所只會在確定投資者有很好的經濟基礎的情況下才會讓他們空頭借貸股票。

所有股民都應該決定他在每一股上可以冒多大的風險。比如有人決定無論什么情況他都不會在某一次交易中投入總額的10%去冒險。同時在交易中,股民要有一個撤出策略,這是讓股民退出頭寸的各種條件。股民也可以設置一個目標,這是導致股民退出頭寸的最小盈利額。同樣的,股民也需要有一個他能承受的最大損失額度。當預計損失大於可承受額度時,股民應該退出頭寸以避免更大損失(這可以通過設置停止損失委托來避免未來的損失)。

我們要設計一個交易策略,它包含用於快速交易的交易激發信號、決定交易額度的規則和完整的退出策略。我們的目標是設計並評估該交易策略。

假設每次交易金額占總額的比例是固定的(10%)。同時設定在每一次交易中,如果損失超過了20%的交易值,我們就退出頭寸。現在我們要決定什么時候進入頭寸,什么時候退出以保證盈利。

這里我要演示移動平均交匯點分析移動平均線的方法。我會使用兩條移動平均線,一條快速的,另一條是慢速的。我們的策略是:

  • 當快速移動平均線和慢速移動線交匯時開始交易
  • 當快速移動平均線和慢速移動線再次交匯時停止交易

做多是指在快速平均線上升到慢速平均線之上時開始交易,當快速平均線下降到慢速平均線之下時停止交易。賣空正好相反,它是指在快速平均線下降到慢速平均線之下時開始交易,快速平均線上升到慢速平均線之上時停止交易。

現在我們有一整套策略了。在使用它之前我們需要先做一下測試。回溯測試是一個常用的測試方法,它使用歷史數據來看策略是否會盈利。例如這張蘋果公司的股票價值圖,如果20天的移動平均是快速線,50天的移動平均是慢速線,那么我們這個策略不是很掙錢,至少在你一直做多頭頭寸的時候。

下面讓我們來自動化回溯測試的過程。首先我們要識別什么時候20天平均線在50天之下,以及之上。

apple['20d-50d'] =apple['20d'] -apple['50d']
apple.tail()
Open High Low Close Volume Adj Close 20d 50d 200d 20d-50d
Date
2016-08-26 107.410004 107.949997 106.309998 106.940002 27766300 106.940002 107.87 101.51 102.73 6.36
2016-08-29 106.620003 107.440002 106.290001 106.820000 24970300 106.820000 107.91 101.74 102.68 6.17
2016-08-30 105.800003 106.500000 105.500000 106.000000 24863900 106.000000 107.98 101.96 102.63 6.02
2016-08-31 105.660004 106.570000 105.639999 106.099998 29662400 106.099998 108.00 102.16 102.60 5.84
2016-09-01 106.139999 106.800003 105.620003 106.730003 26643600 106.730003 108.04 102.39 102.56 5.65

我們將差異的符號稱為狀態轉換。快速移動平均線在慢速移動平均線之上代表牛市狀態;相反則為熊市。以下的代碼用於識別狀態轉換。

# np.where() is a vectorized if-else function, where a condition is checked for each component of a vector, and the first argument passed is used when the condition holds, and the other passed if it does not
apple["Regime"] = np.where(apple['20d-50d'] > 0, 1, 0)
# We have 1's for bullish regimes and 0's for everything else. Below I replace bearish regimes's values with -1, and to maintain the rest of the vector, the second argument is apple["Regime"]
apple["Regime"] = np.where(apple['20d-50d'] < 0, -1, apple["Regime"])
apple.loc['2016-01-01':'2016-08-07',"Regime"].plot(ylim = (-2,2)).axhline(y = 0, color = "black", lw = 2)

apple["Regime"].plot(ylim =(-2,2)).axhline(y =0, color ="black", lw =2)

apple["Regime"].value_counts()
 1    966
-1    663
 0     50
Name: Regime, dtype: int64

從上面的曲線可以看到有966天蘋果公司的股票是牛市,663天是熊市,有54天沒有傾向性。(原文中牛市和熊市說反了,譯文中更正;原文數字跟代碼結果對不上,譯文按照代碼結果更正)

交易信號出現在狀態轉換之時。牛市出現時,買入信號被激活;牛市完結時,賣出信號被激活。同樣的,熊市出現時賣出信號被激活,熊市結束時,買入信號被激活。(只有在你空頭股票,或者使用一些其他的方法例如用股票期權賭市場的時候這種情況才對你有利)

# To ensure that all trades close out, I temporarily change the regime of the last row to 0
regime_orig = apple.ix[-1, "Regime"]
apple.ix[-1, "Regime"] = 0
apple["Signal"] = np.sign(apple["Regime"] - apple["Regime"].shift(1))
# Restore original regime data
apple.ix[-1, "Regime"] = regime_orig
apple.tail()
Open High Low Close Volume Adj Close 20d 50d 200d 20d-50d Regime Signal
Date
2016-08-26 107.410004 107.949997 106.309998 106.940002 27766300 106.940002 107.87 101.51 102.73 6.36 1.0 0.0
2016-08-29 106.620003 107.440002 106.290001 106.820000 24970300 106.820000 107.91 101.74 102.68 6.17 1.0 0.0
2016-08-30 105.800003 106.500000 105.500000 106.000000 24863900 106.000000 107.98 101.96 102.63 6.02 1.0 0.0
2016-08-31 105.660004 106.570000 105.639999 106.099998 29662400 106.099998 108.00 102.16 102.60 5.84 1.0 0.0
2016-09-01 106.139999 106.800003 105.620003 106.730003 26643600 106.730003 108.04 102.39 102.56 5.65 1.0 -1.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM