用 Python 做股市資料分析(2)
每次你評價交易系統的時候,都要跟買入持有策略(SPY)進行比較。除了一些信託基金和少數投資經理沒有使用它,該策略在大多時候都是無敵的。有效市場假說強調沒有人能戰勝股票市場,所以每個人都應該購入指數基金,因為它能反應整個市場的構成。SPY是一個交易型開放式指數基金(一種可以像股票一樣交易的信託基金),它的價格有效反映了S&P 500中的股票價格。買入並持有SPY,說明你可以有效地匹配市場回報率而不是戰勝它。
下面是SPY的資料,讓我們看看簡單買入持有SPY能得到的回報:
Python12 | spyder=web.DataReader("SPY","yahoo",start,end)spyder.iloc[[0,-1],:] |
Open | High | Low | Close | Volume | Adj Close | |
---|---|---|---|---|---|---|
Date | ||||||
2010-01-04 | 112.370003 | 113.389999 | 111.510002 | 113.330002 | 118944600 | 99.292299 |
2016-09-01 | 217.369995 | 217.729996 | 216.029999 | 217.389999 | 93859000 | 217.389999 |
1234 | batches=1000000//np.ceil(100*spyder.ix[0,"Adj Close"])# Maximum number of batches of stocks invested intrade_val=batches*batch*spyder.ix[0,"Adj Close"]# How much money is used to buy SPYfinal_val=batches*batch*spyder.ix[-1,"Adj Close"]+(1000000-trade_val)# Final value of the portfoliofinal_val |
1 | 2180977.0 |
12345 | # We see that the buy-and-hold strategy beats the strategy we developed earlier. I would also like to see a plot.ax_bench=(spyder["Adj Close"]/spyder.ix[0,"Adj Close"]).plot(label="SPY")ax_bench=(bk["Portfolio Value"].groupby(level=0).apply(lambdax:x[-1])/1000000).plot(ax=ax_bench,label="Portfolio")ax_bench.legend(ax_bench.get_lines(),[l.get_label()forl inax_bench.get_lines()],loc='best')ax_bench |
買入持有SPY比我們當前的交易系統好——我們的系統還沒有考慮不菲的交易費用。考慮到機會成本和該策略的消耗,我們不應該用它。
怎樣才能改進我們的系統呢?對於初學者來儘量多樣化是一個選擇。目前我們所有的股票都來自技術公司,這意味著技術型公司的不景氣會反映在我們的投資組合上。我們應該設計一個可以利用空頭頭寸和熊市的系統,這樣不管市場如何變動,我們都可以盈利。我們也可以尋求更好的方法預測股票的最高期望價格。但是不論如何我們都需要做得比SPY更好,不然由於我們的系統會自帶機會成本,是沒用的。
其他的基準策略也是存在的。如果我們的系統比“買入持有SPY”更好,我們可以進一步跟其他的系統比較,例如:
(我最初在這裡接觸到這些策略)基本準則仍然是:不要使用一個複雜的,包含大量交易的系統如果它贏不了一個簡單的交易不頻繁的指數基金模型。(事實上這個標準挺難實現的)
最後要強調的是,假設你的交易系統在回溯測試中打敗了所有的基準系統,也不意味著它能夠準確地預測未來。因為回溯測試容易過擬合,它不能用於預測未來。
結論
雖然講座最後的結論不是那麼樂觀,但記住有效市場理論也有缺陷。我個人的觀點是當交易更多依賴於演算法的時候,就更難戰勝市場。有一個說法是:信託基金都不太可能戰勝市場,你的系統能戰勝市場僅僅是一個可能性而已。(當然信託基金表現很差的原因是收費太高,而指數基金不存在這個問題。)
本講座只簡單地說明了一種基於移動平均的交易策略。還有許多別的交易策略這裡並沒有提到。而且我們也沒有深入探討空頭股票和貨幣交易。特別是股票期權有很多東西可以講,它也提供了不同的方法來預測股票的走向。你可以在Derivatives Analytics with Python: Data Analysis, Models, Simulation, Calibration and Hedging書中讀到更多的相關內容。(猶他大學的圖書館有這本書)
另一個資源是O’Reilly出的Python for Finance,猶他大學的圖書館裡也有。
記住在股票裡面虧錢是很正常的,同樣股市也能提供其他方法無法提供的高回報,每一個投資策略都應該是經過深思熟慮的。這個講座旨在拋磚引玉,希望同學們自己進一步探討這個話題。
作業
問題1
建立一個基於移動平均的交易系統(不需要止損條件)。選擇15支2010年1月1日之前上市的股票,利用回溯測試檢驗你的 系統,並且SPY基準作比較,你的系統能戰勝市場嗎?
問題2
在現實中每一筆交易都要支付一筆佣金。弄明白如何計算佣金,然後修改你的backtes()函式,使之能夠計算不同的佣金模式(固定費用,按比例收費等等)。
我們現在的移動平均交匯點分析系統在兩條平均線交叉的時候觸發交易。修改系統令其更準確:
當你完成修改之後,重複問題1,使用一個真實的佣金策略(從交易所查)來模擬你的系統,同時要求移動平均差異達到一定的移動標準差再激發交易。
問題3
我們的交易系統無法處理空頭股票。空頭買賣的複雜性在於損失是沒有下限的(多頭頭寸的最大損失等於購入股票的總價格)。學習如何處理空頭頭寸,然後修改backtest()使其能夠處理空頭交易。思考要如何實現空頭交易,包括允許多少空頭交易?在進行其他交易的時候如何處理空頭交易?提示:空頭交易的量在函式中可以用一個負數來表示。
完成之後重複問題1,也可以同時考慮問題2中提到的因素。
相關推薦
用 Python 做股市資料分析(2)
每次你評價交易系統的時候,都要跟買入持有策略(SPY)進行比較。除了一些信託基金和少數投資經理沒有使用它,該策略在大多時候都是無敵的。有效市場假說強調沒有人能戰勝股票市場,所以每個人都應該購入指數基金,因為它能反應整個市場的構成。SPY是一個交易型開放式指數基金(一種可以像股票一樣交易的信託基金),它的價格
用Python做股市資料分析(一)
AAPL GOOG MSFT Date 2016-01-04 1.000000 1.000000 1.000000 2016-01-05 0.974941 1.000998 1.004562 2016-01-06 0.955861 1.002399 0.986314 201
循序漸進:用python做金融量化分析(二)一條移動平均線策略系統建立
在前言中我們講了些基礎知識,這一節正式開始從最簡單的移動平均線講起,移動平均線是在趨勢行情中應用最廣泛的策略,移動平均線有簡單算術平均線,指數平均線,加權平均線,還可以分為一條均線,兩條均線,三條均線策略等等,在這裡我們
小白學 Python 資料分析(2):Pandas (一)概述
人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 概覽 首先還是幾個官方連結放一下: Pandas 官網:https://pandas.pydata.org/ Pandas 中文網:https://www.pypandas.cn/ Pandas Githu
註冊會計師帶你用Python進行探索性風險分析(一)
專 欄 ❈Rho,Python中文社群專欄作者,現居深圳。知乎專欄地址:https://zhuanlan.zhihu.com/BecomingaDataScientist❈ 專案介紹 所謂探索性資料分析(Exploratory Data Analysis,以下簡稱EDA),是指對已有的資料(特別是調查
用python處理Excel文件(2)——用xlsxwriter模組寫xls/xlsx文件
本文主要總結一下如何使用xlsxwriter模組來自動化生成和處理Excel文件。 簡單用法demo # !/usr/bin/python # coding:utf-8 # xlsxwriter的基本用法 import xlsxwriter # 1
python/pandas/numpy資料分析(七)-MultiIndex
data=Series(np.random.randn(10),index=[list('aaabbbccdd'),list('1231231223')]) data a 1 0.198134 2 0.657700 3 -0.98
用Apache Spark進行大資料處理之用Spark GraphX圖資料分析(6)
import org.apache.spark._ import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD import java.util.Calendar // 先匯入邊 val graph = GraphLoader.edgeL
spark快速大資料分析(2)
spark下載與入門spark shell其他shell工具只能使用單機的硬碟和記憶體來操作資料,而spark shell可以用來與分散式儲存在許多機器的記憶體或者硬碟上的資料進行互動,並且處理過程的分發由spark自動控制完成。spark支援許多語言版本,此處互動式shel
利用python做資料分析(六)-reindex
DataFrame.reindex(index=None, columns=None, **kwargs) reindex 函式的引數 引數 說明 method 插值填充方法 fill_value 引入的缺失資料值
利用python/pandas/numpy做資料分析(三)-透視表pivot_table
透視表,根據一個或多個鍵進行聚合,並根據行列上的分組鍵將資料分配到各個矩形區域中. import numpy as np data=pd.DataFrame(np.arange(6).reshape((2,3)), index
【Python實戰】Pandas:讓你像寫SQL一樣做資料分析(二)
1. 引言 前一篇介紹了Pandas實現簡單的SQL操作,本篇中將主要介紹一些相對複雜一點的操作。為了方便後面實操,先給出一份簡化版的裝置統計資料: 0 android NLL 387546520 2099457911 0 ios NLL 52877990 916421755 1 and
【Python實戰】Pandas:讓你像寫SQL一樣做資料分析(一)
1. 引言 Pandas是一個開源的Python資料分析庫。Pandas把結構化資料分為了三類: Series,1維序列,可視作為沒有column名的、只有一個column的DataFrame; DataFrame,同Spark SQL中的DataFrame一樣,其概念來自於R語言,為多column並sch
小白學 Python 資料分析(6):Pandas (五)基礎操作(2)資料選擇
人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 小白學 Python 資料分析(2):Pandas (一)概述 小白學 Python 資料分析(3):Pandas (二)資料結構 Series 小白學 Python 資料分析(4):Pandas (三)資
小白學 Python 資料分析(9):Pandas (八)資料預處理(2)
人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 小白學 Python 資料分析(2):Pandas (一)概述 小白學 Python 資料分析(3):Pandas (二)資料結構 Series 小白學 Python 資料分析(4):Pandas (三)資
用實戰玩轉pandas資料分析(一)——使用者消費行為分析(python)
CD商品訂單資料的分析總結。根據訂單資料(使用者的消費記錄),從時間維度和使用者維度,分析該網站使用者的消費行為。通過此案例,總結訂單資料的一些共性,能通過使用者的消費記錄挖掘出對業務有用的資訊。對其他產品的線上消費資料分析有一定的借鑑價值,能達到舉一反三的效果。 訂單交易資料分析 [
用Python做數據分析 | 啟航
Python以前做數據分析,很多是用Oracle或者MySQL,通過SQL來完成查詢和統計數據分析,但是隨著數據量的增大,數據庫也跟隨著發展為NoSQL數據庫,由於數據庫及其底層技術架構的變化,數據分析算法也隨著變得復雜,而Python則實現這一任務適用的語言和工具。比如: In [36]: for i in
Python資料型別(2)列表和元組
列表和元組 列表和元組都屬於序列型別(sequence)。序列物件中的元素都是有序存放的,可以通過編號訪問其元素。兩者最大的區別在於列表是一種可變序列支援修改其元素,而元組是一種不可變序列,不能修改其元素。 列表 列表(list)是一種可變序列。列表用方括號定義,元素間用逗號隔開。列
資料探索(2)資料特徵分析
資料特徵分析 分佈分析 1.定量資料的分佈分析 對於定量變數而言,選擇組數和組寬是做頻率分佈分析時最主要的問題,一般按照以下步驟進行。 1)求極差 2)決定組距和組數 3)決定分店 4)列出頻率分佈表 5)繪製頻率分佈直方圖 遵循以下原則: 1)各組之間必須相互排斥 2)各組
matplotlib資料視覺化分析(2)-- numpy將陣列儲存到檔案
1 陣列以二進位制的格式儲存 np.save 和 np.load 是讀寫磁碟資料的兩個主要函式。預設情況下,陣列以未壓縮的原始二進位制格式儲存在副檔名為 npy 的檔案中,以陣列 a 為例: # coding:utf-8 import numpy as np