只用3行Python回測你的交易策略

做者|Lorenzo Ampil
編譯|VK
來源|Towards Data Sciencepython

自從我開始學習投資,我接觸了不一樣的股票分析方法-技術分析和基本面分析。我甚至讀過不少關於這些技巧的書和文章。bash

簡言之,技術分析認爲,你能夠根據股票的歷史價格和成交量的變更來肯定買賣股票的正確時間。另外一方面,基本面分析認爲,你能夠根據公司財務報表中的基本信息來衡量股票的實際內在價值。框架

這兩種類型的分析對我來講都是有意義的,我但願用它們來爲個人交易提供信息;然而,我老是對一件主要的事情感到沮喪:機器學習

有許多可能的策略能夠採起,但沒有系統的方法來選擇一個。實際上,大多數交易最終仍然是「直覺」決策,而不是由數據驅動的。函數

那麼咱們如何評估這些策略呢?咱們能夠經過比較從每種方法中得到的預期投資回報率(ROI)來作到這一點。最好的方法是使用一種稱爲回測的方法來評估一種策略,即經過模擬過去使用它的狀況來評估它的表現。性能

如今,已經有不少回測框架,可是其中大多數都須要高級的編碼知識。一個簡單的helloworld實現一般須要多達30行代碼。學習

爲了填補這個空白,我決定建立fastquant,目標是儘量簡單地將回測進行引入。使用fastquant,咱們只需3行代碼就能夠對交易策略進行回測!測試

在本文的其他部分,我將指導你如何經過Jollibee Food Corp.(JFC)的歷史數據來回測一個簡單的移動平均值交叉(SMAC)策略。優化

咱們開始吧!編碼

回測咱們的第一個策略

安裝fastquant

它就像使用pip安裝同樣簡單!

# 在你的終端上運行這個
pip install fastquant

# 或者,你能夠這樣從jupyter運行這個
!pip install fastquant

獲取股票數據

從fastquant導入get_stock_data函數,用於拉取Jollibee Food Corp.(JFC)2018年1月1日至2019年1月1日的庫存數據。注意,咱們有日期(dt)列和收盤價(close)的列。

from fastquant import get_stock_data
jfc = get_stock_data("JFC", "2018-01-01", "2019-01-01")
print(df.head())

#           dt  close
#   2019-01-01  293.0
#   2019-01-02  292.0
#   2019-01-03  309.0
#   2019-01-06  323.0
#   2019-01-07  321.0

回測你的交易策略

利用fastquant的回測功能和Jollibee Food Corp.(JFC)的歷史股票數據,對一種簡單的移動平均交叉策略(SMAC)進行回測。

在SMAC策略中,fast_period指用於快速移動平均值的時段,而slow_period指用於慢速移動平均值的時段。

當快速移動平均線從下方越過慢速移動平均線時,這被認爲是一個「買入」信號,而若是它從上方越過到下方,這被認爲是「賣出」信號。

首先,讓咱們分別將快週期和慢週期初始化爲15和40。

你應該在日誌底部看到下面的最終投資組合價值。這個值能夠解釋爲你的投資組合在回測期結束時的價值(這裏是2019年1月1日)。

你獲得的「最終投資組合價值」和「初始投資組合價值」之間的差額,這將是基於回測的預期收益(在本例中爲PHP 411.83)。

from fastquant import backtest
backtest('smac', jfc, fast_period=15, slow_period=40)

# 起始價值: 100000.00
# 最終價值: 100411.83

把全部代碼放在一塊兒-用3行Python進行回測

下面的代碼展現瞭如何在3行python中執行上述全部步驟:

from fastquant import backtest, get_stock_data
jfc = get_pse_data("JFC", "2018-01-01", "2019-01-01")
backtest('smac', jfc, fast_period=15, slow_period=40)

# 起始價值: 100000.00
# 最終價值: 100411.83

改進SMAC策略

增長快週期和慢週期

這將說明了小的改變能夠很快地將一個成功的策略變成一個失敗的策略。在快速增加期和緩慢增加期分別增長到30和50以後,咱們的最終投資組合價值從100412 PHP降低到83947 PHP(減小16465 PHP)

backtest('smac', jfc, fast_period=30, slow_period=50)

# 起始價值: 100000.00
# 最終價值: 83946.83

減小慢週期,同時保持快週期不變

在這種狀況下,咱們的策略的性能實際上獲得了改善!咱們的最終投資組合價值從100412 PHP上升到102273 PHP(增長1861 PHP),以後將慢週期減小到35,並將快速週期保持在15。

backtest('smac', jfc, fast_period=15, slow_period=35)

# 起始價值: 100000.00
# 最終價值: 102272.90

下表比較了咱們3種SMAC策略的性能:

克服測試的侷限性

如今,這是否意味着咱們應該用最好的SMAC策略交易?也許尚未。

回測有至關多的侷限性,克服這些侷限性一般須要額外的步驟來增長咱們對回測結果和建議可靠性的信心。

如下是回測的兩個限制,以及克服這些限制的保障措施:

過擬合

這指的是你導出的「最佳參數」與前一個時間段的模式太吻合的狀況。這意味着,當你決定使用該策略時,你的策略預期盈利能力不會轉化爲實際盈利能力。

防止這種狀況最好是從樣本中測試你的策略,這相似於在機器學習中使用「測試集」。這樣作的目的是,當你想評估你的交易策略的盈利能力時,你須要保留一個測試數據。這樣,就很難過擬合參數,由於你沒有基於該數據集優化策略。

前瞻性誤差

這是因爲在回測期間利用在測試期間不可用的信息而產生的誤差。例如,你能夠在JFC上測試一個策略的有效性,假設你在JFC真正公開前一個月就已經知道它的財務表現(例如淨收入)。這會給你不可靠的信心,你的戰略可能會損失你不少錢。

在這種狀況下,要避免這種誤差,最好的方法之一就是完全驗證在回測策略時所作的假設。嚴格評估你的戰略,以及正確執行戰略所需的信息是值得的。


這些只是回測所帶來的衆多限制中的兩個。我確實打算寫一篇文章,在未來更詳細地討論這些,因此請繼續關注!

在解決了上述侷限性以後,咱們應該對咱們選擇的戰略更有信心;可是,請記住,雖然咱們能夠對咱們的戰略更有信心,但它在看不見的現實世界中的表現永遠不會百分之百肯定。

我建議,一旦你在現實世界中採用了一種策略,那麼就從相對較少的資金開始,而且只在該策略顯示出更爲一致的成功時增長它;不然,準備好在現實世界中證實它效果不佳的狀況下殺死它。

爲fastquant提供更多策略

請記住,fastquant擁有與現有策略庫中相同數量的策略。到目前爲止,有8種策略可供選擇——包括簡單移動平均交叉(SMAC)、相對強度指數(RSI),甚至是基於情緒分析的策略!

正如我在本文介紹中提到的,有大量不一樣的策略能夠應用於交易。感謝你閱讀本文

原文連接:https://towardsdatascience.com/backtest-your-trading-strategy-with-only-3-lines-of-python-3859b4a4ab44

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索