Lean 是 QuantConnect 開源的一款非常強大的開源量化交易平臺,可以回測或運行Python或者C#寫的策略,并在代碼倉庫中內置了上百個C#和Python的策略算法。
這個開源的算法交易引擎,專為讓用戶方便輕松地進行策略研究、回測和實時交易而構建。它集成了常見的數據提供商和券商,因此還可以快速部署算法交易策略。
LEAN Engine 的核心是用 C# 編寫的;但它可以在 Linux、Mac 和 Windows 操作系統上無縫運行。它支持用 Python 3.6+ 或 C# 編寫的算法。
引擎分為許多模塊化部分,可以在不接觸其他文件的情況下對某個模塊進行擴展。
最重要的幾個模塊是:
- 結果處理 (IResultHandler)處理來自算法交易引擎的所有消息。決定應該發送什么,以及消息應該去哪里。結果處理系統可以將消息發送到本地 GUI 或 Web 界面。
- 數據源 (IDataFeed)連接并下載算法交易引擎所需的數據。從磁盤文件中讀取文件進行回測;實時交易則連接到一個流并生成數據對象。
- 事務處理 (ITransactionHandler)處理新的訂單請求;要么使用算法提供的模擬模型,要么使用實際券商。
- 實時事件管理 (IRealtimeHandler)生成實時事件 - 例如一天結束的事件。觸發對實時事件處理程序的回調。
- 算法狀態設置 (ISetupHandler)配置算法資金、投資組合和請求的數據。初始化所需的所有狀態參數。
這些都可以從 Launcher 項目中的 config.json 文件進行配置。
1.Leon 安裝教程
由于Leon是基于C#開發的,因此我推薦使用 Visual Studio 進行開發。
1、克隆項目。從 https://github.com/QuantConnect/Lean 克隆項目到本地(如果你網絡不通可在公眾號后臺回復 **Lean **下載)。
2、使用 Visual Studio 打開項目中的 QuantConnect.Lean.sln
3、點擊 生成 - 生成解決方案
4、點擊 F5 則可以運行程序。
如果你在生成解決方案的過程中遇到了類似于如下的錯誤:
請在工具 - NuGet包管理器 - 程序包管理器設置 中 添加如下的源, 名字任取,鏈接對了就行: https://api.nuget.org/v3/index.json
2.回測 Lean 內置的C#策略
Lean 中比較有意思的一點是,其所有C#策略算法都位于 QuantConnect.Algorithm.CSharp 中,所有的Python策略算法都位于 QuantConnect.Algorithm.Python 中:
如果你想回測C#的策略,你只需要修改 QuantConnect.Lean.Launcher 中的 config.json,將 QuantConnect.Algorithm.CSharp 中對應策略名稱,修改到 algorithm-type-name 字段對應的值中,如圖所示:
然后按 F5 運行程序,回測開始,此時會彈出一個cmd窗口,里面有本次回測的統計數據:
3. 回測 Lean 內置的 Python策略
如果你想要回測內置的Python策略,我們需要先指定Lean使用的Python環境位置:
1.打開系統變量(我的電腦-右鍵屬性-高級系統設置->環境變量->系統變量)
2.點擊新建變量,name為 PYTHONNET_PYDLL;value則為你的Python環境的dll文件所在文件夾,如我的為 G:Anaconda3python36.dll
3.在此Python環境中安裝Lean的依賴:
pip install pandas
pip install wrapt==1.11.2
然后在項目的 config.json 中需要多改幾個配置:
然后按F5進行回測,效果如下:
這些統計指標令人眼花繚亂,對于股票的回測我們只要重點關注這些即可:
- Total Trades: 總交易量
- Average Win: 平均盈利率
- Average Loss: 平均虧損率
- Compounding Annual Return: 復合年回報率
- Drawdown: 最大回撤率
- Expectancy: 期望值
- Net Profit: 凈利潤
- Sharpe Ratio: 夏普比率
- Probabilistic Sharpe Ratio: 概率性夏普比率
- Loss Rate: 失敗率
- Win Rate: 勝率
- Profit-Loss Ratio: 盈虧比
- Alpha: Alpha值
- Beta: Beta值
- Total Fees: 總手續費
其他的,按需關注即可。
4. Lean 策略是怎么寫的?
開始之前,讓我們先學習下 Lean 內置策略的寫法:
上滑查看更多代碼
from AlgorithmImports import *
class MACDTrendAlgorithm(QCAlgorithm):
def Initialize(self):
'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
self.SetStartDate(2004,1,1)#Set Start Date
self.SetEndDate(2015,1,1)#Set End Date
self.SetCash(100000)#Set Strategy Cash
# Find more symbols here: http://quantconnect.com/data
self.AddEquity("SPY", Resolution.Daily)
# define our daily macd(12,26) with a 9 day signal
self.__macd =self.MACD("SPY",12,26,9, MovingAverageType.Exponential, Resolution.Daily)
self.__previous = datetime.min
self.PlotIndicator("MACD", True,self.__macd,self.__macd.Signal)
self.PlotIndicator("SPY",self.__macd.Fast,self.__macd.Slow)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
# wait for our macd to fully initialize
if not self.__macd.IsReady: return
# only once per day
if self.__previous.date() ==self.Time.date():return
# define a small tolerance on our checks to avoid bouncing
tolerance =0.0025
holdings =self.Portfolio["SPY"].Quantity
signalDeltaPercent = (self.__macd.Current.Value -self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value
# if our macd is greater than our signal, then let's go long
if holdings <=0and signalDeltaPercent >tolerance:# 0.01%
# longterm says buy as well
self.SetHoldings("SPY",1.0)
# of our macd is less than our signal, then let's go short
elif holdings >=0 and signalDeltaPercent < -tolerance:
self.Liquidate("SPY")
self.__previous =self.Time
可以看到,其實它和Backtrader的寫法相差無幾,Initialize 函數設置基本的回測參數,如:
- self.SetStartDate: 回測起始時間
- self.SetEndDate: 回測結束時間
- self.setCash: 回測資金
- self.AddEquity: 回測對象(Resolution.Daily 是指按日回測)
- self.PlotIndicator: 繪圖時添加指標
而 onData 函數則會在每個數據點上做操作,如果是日線,則每天的數據都會流入到這個函數并運行一遍。因此 onData 就是算法分析的主邏輯。
在這里,你可以檢查需要的指標是否已經準備完畢,因為可能存在一些滯后性指標在回測剛開始的時候并沒有對應的值;此外,在日線的情況下,你還可以檢測上一個數據點是不是和這個點在同一天上,如果是的話則不作任何操作返回:
if not self.__macd.IsReady: return
if self.__previous.date() == self.Time.date(): return
然后就是核心的買入賣出邏輯:
tolerance = 0.0025
holdings = self.Portfolio["SPY"].Quantity
signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value
# if our macd is greater than our signal, then let's go long
if holdings <= 0 and signalDeltaPercent > tolerance: # 0.01%
# longterm says buy as well
self.SetHoldings("SPY", 1.0)
# of our macd is less than our signal, then let's go short
elif holdings >= 0 and signalDeltaPercent < -tolerance:
self.Liquidate("SPY")
self.__previous = self.Time
如果我持倉的股數<=0, 且信號值大于我設定的閾值,則將我 資產的1% 買入這只股票。這里和backtrader最大的不同,買入是以資產的百分比為單位的動態買入。當然,你也可以使用限定數量的買入方式:
self.LimitOrder("IBM", 100, self.Securities["IBM"].Price)
如果持倉股市>=0, 且觸發賣出信號,則進行清倉操作:
elif holdings >= 0 and signalDeltaPercent < -tolerance:
self.Liquidate("SPY")
如果你不希望全部清倉,也可以使用 SetHoldings 來調整倉位。
可以看到,Lean相對于Backtrader有更靈活的倉位管理方式,甚至能夠進行自動倉位調整、構建投資組合、實時交易等等。而且針對一些比較復雜的策略,你還可以用C#而不是Python來編寫以提高運行速度。
-
WINDOWS
+關注
關注
4文章
3567瀏覽量
89115 -
操作系統
+關注
關注
37文章
6889瀏覽量
123595 -
開源
+關注
關注
3文章
3398瀏覽量
42643 -
python
+關注
關注
56文章
4807瀏覽量
84945
發布評論請先 登錄
相關推薦
評論