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