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