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


作者|Lorenzo Ampil
編譯|VK
來源|Towards Data Science

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

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

這兩種類型的分析對我來說都是有意義的,我希望用它們來為我的交易提供信息;然而,我總是對一件主要的事情感到沮喪:

有許多可能的策略可以采取,但沒有系統的方法來選擇一個。實際上,大多數交易最終仍然是“直覺”決策,而不是由數據驅動的。

那么我們如何評估這些策略呢?我們可以通過比較從每種方法中獲得的預期投資回報率(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/


免責聲明!

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



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