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"