Back to Community
Community Algorithms Migrated to Quantopian 2

Yesterday we launched Quantopian 2 which involved some changes to the API. In order to help with the process of migrating algorithms to the new API, we created the migration guide. In addition, we migrated several dozen popular community algorithms. If you click the clone button on the shared backtest, you are instead given the Quantopian 2 version. You can also inspect the code without cloning it by clicking the "Migrated Source Code" tab.

-- EDIT (original post only had 7 algorithms listed) --

Here is the complete list:


The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

8 responses

"In addition, we migrated several dozen popular community algorithms. "

You listed 7 of them, but where can I find the rest of the several dozen.


Hi Steve,

The samples in the help documentation were also migrated so you can have a look at those as well.

NOTE: The complete list of community algos was originally a part of this comment, but was moved up to the original post.

Awsome work! Any chance of doing the same for the first and last algo on the following thread.


Wow, credit to whomever was coding and testing through the night!

Can somebody migrate this?

Great, thanks for this! Quite helpful!

I was working with the "Simple Downside Protection Model" algo and the new version wasn't working on longer timelines, but it looks like I was able to improve it with a couple of data.can_trade lines (lines 47 and 54).

Clone Algorithm
Total Returns
Max Drawdown
Benchmark Returns
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month
# This will be a sample implementaiton of the Drawdown Reducing Strategy 
# laid out by Wes Gray of Alpha Architect.

import pandas as pd
import numpy as np

def initialize(context):
    context.assets = [
        sid(19662),  # XLY Consumer Discrectionary SPDR Fund   
        sid(19656),  # XLF Financial SPDR Fund  
        sid(19658),  # XLK Technology SPDR Fund  
        sid(19655),  # XLE Energy SPDR Fund  
        sid(19661),  # XLV Health Care SPRD Fund  
        sid(19657),  # XLI Industrial SPDR Fund  
        sid(19659),  # XLP Consumer Staples SPDR Fund   
        sid(19654),  # XLB Materials SPDR Fund  
        sid(19660),  # XLU Utilities SPDR Fund
    # context.assets = symbols("SPY")
    context.base_weight = 1.0 / len(context.assets)
    context.lookback = 252
    # context.rf_asset = sid(23870) # IEF iShares Barclays 7-10 Year Treasury Bond ETF
    context.rf_asset = sid(23911) # SHY iShares 1-3 Year Treasury Bond ETF
    # context.rf_asset = sid(33948) # BIL SPDR® Barclays 1-3 Month T-Bill ETF (6/2007 - present)
    context.DPMs = []
    for security in context.assets:
    context.all_assets = context.assets + [context.rf_asset]
    schedule_function(adjust_exposure, date_rules.month_start())
    schedule_function(record_stats, date_rules.every_day(), time_rules.market_close())

def record_stats(context, data):

def adjust_exposure(context, data):
    prices = data.history(context.all_assets, "price", context.lookback, "1d")
    rf_asset_target = 0
    for dpm in context.DPMs:
        if data.can_trade(dpm.asset):
            dpm.update_rf_return((prices[context.rf_asset][-1] / prices[context.rf_asset][0]) - 1 )
            order_target_percent(dpm.asset, dpm.exposure * context.base_weight)
            rf_asset_target += dpm.non_asset_exposure
    rf_asset_exposure = rf_asset_target * context.base_weight
    if data.can_trade(context.rf_asset):
        order_target_percent(context.rf_asset, rf_asset_exposure)

class DownsideProtectionModel(object):
    def __init__(self, asset, historical_prices=None, rf=0):
        self.asset = asset
        self.rf = rf
        self.historical_prices = historical_prices
    def exposure(self):
        return np.mean([self._TMOM_Rule(), self._MA_Rule()])
    def non_asset_exposure(self):
        return 1 - self.exposure
    def update_prices(self, new_prices):
        self.historical_prices = new_prices
    def update_rf_return(self, new_return):
        self.rf = new_return
    # Returns False if you should reduce exposure, True if you should increase it.
    def _TMOM_Rule(self):
        starting_price = self.historical_prices[0]
        current_price = self.historical_prices[-1]
        twelve_month_return = (current_price / starting_price) - 1
        excess_return = twelve_month_return - self.rf
        return excess_return > 0
    # Returns False if you should reduce exposure, True if you should increase it.
    def _MA_Rule(self):
        current_price = self.historical_prices[-1]
        moving_average_price = self.historical_prices.mean()
        return current_price > moving_average_price
There was a runtime error.

Hey Brad, it looks like a unicorn ! Great results.

The downfall (if not mistaken) is that it o transaction every days, You'd better set some fees and slippage.