Overall Statistics |
Total Trades 280 Average Win 0.19% Average Loss -0.02% Compounding Annual Return 4.324% Drawdown 0.600% Expectancy 0.398 Net Profit 1.355% Sharpe Ratio 1.206 Probabilistic Sharpe Ratio 56.716% Loss Rate 85% Win Rate 15% Profit-Loss Ratio 8.21 Alpha 0.03 Beta -0.007 Annual Standard Deviation 0.024 Annual Variance 0.001 Information Ratio -0.152 Tracking Error 0.121 Treynor Ratio -4.13 Total Fees $393.69 |
using QuantConnect.Data.Custom.Tiingo; namespace QuantConnect.Algorithm.CSharp { public class TiingoNLPDemonstration : QCAlgorithm { Symbol tiingoSymbol; // Predefine a dictionary of words with scores to scan for in the description // of the Tiingo news article private Dictionary<string, double> words = new Dictionary<string, double>() { {"bad", -0.5}, {"good", 0.5}, {"negative", -0.5}, {"great", 0.5}, {"growth", 0.5}, {"fail", -0.5}, {"failed", -0.5}, {"success", 0.5}, {"nailed", 0.5}, {"beat", 0.5}, {"missed", -0.5} }; public override void Initialize() { SetStartDate(2019, 6, 10); SetEndDate(2019, 10, 3); SetCash(100000); var aapl = AddEquity("QQQ", Resolution.Hour).Symbol; tiingoSymbol = AddData<TiingoNews>(aapl).Symbol; // Request underlying equity data var ibm = AddEquity("QQQ", Resolution.Minute).Symbol; // Add news data for the underlying IBM asset var news = AddData<TiingoNews>(ibm).Symbol; // Request 60 days of history with the TiingoNews IBM Custom Data Symbol. var history = History<TiingoNews>(news, 60, Resolution.Daily); // Count the number of items we get from our history request Debug($"We got {history.Count()} items from our history request"); } public override void OnData(Slice data) { //Confirm that the data is in the collection if (!data.ContainsKey(tiingoSymbol)) return; // Gets the first piece of data from the Slice var article = data.Get<TiingoNews>(tiingoSymbol); // Article descriptions come in all caps. Lower and split by word var descriptionWords = article.Description.ToLower().Split(' '); // Take the intersection of predefined words and the words in the // description to get a list of matching words var intersection = words.Keys.Intersect(descriptionWords); // Get the sum of the article's sentiment, and go long or short // depending if it's a positive or negative description var sentiment = intersection.Select(x => words[x]).Sum(); SetHoldings(article.Symbol.Underlying, sentiment); } } }