Overall Statistics |
Total Trades 12 Average Win 0.04% Average Loss 0% Compounding Annual Return 3.537% Drawdown 0.700% Expectancy 0 Net Profit 2.068% Sharpe Ratio 1.586 Probabilistic Sharpe Ratio 70.288% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.024 Beta 0.002 Annual Standard Deviation 0.015 Annual Variance 0 Information Ratio -0.801 Tracking Error 0.101 Treynor Ratio 9.993 Total Fees $12.00 |
from datetime import datetime, timedelta from QuantConnect.Data.Custom.PsychSignal import * class PsychSignalAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 3, 1) self.SetEndDate(2018, 10, 1) self.SetCash(100000) self.AddUniverseSelection(CoarseFundamentalUniverseSelectionModel(self.CoarseUniverse)) self.timeEntered = datetime(1, 1, 1) self.sentimentSymbols = [] # Request underlying equity data. ibm = self.AddEquity("IBM", Resolution.Minute).Symbol # Add sentiment data for the underlying IBM asset psy = self.AddData(PsychSignalSentiment, ibm).Symbol # Request 120 minutes of history with the PsychSignal IBM Custom Data Symbol history = self.History(PsychSignalSentiment, psy, 120, Resolution.Minute) # Count the number of items we get from our history request self.Debug(f"We got {len(history)} items from our history request") # You can use custom data with a universe of assets. def CoarseUniverse(self, coarse): if (self.Time - self.timeEntered) <= timedelta(days=10): return Universe.Unchanged # Ask for the universe like normal and then filter it symbols = [i.Symbol for i in coarse if i.HasFundamentalData and i.DollarVolume > 50000000][:20] # Add the custom data to the underlying security. for symbol in symbols: self.AddData(PsychSignalSentiment, symbol) return symbols def OnData(self, data): # Scan our last time traded to prevent churn. if (self.Time - self.timeEntered) <= timedelta(days=10): return # Fetch the PsychSignal data for the active securities and trade on any for security in self.ActiveSecurities.Values: tweets = security.Data.GetAll(PsychSignalSentiment) for sentiment in tweets: if sentiment.BullIntensity > 2.0 and sentiment.BullScoredMessages > 3: self.SetHoldings(sentiment.Symbol.Underlying, 0.05) self.timeEntered = self.Time # When adding custom data from a universe we should also remove the data afterwards. def OnSecuritiesChanged(self, changes): # Make sure to filter out other security removals (i.e. custom data) for r in [i for i in changes.RemovedSecurities if i.Symbol.SecurityType == SecurityType.Equity]: self.Liquidate(r.Symbol) # Remove the custom data from our algorithm and collection self.RemoveSecurity(Symbol.CreateBase(PsychSignalSentiment, r.Symbol, Market.USA))