Overall Statistics |
Total Trades 3162 Average Win 0.01% Average Loss -0.01% Compounding Annual Return -59.536% Drawdown 7.400% Expectancy -0.442 Net Profit -7.396% Sharpe Ratio -16.661 Probabilistic Sharpe Ratio 0% Loss Rate 68% Win Rate 32% Profit-Loss Ratio 0.73 Alpha -0.5 Beta 0.068 Annual Standard Deviation 0.031 Annual Variance 0.001 Information Ratio -2.908 Tracking Error 0.116 Treynor Ratio -7.522 Total Fees $0.00 |
from InflationRateAlphaModel import InflationRateAlphaModel from Execution.ImmediateExecutionModel import ImmediateExecutionModel from G10CurrencySelectionModel import G10CurrencySelectionModel class TransdimensionalUncoupledPrism(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 4, 20) # Set Start Date self.SetEndDate(2019, 5, 20) self.SetCash(100000) # Set Strategy Cash self.AddAlpha(BollingerBandTradingAlphaModel()) self.SetExecution(ImmediateExecutionModel()) self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel()) #self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.UniverseSettings.Resolution = Resolution.Hour self.UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw self.AddUniverseSelection( G10CurrencySelectionModel()) def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' # if not self.Portfolio.Invested: # self.SetHoldings("SPY", 1) def OnEndOfDay(self, symbol): self.Log("Taking a position of " + str(self.Portfolio[symbol].Quantity) + " units of symbol " + str(symbol)) pass class BollingerBandTradingAlphaModel(AlphaModel): def __init__(self): self.pair = [ ] self.period = timedelta(hours=2) self.spreadMean_list = [] self.spreadStd_list = [] self.symbolData = [] def Update(self, algorithm, data): insights_ = [] i = 0 algorithm.Log(str(len(self.pair))) for pair_ in self.pair: self.spreadMean_list[i].Update(algorithm.Time, pair_.Price) self.spreadStd_list[i].Update(algorithm.Time, pair_.Price) upperthreshold_ = self.spreadMean_list[i].Current.Value + self.spreadStd_list[i].Current.Value lowerthreshold_ = self.spreadMean_list[i].Current.Value - self.spreadStd_list[i].Current.Value if pair_.Price > upperthreshold_ and self.symbolData[i] != -1: insights_.append(Insight.Price(pair_.Symbol, self.period, InsightDirection.Down, None, None, None, 0.25)) #algorithm.Log("Down") self.symbolData[i] = -1 elif pair_.Price < lowerthreshold_ and self.symbolData[i] != 1: insights_.append(Insight.Price(pair_.Symbol, self.period, InsightDirection.Up, None, None, None, 0.25)) #algorithm.Log("Up") self.symbolData[i] = 1 elif self.symbolData[i] != 2: insights_.append(Insight.Price(pair_.Symbol, self.period, InsightDirection.Flat, None, None, None, 0.25)) self.symbolData[i] = 2 i += 1 return Insight.Group(insights_) def OnSecuritiesChanged(self, algorithm, changes): for x in changes.AddedSecurities: self.pair.append(x) self.spreadMean_list.append(SimpleMovingAverage(500)) self.spreadStd_list.append(StandardDeviation(500)) self.symbolData.append(0) history = algorithm.History([x.Symbol for x in self.pair], 500) history = history.askclose.unstack(level=0) for tuple in history.itertuples(): time_ = tuple[0] j = 0 for i in range(1, len(tuple)): self.spreadMean_list[j].Update(time_, tuple[i]) self.spreadStd_list[j].Update(time_, tuple[i]) j += 1
class InflationRateAlphaModel(AlphaModel): def __init__(self, algorithm, insightDuration = 30): ## Add monthly US inflation rate data self.inflationUS = algorithm.AddData(QuandlInflationRate, 'RATEINF/INFLATION_USA', Resolution.Daily).Symbol ## Add monthly UK inflation rate self.inflationUK = algorithm.AddData(QuandlInflationRate, 'RATEINF/INFLATION_GBR', Resolution.Daily).Symbol ## Add monthly US interest rate data self.interestUS = algorithm.AddData(QuandlInterestRate, 'FRED/FEDFUNDS', Resolution.Daily).Symbol ## Add daily UK interest rate data self.interestUK = algorithm.AddData(QuandlInterestRate, 'BOE/IUDBEDR', Resolution.Daily).Symbol self.insightDuration = TimeSpan.FromDays(insightDuration) def Update(self, algorithm, data): insights = [] ## Check to make sure Fed Quandl Symbols are in current data Slice ## Fed Rate data appears on the 2nd of the month while the other data appears on the first, so we use the latter ## to ensure that there is updated data for all Symbols if not data.ContainsKey(self.interestUS): return [] ## Typically, a country with a consistently lower inflation rate exhibits a rising ## currency value, as its purchasing power increases relative to other currencies. ## Those countries with higher inflation typically see depreciation in their ## currency in relation to the currencies of their trading partners. This is also usually ## accompanied by higher interest rates. Currency traders, then, hope to predict future ## exchange rate movements by paying attention to the relative levels of inflation in ## the countries of their target currency pairs in addition to where each country is in ## its monetary policy cycle, and the size and pace of currency flows moving into and ## out of each country. return insights class QuandlInflationRate(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' class QuandlInterestRate(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"
from QuantConnect import * from Selection.ManualUniverseSelectionModel import ManualUniverseSelectionModel class G10CurrencySelectionModel(ManualUniverseSelectionModel): def __init__(self): super().__init__([Symbol.Create(x, SecurityType.Forex, Market.Oanda) for x in [ "EURUSD", "GBPUSD", "USDJPY", "AUDUSD", "NZDUSD","USDCAD", "USDCHF", "USDNOK", "USDSEK"]])
class MyPCM(InsightWeightingPortfolioConstructionModel): leverage = 0.5 def CreateTargets(self, algorithm, insights): targets = super().CreateTargets(algorithm, insights) return [PortfolioTarget(x.Symbol, x.Quantity*(1+self.leverage)) for x in targets]