<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Lean — 優(yōu)秀好用的開(kāi)源量化交易平臺(tái)

          共 8533字,需瀏覽 18分鐘

           ·

          2021-10-27 12:55

          Lean 是 QuantConnect 開(kāi)源的一款非常強(qiáng)大的開(kāi)源量化交易平臺(tái),可以回測(cè)或運(yùn)行Python或者C#寫(xiě)的策略,并在代碼倉(cāng)庫(kù)中內(nèi)置了上百個(gè)C#和Python的策略算法。

          這個(gè)開(kāi)源的算法交易引擎,專(zhuān)為讓用戶(hù)方便輕松地進(jìn)行策略研究、回測(cè)和實(shí)時(shí)交易而構(gòu)建。它集成了常見(jiàn)的數(shù)據(jù)提供商和券商,因此還可以快速部署算法交易策略。


          LEAN Engine 的核心是用 C# 編寫(xiě)的;但它可以在 Linux、Mac 和 Windows 操作系統(tǒng)上無(wú)縫運(yùn)行。它支持用 Python 3.6+ 或 C# 編寫(xiě)的算法。

          引擎分為許多模塊化部分,可以在不接觸其他文件的情況下對(duì)某個(gè)模塊進(jìn)行擴(kuò)展。

          最重要的幾個(gè)模塊是:

          • 結(jié)果處理(IResultHandler)處理來(lái)自算法交易引擎的所有消息。決定應(yīng)該發(fā)送什么,以及消息應(yīng)該去哪里。結(jié)果處理系統(tǒng)可以將消息發(fā)送到本地 GUI 或 Web 界面。

          • 數(shù)據(jù)源(IDataFeed)連接并下載算法交易引擎所需的數(shù)據(jù)。從磁盤(pán)文件中讀取文件進(jìn)行回測(cè);實(shí)時(shí)交易則連接到一個(gè)流并生成數(shù)據(jù)對(duì)象。

          • 事務(wù)處理(ITransactionHandler)處理新的訂單請(qǐng)求;要么使用算法提供的模擬模型,要么使用實(shí)際券商。

          • 實(shí)時(shí)事件管理(IRealtimeHandler)生成實(shí)時(shí)事件 - 例如一天結(jié)束的事件。觸發(fā)對(duì)實(shí)時(shí)事件處理程序的回調(diào)。

          • 算法狀態(tài)設(shè)置(ISetupHandler)配置算法資金、投資組合和請(qǐng)求的數(shù)據(jù)。初始化所需的所有狀態(tài)參數(shù)。

          這些都可以從 Launcher 項(xiàng)目中的 config.json 文件進(jìn)行配置。

          1.Leon 安裝教程



          由于Leon是基于C#開(kāi)發(fā)的,因此我推薦使用 Visual Studio 進(jìn)行開(kāi)發(fā)。

          1、克隆項(xiàng)目。從 https://github.com/QuantConnect/Lean 克隆項(xiàng)目到本地(如果你網(wǎng)絡(luò)不通可在公眾號(hào)后臺(tái)回復(fù) Lean 下載)。

          2、使用 Visual Studio 打開(kāi)項(xiàng)目中的 QuantConnect.Lean.sln


          3、點(diǎn)擊 生成 - 生成解決方案


          4、點(diǎn)擊 F5 則可以運(yùn)行程序。

          如果你在生成解決方案的過(guò)程中遇到了類(lèi)似于如下的錯(cuò)誤:


          請(qǐng)?jiān)诠ぞ?- NuGet包管理器 - 程序包管理器設(shè)置 中 添加如下的源, 名字任取,鏈接對(duì)了就行: https://api.nuget.org/v3/index.json



          2.回測(cè) Lean 內(nèi)置的C#策略



          Lean 中比較有意思的一點(diǎn)是,其所有C#策略算法都位于 QuantConnect.Algorithm.CSharp 中,所有的Python策略算法都位于 QuantConnect.Algorithm.Python 中:


          如果你想回測(cè)C#的策略,你只需要修改 QuantConnect.Lean.Launcher 中的 config.json,將 QuantConnect.Algorithm.CSharp 中對(duì)應(yīng)策略名稱(chēng),修改到 algorithm-type-name 字段對(duì)應(yīng)的值中,如圖所示:


          然后按 F5 運(yùn)行程序,回測(cè)開(kāi)始,此時(shí)會(huì)彈出一個(gè)cmd窗口,里面有本次回測(cè)的統(tǒng)計(jì)數(shù)據(jù):


          3. 回測(cè) Lean 內(nèi)置的 Python策略



          如果你想要回測(cè)內(nèi)置的Python策略,我們需要先指定Lean使用的Python環(huán)境位置:

          1.打開(kāi)系統(tǒng)變量(我的電腦-右鍵屬性-高級(jí)系統(tǒng)設(shè)置->環(huán)境變量->系統(tǒng)變量)

          2.點(diǎn)擊新建變量,name為 PYTHONNET_PYDLL;value則為你的Python環(huán)境的dll文件所在文件夾,如我的為 G:\Anaconda3\python36.dll

          3.在此Python環(huán)境中安裝Lean的依賴(lài):

          pip install pandas
          pip install wrapt==1.11.2


          然后在項(xiàng)目的 config.json 中需要多改幾個(gè)配置:


          然后按F5進(jìn)行回測(cè),效果如下:


          這些統(tǒng)計(jì)指標(biāo)令人眼花繚亂,對(duì)于股票的回測(cè)我們只要重點(diǎn)關(guān)注這些即可:

          • Total Trades: 總交易量

          • Average Win: 平均盈利率

          • Average Loss: 平均虧損率

          • Compounding Annual Return: 復(fù)合年回報(bào)率

          • Drawdown: 最大回撤率

          • Expectancy: 期望值

          • Net Profit: 凈利潤(rùn)

          • Sharpe Ratio: 夏普比率

          • Probabilistic Sharpe Ratio: 概率性夏普比率

          • Loss Rate: 失敗率

          • Win Rate: 勝率

          • Profit-Loss Ratio: 盈虧比

          • Alpha: Alpha值

          • Beta: Beta值

          • Total Fees: 總手續(xù)費(fèi)

          其他的,按需關(guān)注即可。

          4. Lean 策略是怎么寫(xiě)的?



          開(kāi)始之前,讓我們先學(xué)習(xí)下 Lean 內(nèi)置策略的寫(xiě)法:

          上滑查看更多代碼

                     
          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 <= 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


          可以看到,其實(shí)它和Backtrader的寫(xiě)法相差無(wú)幾,Initialize 函數(shù)設(shè)置基本的回測(cè)參數(shù),如:

          • self.SetStartDate: 回測(cè)起始時(shí)間

          • self.SetEndDate: 回測(cè)結(jié)束時(shí)間

          • self.setCash: 回測(cè)資金

          • self.AddEquity: 回測(cè)對(duì)象(Resolution.Daily 是指按日回測(cè))

          • self.PlotIndicator: 繪圖時(shí)添加指標(biāo)

          而 onData 函數(shù)則會(huì)在每個(gè)數(shù)據(jù)點(diǎn)上做操作,如果是日線,則每天的數(shù)據(jù)都會(huì)流入到這個(gè)函數(shù)并運(yùn)行一遍。因此 onData 就是算法分析的主邏輯。

          在這里,你可以檢查需要的指標(biāo)是否已經(jīng)準(zhǔn)備完畢,因?yàn)榭赡艽嬖谝恍笮灾笜?biāo)在回測(cè)剛開(kāi)始的時(shí)候并沒(méi)有對(duì)應(yīng)的值;此外,在日線的情況下,你還可以檢測(cè)上一個(gè)數(shù)據(jù)點(diǎn)是不是和這個(gè)點(diǎn)在同一天上,如果是的話(huà)則不作任何操作返回:

          if not self.__macd.IsReady: return
          if self.__previous.date() == self.Time.date(): return


          然后就是核心的買(mǎi)入賣(mài)出邏輯:

          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


          如果我持倉(cāng)的股數(shù)<=0, 且信號(hào)值大于我設(shè)定的閾值,則將我資產(chǎn)的1%買(mǎi)入這只股票。這里和backtrader最大的不同,買(mǎi)入是以資產(chǎn)的百分比為單位的動(dòng)態(tài)買(mǎi)入。當(dāng)然,你也可以使用限定數(shù)量的買(mǎi)入方式:

          self.LimitOrder("IBM", 100, self.Securities["IBM"].Price)


          如果持倉(cāng)股市>=0, 且觸發(fā)賣(mài)出信號(hào),則進(jìn)行清倉(cāng)操作:

          elif holdings >= 0 and signalDeltaPercent < -tolerance:
              self.Liquidate("SPY")


          如果你不希望全部清倉(cāng),也可以使用 SetHoldings 來(lái)調(diào)整倉(cāng)位。

          可以看到,Lean相對(duì)于Backtrader有更靈活的倉(cāng)位管理方式,甚至能夠進(jìn)行自動(dòng)倉(cāng)位調(diào)整、構(gòu)建投資組合、實(shí)時(shí)交易等等。而且針對(duì)一些比較復(fù)雜的策略,你還可以用C#而不是Python來(lái)編寫(xiě)以提高運(yùn)行速度。

          綜上所述,Lean是一個(gè)非常值得深入學(xué)習(xí)的量化交易平臺(tái),有興趣的同學(xué)可以在他們官網(wǎng)學(xué)習(xí)到更多的內(nèi)容:

          https://www.quantconnect.com/docs

          我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實(shí)戰(zhàn)教程,請(qǐng)持續(xù)關(guān)注Python實(shí)用寶典。

          有任何問(wèn)題,可以在公眾號(hào)后臺(tái)回復(fù):加群,回答相應(yīng)紅字驗(yàn)證信息,進(jìn)入互助群詢(xún)問(wèn)。

          原創(chuàng)不易,希望你能在下面點(diǎn)個(gè)贊和在看支持我繼續(xù)創(chuàng)作,謝謝!

          點(diǎn)擊下方閱讀原文可獲得更好的閱讀體驗(yàn)

          Python實(shí)用寶典 (pythondict.com)
          不只是一個(gè)寶典
          歡迎關(guān)注公眾號(hào):Python實(shí)用寶典

          瀏覽 592
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三区在线观看 | 青春草视频免费在线观看 | 亚洲最大中文字幕在线 | 日本一区视频在线观看 | www日逼com |