| Overall Statistics |
|
Total Trades 59 Average Win 1.79% Average Loss -1.32% Compounding Annual Return 19.082% Drawdown 6.300% Expectancy 0.542 Net Profit 20.674% Sharpe Ratio 1.509 Probabilistic Sharpe Ratio 73.148% Loss Rate 34% Win Rate 66% Profit-Loss Ratio 1.35 Alpha 0.002 Beta 0.647 Annual Standard Deviation 0.082 Annual Variance 0.007 Information Ratio -1.076 Tracking Error 0.061 Treynor Ratio 0.192 Total Fees $1131.10 |
from QuantConnect.Data.Custom.Tiingo import *
from datetime import datetime, timedelta
import numpy as np
class TiingoNS(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1)
#self.SetEndDate(2015, 11, 1)
symbols = [
Symbol.Create("SPY",SecurityType.Equity, Market.USA),#on
]
self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))
self.SetAlpha(NewsSentimentAlphaModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
self.SetRiskManagement(NullRiskManagementModel())
self.SetBrokerageModel(BrokerageName.AlphaStreams)
self.SetCash(1000000)
class NewsData():
def __init__(self, symbol):
self.Symbol = symbol
self.Window = RollingWindow[float](100)
class NewsSentimentAlphaModel(AlphaModel):
def __init__(self):
self.newsData = {}
self.wordScores = {
"over":1, #1
}
self.overnightInsights = []
def Update(self, algorithm, data):
insights = []
news = data.Get(TiingoNews)
for article in news.Values:
words = article.Description.lower().split(" ")
score = sum([self.wordScores[word] for word in words
if word in self.wordScores])
symbol = article.Symbol.Underlying
self.newsData[symbol].Window.Add(score)
sentiment = sum(self.newsData[symbol].Window)
if sentiment > 3:
insight = Insight.Price(symbol, timedelta(1), InsightDirection.Up)
if algorithm.IsMarketOpen("SPY"):
insights.append(insight)
if len(self.overnightInsights) != 0:
insights.extend(self.overnightInsights)
self.overnightInsights = []
else:
self.overnightInsights.append(insight)
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for security in changes.AddedSecurities:
symbol = security.Symbol
newsAsset = algorithm.AddData(TiingoNews, symbol)
self.newsData[symbol] = NewsData(newsAsset.Symbol)
for security in changes.RemovedSecurities:
newsData = self.newsData.pop(security.Symbol, None)
if newsData is not None:
algorithm.RemoveSecurity(newsData.Symbol)