Files
quantconnect--lean/Algorithm.Python
Alexandre Catarino 2b0fd2e607 Updates SPY Market Data (#5493)
* Fixes Double to Decimal Cast in GetAnnualPerformance

`GetAnnualPerformance` raises an exception if the `AnnualPerformance` calculation returns a double that cannot be cast to decimal (smaller than `decimal.MinValue` or bigger than `decimal.MaxValue`).
See `ProbabilisticSharpeRatio` where the same solution was applied.

* Updates SPY Market Data

SPY is a key asset since it is the default benchmark, and any change can lead to different `Alpha` and `Beta`

* Updates Unit Tests to Reflect Data Update

* Updates Regression Tests to Reflect Data Update I

Most of the regression tests change because of updated data (market and factors) of SPY (default benchmark) while the total trade remain the same.

* Updates Regression Tests to Reflect Data Update II

The following regression tests were changed to adapt to adjusted prices and keep the total trades:
- `BacktestingBrokerageRegressionAlgorithm`
- `LimitIfTouchedRegressionAlgorithm`
- `PortfolioRebalanceOnCustomFuncRegressionAlgorithm`
- `SetAccountCurrencySecurityMarginModelRegressionAlgorithm`
- `StopLossOnOrderEventRegressionAlgorithm`
- `TimeInForceAlgorithm`

The following regression tests have more trades since adjusted prices allowed more 1-2 shares trades that were rounded down to zero before:
- `FreePortfolioValueRegressionAlgorithm` 2 -> 3
- `PortfolioRebalanceOnDateRulesRegressionAlgorithm` 291 -> 298
- `TrailingStopRiskFrameworkAlgorithm` 5 -> 7

Especial cases:
- `AutoRegressiveIntegratedMovingAverageRegressionAlgorithm` 65 -> 52
 - ARIMA model sensibility
- `BlackLittermanPortfolioOptimizationFrameworkAlgorithm` 18 -> 19
 - BLM model sensibility
- `ExtendedMarketHoursHistoryRegressionAlgorithm` 20 -> 18
 - Less minute bars before market opens

* Addresses Peer-Review

Fix `BacktestingBrokerageRegressionAlgorithm` to use `CalculateOrderQuantity` and round down `quantity` to an even number to pass a value assertion and update the expected value from 50 to 52.
The quantity calculated by `CalculateOrderQuantity` has changed from 50 to 53 because of factor file update.
2021-04-19 13:31:01 -03:00
..
2021-03-19 14:17:05 -07:00
2019-04-05 18:34:18 -03:00
2020-02-12 14:23:52 -08:00
2019-03-01 15:06:37 -08:00
2020-06-02 12:52:28 -03:00
2020-06-02 12:52:28 -03:00
2019-04-03 21:55:44 -03:00
2019-07-09 09:05:27 -07:00
2015-09-01 22:17:35 -04:00
2021-03-09 18:25:31 -03:00

QuantConnect Python Algorithm Project

This document contains information regarding how to use Python with the Lean engine, this includes how to use Python Autocomplete, setting up Lean for Python algorithms, PythonNet compilation for devs, and what imports to use to replicate the web IDE experience in your local development.



Local Python Autocomplete

To enable autocomplete for your local Python IDE, install the quantconnect-stubs package from PyPI using the following command:

pip install quantconnect-stubs

To update your autocomplete to the latest version, you can run the following command:

pip install --upgrade quantconnect-stubs

Copy and paste the imports found here to the top of your project file to enable autocomplete.

In addition, you can use Skylight to automatically sync local changes to the cloud.



Setup Lean Locally with Python

Before setting up python support, follow the installation instructions to get LEAN running C# algorithms on your machine.

Installing Python 3.6:

Next we must prepare a Python installation for Lean to use. Follow the instructions for your OS.


Windows

  1. Use the Windows x86-64 MSI Python 3.6.8 installer from python.org or Anaconda for Windows installer. "Anaconda 5.2" installs 3.5.2 by default, after installation of Anaconda you will need to upgrade python to make it work as expected: conda install -y python=3.6.8
  2. When asked to select the features to be installed, make sure you select "Add python.exe to Path"
  3. Create PYTHONNET_PYDLL environment variable to the location of your python dll in your installation (e.g. C:\Dev\Python368\python36.dll or C:\Anaconda3\python36.dll):
    • Right mouse button on My Computer. Click Properties.
    • Click Advanced System Settings -> Environment Variables -> System Variables
    • Click New.
      • Name: PYTHONNET_PYDLL
      • Value: {python dll location}
  4. Install pandas=0.25.3 and its dependencies.
  5. Install wrapt=1.11.2 module.
  6. Reboot computer to ensure changes are propagated.

macOS

  1. Use the macOS x86-64 package installer from Anaconda and follow "Installing on macOS" instructions from Anaconda documentation page.
  2. Set PYTHONNET_PYDLL environment variable to the location of your python dll in your installation directory (e.g. /Users/{your_user_name}/anaconda3/lib/libpython3.6m.dylib):
    • Open ~/.bash-profile with a text editor of your choice.
    • Add a new line to the file containing
    export PYTHONNET_PYDLL="/{your}/{path}/{here}/libpython3.6m.dylib"
    
    • Save your changes, and either restart your terminal or execute
    source ~/.bash-profile
    
  3. Install pandas=0.25.3 and its dependencies.
  4. Install wrapt=1.11.2 module.

Linux

  1. Install Python using miniconda by following these commands; by default, miniconda is installed in the users home directory ($HOME):
export PATH="$HOME/miniconda3/bin:$PATH"
wget https://cdn.quantconnect.com/miniconda/Miniconda3-4.5.12-Linux-x86_64.sh
bash Miniconda3-4.5.12-Linux-x86_64.sh -b
rm -rf Miniconda3-4.5.12-Linux-x86_64.sh
conda update -y python conda pip
  1. Create a new Python environment with the needed dependencies
conda create -n qc_lean python=3.6.8 cython=0.29.11 pandas=0.25.3 wrapt=1.11.2
  1. Set PYTHONNET_PYDLL environment variable to location of your python dll in your installation directory (e.g. /home/{your_user_name}/miniconda3/envs/qc_lean/lib/libpython3.6m.so):
    • Open /etc/environment with a text editor of your choice.
    • Add a new line to the file containing
    PYTHONNET_PYDLL="/home/{your_user_name}/miniconda3/envs/qc_lean/lib/libpython3.6m.so"
    
    • Save your changes, and logout or reboot to reflect these changes

Run Python Algorithms

  1. Update the config to run a python algorithm:
    "algorithm-type-name": "BasicTemplateAlgorithm",
    "algorithm-language": "Python",
    "algorithm-location": "../../../Algorithm.Python/BasicTemplateAlgorithm.py",
    
  2. Rebuild LEAN.
  3. Run LEAN. You should see the same result of the C# algorithm you tested earlier.

Python.NET development - Python.Runtime.dll compilation

LEAN users do not need to compile Python.Runtime.dll. The information below is targeted to developers who wish to improve it. Download QuantConnect/pythonnet github clone or downloading the zip. If downloading the zip - unzip to a local pathway.

Note: QuantConnect's version of pythonnet is an enhanced version of pythonnet with added support for System.Decimal and System.DateTime.

Below are some examples of build commands that create a suitable Python.Runtime.dll.

msbuild pythonnet.sln /nologo /v:quiet /t:Clean;Rebuild 

OR

dotnet build pythonnet.sln

Python Autocomplete Imports

Copy and paste these imports to the top of your Python file to enable a development experience equal to the cloud (these imports are exactly the same as the ones used in the QuantConnect Terminal).

from QuantConnect import *
from QuantConnect.Parameters import *
from QuantConnect.Benchmarks import *
from QuantConnect.Brokerages import *
from QuantConnect.Util import *
from QuantConnect.Interfaces import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Algorithm.Framework.Alphas import *
from QuantConnect.Algorithm.Framework.Portfolio import *
from QuantConnect.Algorithm.Framework.Execution import *
from QuantConnect.Algorithm.Framework.Risk import *
from QuantConnect.Indicators import *
from QuantConnect.Data import *
from QuantConnect.Data.Consolidators import *
from QuantConnect.Data.Custom import *
from QuantConnect.Data.Fundamental import *
from QuantConnect.Data.Market import *
from QuantConnect.Data.UniverseSelection import *
from QuantConnect.Notifications import *
from QuantConnect.Orders import *
from QuantConnect.Orders.Fees import *
from QuantConnect.Orders.Fills import *
from QuantConnect.Orders.Slippage import *
from QuantConnect.Scheduling import *
from QuantConnect.Securities import *
from QuantConnect.Securities.Equity import *
from QuantConnect.Securities.Forex import *
from QuantConnect.Securities.Interfaces import *
from datetime import date, datetime, timedelta
from QuantConnect.Python import *
from QuantConnect.Storage import *
QCAlgorithmFramework = QCAlgorithm
QCAlgorithmFrameworkBridge = QCAlgorithm