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);
        }
    }
}