LEAN Batch Launcher is an unofficial, alternative launcher for QuantConnect's LEAN Engine enabling batching/looping of algorithms in parallel with different start/end dates, securities, Alphas, data resolutions and (most importantly) parameters.
Prerequisites are the same as for LEAN.
The software has only been tested on Windows but may work fine on Linux and Mac.
- Make sure LEAN builds and runs properly.
- Clone the repository into a directory of choice. Ideally, this is not a folder inside the LEAN folder.
- Open
LeanBatchLauncher.sln
in Visual Studio and add necessary references to your pre-existing LEAN project.- Trying to compile will tell you what references you need. Keep adding references in both the
Algorithm
,Launcher
andInstance
projects to LEAN's DLL files until you can compile successfully. You will need (at least)Common
,Configuration
,Lean.Engine
,Logging
,Messaging
andQueues
. To build the sample algorithm, you will also needAlgorithm
andAlgorithm.Framework
. The existing references (included without aHintPath
) should be a guide to what's needed.
- Trying to compile will tell you what references you need. Keep adding references in both the
- Edit
Instance/Program.cs
lines 75 and 76 to set the correct path to and name of the algorithm to be batched. By default, theBasicTemplateFrameworkAlgorithm
is referenced. Whatever DLL you choose here must be referenced inLauncher
and thus compiled at runtime. - Ensure
Launcher/data-start-date-by-symbol.json
is filled in appropriately. Each Symbol to be used in the Launcher must have its earliest start date specified. - Open
Launcher/batch.config.json
and follow the reference guide below to configure it properly. - See
Algorithm/BasicTemplateFrameworkAlgorithm.cs
for an example algorithm that makes use of some of the Launcher's functionality. For more examples, see Usage in algorithm sections below. - Selecting the
Instance
project as the Startup Project and build it (F6
) once. - Select the
Launcher
project as the Startup Project and build it (F6
) once to ensure files are copied appropriately.
Done! You can now run the Launcher
as you please.
The various options are described below. Non-optional parameters are marked as such.
Parameter | Description and usage |
---|---|
LibraryPath |
Path to the root folder of the LEAN project, i.e. where the Launcher and Data folders reside. Non-optional.Example: "LibraryPath": "C:\\Users\\John\\Algorithm\\Lib\\Lean" Remember to use double backslashes ( \\ ) to separate folders. |
ApiJobUserId |
Your API job user ID. Same as in LEAN's config.json . Non-optional.Example: "ApiJobUserId": "32476" |
ApiAccessToken |
Your API access token. Same as in LEAN's config.json . Non-optional.Example: "ApiAccessToken": "O8dLVxwKhXpl4JiIfHWP25eIkgs8LY3r" |
ParallelProcesses |
How many processes your computer can handle in parallel. Must be less than or equal to the number of virtual CPU cores available. Non-optional. Example: "ParallelProcesses": 7 |
StartDate |
The starting date of the first instance, expressed as "dd mmm yyyy" (or any other format that DateTime can parse). Non-optional.Example: "StartDate": "01 Jan 2018" Usage in algorithm: SetStartDate( DateTime.Parse( Config.Get( "LBL-start-date" ) ) ); |
Duration |
The length of each backtest (in months). Only integers allowed. Non-optional. Example: "Duration": 12 |
AlphaModelNames |
An array of strings corresponding to the Name property of each Alpha you intend to run. Each Alpha you specify here must already have been created in your algorithm's main file. Example: "AlphaModelNames": [ "Alpha1(A=3,B=2)", "Alpha1(A=1,B=4)", "Alpha2(D=6)" ] Usage in algorithm: the Alphas intended for use must first be initialised in an IAlphaModel[] array. Then the Alpha can be selected by invoking SetAlpha( arrayOfAlphas.Where( x => x.GetModelName() == Config.Get( "LBL-alpha-model-name" ) ).Single() ); |
MinuteResolutions |
An array of integers corresponding to different minute resolutions to pass to the algorithm, one at a time. Example: "MinuteResolutions": [ 30, 60, 120 ] Usage in algorithm: int minuteResolution = Config.GetInt( "LBL-minute-resolution" ); . You could then pass this into e.g. a consolidator. |
Symbols |
An array of symbol strings to pass to the algorithm, one at a time. Example: "Symbols": [ "EURUSD", "CORNUSD", "USDHKD" ] Usage in algorithm: SetUniverseSelection( new ManualUniverseSelectionModel( QuantConnect.Symbol.Create( Config.Get( "LBL-symbol" ), SecurityType.Equity, Market.USA ) ) ); |
Parameters |
Allows you to pass in either a step or factor range: Step range: Will step through a parameter from Start to End in fixed increments of Step . Example: "Parameters": { "LBL-band-width": { "Start": 2, "End": 5, "Step": 0.5 } } Will yield LBL-band-width of 2, 2.5, 3, 3.5, 4, 4.5 and 5. Usage in algorithm: var bandWidth = Config.GetDouble( "band-width" ); . Factor range: Will step through a parameter from Start to End in factors of Factor . Example: "Parameters": { "LBL-lookback-period": { "Start": 4, "End": 64, "Factor": 2 } } Will yield LBL-lookback-period of 4, 8, 16, 32 and 64. Usage in algorithm: var bandWidth = Config.GetInt( "lookback-period" ); . |
Feel free to submit Issues and/or Pull Requests with new functionality, fixes or other enhancements.
- Douglas Stridsberg
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE
file for details
- The QuantConnect team
- James and his brilliant LeanOptimization library for his inspiration and words of wisdom