| Overall Statistics |
|
Total Trades 5615 Average Win 0.03% Average Loss -0.02% Compounding Annual Return 6.175% Drawdown 43.300% Expectancy 0.606 Net Profit 44.374% Sharpe Ratio 0.379 Probabilistic Sharpe Ratio 3.551% Loss Rate 28% Win Rate 72% Profit-Loss Ratio 1.24 Alpha -0.003 Beta 0.557 Annual Standard Deviation 0.139 Annual Variance 0.019 Information Ratio -0.37 Tracking Error 0.127 Treynor Ratio 0.094 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset TAO TYKAMUY57AZP |
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
'''
This Alpha Model uses Wells Fargo 30-year Fixed Rate Mortgage data from Quandl to
generate Insights about the movement of Real Estate ETFs. Mortgage rates can provide information
regarding the general price trend of real estate, and ETFs provide good continuous-time instruments
to measure the impact against. Volatility in mortgage rates tends to put downward pressure on real
estate prices, whereas stable mortgage rates, regardless of true rate, lead to stable or higher real
estate prices. This Alpha model seeks to take advantage of this correlation by emitting insights
based on volatility and rate deviation from its historic mean.
This alpha is part of the Benchmark Alpha Series created by QuantConnect which are open
sourced so the community and client funds can see an example of an alpha.
'''
from AlgorithmImports import *
class MortgageRateVolatilityAlpha(QCAlgorithmFramework):
def Initialize(self):
# Set requested data resolution
self.SetStartDate(2017, 1, 1) #Set Start Date
self.SetCash(100000) #Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
## Universe of six liquid real estate ETFs
etfs = ['VNQ', 'REET', 'TAO', 'FREL', 'SRET', 'HIPS']
symbols = [ Symbol.Create(etf, SecurityType.Equity, Market.USA) for etf in etfs ]
self.SetSecurityInitializer(lambda security: security.SetFeeModel(ConstantFeeModel(0)))
self.SetUniverseSelection( ManualUniverseSelectionModel(symbols) )
self.SetAlpha(MortgageRateVolatilityAlphaModel(self))
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
self.SetRiskManagement(NullRiskManagementModel())
class MortgageRateVolatilityAlphaModel(AlphaModel):
def __init__(self, algorithm, indicatorPeriod = 15, insightMagnitude = 0.005, deviations = 2):
## Add Quandl data for a Well's Fargo 30-year Fixed Rate mortgage
self.mortgageRate = algorithm.AddData(QuandlMortgagePriceColumns, 'WFC/PR_GOV_30YFIXEDVA_APR').Symbol
self.indicatorPeriod = indicatorPeriod
self.insightDuration = TimeSpan.FromDays(indicatorPeriod)
self.insightMagnitude = insightMagnitude
self.deviations = deviations
## Add indicators for the mortgage rate -- Standard Deviation and Simple Moving Average
self.mortgageRateStd = algorithm.STD(self.mortgageRate.Value, indicatorPeriod)
self.mortgageRateSma = algorithm.SMA(self.mortgageRate.Value, indicatorPeriod)
## Use a history call to warm-up the indicators
self.WarmupIndicators(algorithm)
def Update(self, algorithm, data):
insights = []
## Return empty list if data slice doesn't contain monrtgage rate data
if self.mortgageRate not in data.Keys:
return []
## Extract current mortgage rate, the current STD indicator value, and current SMA value
mortgageRate = data[self.mortgageRate].Value
deviation = self.deviations * self.mortgageRateStd.Current.Value
sma = self.mortgageRateSma.Current.Value
## If volatility in mortgage rates is high, then we emit an Insight to sell
if (mortgageRate < sma - deviation) or (mortgageRate > sma + deviation):
## Emit insights for all securities that are currently in the Universe,
## except for the Quandl Symbol
insights = [Insight(security, self.insightDuration, InsightType.Price, InsightDirection.Down, self.insightMagnitude, None) \
for security in algorithm.ActiveSecurities.Keys if security != self.mortgageRate]
## If volatility in mortgage rates is low, then we emit an Insight to buy
if (mortgageRate < sma - deviation/2) or (mortgageRate > sma + deviation/2):
insights = [Insight(security, self.insightDuration, InsightType.Price, InsightDirection.Up, self.insightMagnitude, None) \
for security in algorithm.ActiveSecurities.Keys if security != self.mortgageRate]
return insights
def WarmupIndicators(self, algorithm):
## Make a history call and update the indicators
history = algorithm.History(self.mortgageRate, self.indicatorPeriod, Resolution.Daily)
for index, row in history.iterrows():
self.mortgageRateStd.Update(index[1], row['value'])
self.mortgageRateSma.Update(index[1], row['value'])
class QuandlMortgagePriceColumns(PythonQuandl):
def __init__(self):
## Rename the Quandl object column to the data we want, which is the 'Value' column
## of the CSV that our API call returns
self.ValueColumnName = "Value"