Overall Statistics |
Total Trades 93 Average Win 0.46% Average Loss -0.27% Compounding Annual Return 13.735% Drawdown 3.000% Expectancy 0.373 Net Profit 4.175% Sharpe Ratio 1.472 Loss Rate 49% Win Rate 51% Profit-Loss Ratio 1.68 Alpha 0.089 Beta 0.017 Annual Standard Deviation 0.061 Annual Variance 0.004 Information Ratio 0.322 Tracking Error 0.131 Treynor Ratio 5.343 Total Fees $124.63 |
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("AAPL", Resolution.Hour).Symbol; tiingoSymbol = AddData<TiingoNews>(aapl).Symbol; // Request underlying equity data var ibm = AddEquity("IBM", 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); } } }