Overall Statistics
Total Trades
9
Average Win
7.27%
Average Loss
-19.50%
Compounding Annual Return
-3.189%
Drawdown
38.400%
Expectancy
-0.085
Net Profit
-14.982%
Sharpe Ratio
-0.119
Loss Rate
33%
Win Rate
67%
Profit-Loss Ratio
0.37
Alpha
0
Beta
-1.049
Annual Standard Deviation
0.124
Annual Variance
0.015
Information Ratio
-0.23
Tracking Error
0.124
Treynor Ratio
0.014
Total Fees
$0.00
from NodaTime import DateTimeZone
from QuantConnect.Python import PythonQuandl
from decimal import Decimal

class GoldMarketTimingAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2010, 1, 1) 
        self.SetEndDate(2015, 1, 1)  
        self.SetCash(100000)
        # United States Government 10-Year Bond Yield   
        self.bond_yield = "YC/USA10Y" 
        # S&P 500 Earnings Yield. Earnings Yield = trailing 12 month earnings divided by index price 
        self.earnings_yield = "MULTPL/SP500_EARNINGS_YIELD_MONTH"
        # Gold Prices (Daily) - Currency USD (All values are national currency units per troy ounce)
        self.gold = "WGC/GOLD_DAILY_USD"
        # Add custom quandl data 
        self.AddData(QuandlRate, self.bond_yield, Resolution.Daily, DateTimeZone.Utc, True)
        self.AddData(QuandlValue, self.earnings_yield, Resolution.Daily, DateTimeZone.Utc, True)
        self.AddData(QuandlValue, self.gold, Resolution.Daily, DateTimeZone.Utc, True)
        self.AddEquity("SPY", Resolution.Daily)
        # Monthly rebalance
        self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY"), self.Rebalance)
        # Chart
        yieldPlot = Chart("Yield Plot")
        yieldPlot.AddSeries(Series("BondYield", SeriesType.Line, 0))
        yieldPlot.AddSeries(Series("EarningsYield", SeriesType.Line, 0))
        self.AddChart(yieldPlot)

    def OnData(self, data):
        if data.ContainsKey(self.bond_yield) and data.ContainsKey(self.earnings_yield):
            self.Plot("Yield Plot", "BondYield", data[self.bond_yield].Price)
            self.Plot("Yield Plot", "EarningsYield", data[self.earnings_yield].Price)

    def Rebalance(self):
        if self.Securities[self.earnings_yield].Price == 0 or self.Securities[self.bond_yield].Price == 0: return
        # Buy gold if E/P is higher than the bond yield and their ratio is at least 2
        if self.Securities[self.earnings_yield].Price > self.Securities[self.bond_yield].Price * Decimal(2):
            self.SetHoldings(self.gold, 0.9)
        else:
            self.Liquidate()

class QuandlRate(PythonQuandl):
    
    def __init__(self):
        self.ValueColumnName = "rate"

class QuandlValue(PythonQuandl):
    
    def __init__(self):
        self.ValueColumnName = "Value"