From a84236b542855454e652723daccd1812dca55f6b Mon Sep 17 00:00:00 2001 From: jasonramchandani Date: Fri, 5 Jan 2018 15:37:32 +0000 Subject: [PATCH] Add files via upload --- Article 14 One.JPG | Bin 0 -> 77181 bytes Article 14 Two.JPG | Bin 0 -> 68382 bytes README.md | 590 ++++++++++++++++++++++++++++++- Untitled14.ipynb | 862 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1451 insertions(+), 1 deletion(-) create mode 100644 Article 14 One.JPG create mode 100644 Article 14 Two.JPG create mode 100644 Untitled14.ipynb diff --git a/Article 14 One.JPG b/Article 14 One.JPG new file mode 100644 index 0000000000000000000000000000000000000000..52af7d495ef3bda2fd65dd34317f233f306722bf GIT binary patch literal 77181 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 32aae33..c24a985 100644 --- a/README.md +++ b/README.md @@ -1 +1,589 @@ -# Article.EikonAPI.Python.NewsSentimentAnalysis \ No newline at end of file + +# Introduction to News Sentiment Analysis with Eikon Data APIs - a Python example + +This article will demonstrate how we can conduct a simple sentiment analysis of news delivered via our new [Eikon Data APIs](https://developers.thomsonreuters.com/eikon-data-apis). Natural Language Processing (NLP) is a big area of interest for those looking to gain insight and new sources of value from the vast quantities of unstructured data out there. The area is quite complex and there are many resources online that can help you familiarise yourself with this very interesting area. There are also many different packages that can help you as well as many different approaches to this problem. Whilst these are beyond the scope of this article - I will go through a simple implementation which will give you a swift enough introduction and practical codebase for further exploration and learning. + +**Pre-requisites:** + +**Thomson Reuters Eikon** with access to new [Eikon Data APIs](https://developers.thomsonreuters.com/eikon-data-apis) + +**Python 2.x/3.x** + +**Required Python Packages:** eikon, pandas, numpy, beautifulsoup, textblob, datetime + +**Required corpora download:** >>>python -m textblob.download_corpora (this is required by the sentiment engine to generate sentiment) + +### Introduction + +NLP is a field which enables computers to understand human language (voice or text). This is quite a big area of research and a little enquiry on your part will furnish you with the complexities of this problem set. Here we will be focussing on one application of this called *Sentiment Analysis*. In our case we will be taking news articles(unstructured text) for a particular company, **IBM**, and we will attempt to grade this news to see how postive, negative or neutral it is. We will then try to see if this news has had an impact on the shareprice of **IBM**. + +To do this really well is a non-trivial task, and most universtities and financial companies will have departments and teams looking at this. We ourselves provide machine readable news products with News Analytics (such as sentiment) over our **Elektron** platform in realtime at very low latency - these products are essentially consumed by *algorithmic applications* as opposed to *humans*. + +We will try to do a similar thing as simply as possible to illustrate the key elements - our task is significantly eased by not having to do this in a low latency environment. We will be abstracting most of the complexities to do with the mechanics of actually analysing the text to various packages. You can then easily replace the modules such as the sentiment engine etc to improve your results as your understanding increases. + +So lets get started. First lets load the packages that we will need to use and set our app_id. + + +```python +import eikon as ek +import pandas as pd +import numpy as np +from bs4 import BeautifulSoup +from textblob import TextBlob +import datetime +from datetime import time +import warnings +warnings.filterwarnings("ignore") +ek.set_app_id('YOUR APP ID HERE') +``` + +There are two API calls for news: + +**get_news_headlines** : returns a list of news headlines satisfying a query + +**get_news_story** : returns a HTML representation of the full news article + +We will need to use both - thankfully they are really straightforward to use. We will need to use **get_news_headlines** API call to request a list of headlines. The first parameter for this call is a query. You dont really need to know this query language as you can generate it using the **News Monitor App** (type **NEWS** into Eikon search bar) in **Eikon**. + +You can see here I have just typed in 2 search terms, **IBM**, for the company, and, **English**, for the language I am interested in (in our example we will only be able to analyse English language text - though there are corpora, packages, methods you can employ to target other languages - though these are beyond the scope of this article). You can of course use any search terms you wish. + +![News App 1](Article 14 One.jpg) + +After you have typed in what you want to search for - we can simply click in the search box and this will then generate the query text which we can then copy and paste into the API call below. Its easy for us to change logical operations such as **AND** to **OR**, **NOT** to suit our query. + +![News App 2](Article 14 Two.png) + +So the line of code below gets us 100 news headlines for **IBM** in english prior to 4th Dec 2017, and stores them in a dataframe, df for us. + + +```python +df = ek.get_news_headlines('R:IBM.N AND Language:LEN', date_to = "2017-12-04", count=100) +df.head() +``` + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionCreatedtextstoryIdsourceCode
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS
+
+ + + +I will just add 3 new columns which we will need to store some variables in later. + + +```python +df['Polarity'] = np.nan +df['Subjectivity'] = np.nan +df['Score'] = np.nan +``` + +So we have our frame with the most recent 100 news headline items. The headline is stored in the **text** column and the storyID which we will now use to pull down the actual articles themselves, is stored in the **storyID** column. + +We will now iterate through the headline dataframe and pull down the news articles using the second of our news API calls, get_news_story. We simply pass the **storyID** to this API call and we are returned a HTML representation of the article - which allows you to render them nicely etc - however for our purposes we want to strip the HTML tags etc out and just be left with the plain text - as we dont want to analyse HTML tags for sentiment. We will do this using the excellent **BeautifulSoup** package. + +Once we have the text of these articles we can pass them to our sentiment engine which will give us a sentiment score for each article. So what is our sentiment engine? We will be using the simple **TextBlob** package to demo a rudimentary process to show you how things work. **TextBlob** is a higher level abstraction package that sits on top of **NLTK** (Natural Language Toolkit) which is a widely used package for this type of task. + +**NLTK** is quite a complex package which gives you a lot of control over the whole analytical process - but the cost of that is complexity and required knowledge of the steps invloved. **TextBlob** shields us from this complexity, but we should at some stage understand what is going on under the hood. Thankfully there is plenty of information to guide us in this. We will be implementing the default **PatternAnalyzer** which is based on the popular **Pattern** library though there is also a **NaiveBayesAnalyzer** which is a **NLTK** classifier based on a movie review corpus. + +All of this can be achieved in just a few lines of code. This is quite a dense codeblock - so I have commented the key steps. + + +```python +for idx, storyId in enumerate(df['storyId'].values): #for each row in our df dataframe + newsText = ek.get_news_story(storyId) #get the news story + if newsText: + soup = BeautifulSoup(newsText,"lxml") #create a BeautifulSoup object from our HTML news article + sentA = TextBlob(soup.get_text()) #pass the text only article to TextBlob to anaylse + df['Polarity'].iloc[idx] = sentA.sentiment.polarity #write sentiment polarity back to df + df['Subjectivity'].iloc[idx] = sentA.sentiment.subjectivity #write sentiment subjectivity score back to df + if sentA.sentiment.polarity >= 0.05: # attribute bucket to sentiment polartiy + score = 'positive' + elif -.05 < sentA.sentiment.polarity < 0.05: + score = 'neutral' + else: + score = 'negative' + df['Score'].iloc[idx] = score #write score back to df +df.head() +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScore
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positive
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positive
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG0.0000000.000000neutral
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG0.0000000.000000neutral
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS0.1750000.325000positive
+
+ + + +Looking at our dataframe we can now see 3 new columns on the right, *Polarity*, *Subjectivity* and *Score*. As we have seen *Polarity* is the actual sentiment polarity returned from **TextBlob** (ranging from -1(negative) to +1(positive), *Subjectivity* is a measure (ranging from 0 to 1) where 0 is very objective and 1 is very subjective, and *Score* is simply a Positive, Negative or Neutral rating based on the strength of the polarities. + +We would now like to see what, if any, impact this news has had on the shareprice of **IBM**. There are many ways of doing this - but to make things simple, I would like to see what the average return is at various points in time **AFTER** the news has broken. I want to check if there are *aggregate differences* in the *average returns* from the Positive, Neutral and Negative buckets we created earlier. + + +```python +start = df['versionCreated'].min().replace(hour=0,minute=0,second=0,microsecond=0).strftime('%Y/%m/%d') +end = df['versionCreated'].max().replace(hour=0,minute=0,second=0,microsecond=0).strftime('%Y/%m/%d') +Minute = ek.get_timeseries(["IBM.N"], start_date=start, interval="minute") +Minute.tail() +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IBM.NHIGHLOWOPENCLOSECOUNTVOLUME
Date
2018-01-05 15:21:00162.32162.18162.22162.3123.03073.0
2018-01-05 15:22:00162.42162.29162.31162.4223.02442.0
2018-01-05 15:23:00162.46162.43162.45162.4611.0960.0
2018-01-05 15:24:00162.46162.40162.46162.405.0505.0
2018-01-05 15:25:00162.39162.31162.36162.3312.01060.0
+
+ + + +We will need to create some new columns for the next part of this analysis. + + +```python +df['twoM'] = np.nan +df['fiveM'] = np.nan +df['tenM'] = np.nan +df['thirtyM'] = np.nan +df.head(2) +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScoretwoMfiveMtenMthirtyM
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positiveNaNNaNNaNNaN
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positiveNaNNaNNaNNaN
+
+ + + +OK so I now just need to get the timestamp of each news item, truncate it to minute data (ie remove second and microsecond components) and get the base shareprice of **IBM** at that time, and at several itervals after that time, in our case *t+2 mins,t+5 mins, t+10 mins, t+30 mins*, calculating the % change for each interval. + +An important point to bear in mind here is that news can be generated at anytime - 24 hours a day - outside of normal market hours. So for news generated outside normal market hours for **IBM** in our case, we would have to wait until the next market opening to conduct our calculations. Of course there are a number of issues here concerning our ability to attribute price movement to our news item in isolation (basically we cannot). That said, there might be other ways of doing this - for example looking at **GDRs/ADRs** or surrogates etc - these are beyond the scope of this introductory article. In our example, these news items are simply discarded. + +We will now loop through each news item in the dataframe, calculate (where possible) and store the derived performance numbers in the columns we created earlier: twoM...thirtyM. + + +```python +for idx, newsDate in enumerate(df['versionCreated'].values): + sTime = df['versionCreated'][idx] + sTime = sTime.replace(second=0,microsecond=0) + try: + t0 = Minute.iloc[Minute.index.get_loc(sTime),2] + df['twoM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=2))),3]/(t0)-1)*100) + df['fiveM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=5))),3]/(t0)-1)*100) + df['tenM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=10))),3]/(t0)-1)*100) + df['thirtyM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=30))),3]/(t0)-1)*100) + except: + pass +df.head() +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScoretwoMfiveMtenMthirtyM
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positiveNaNNaNNaNNaN
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positive0.0711190.0840500.000000-0.109911
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG0.0000000.000000neutral0.012944-0.090609-0.0323600.148858
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG0.0000000.000000neutral0.012944-0.090609-0.0323600.148858
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS0.1750000.325000positive0.0972380.1555810.0972380.246337
+
+ + + +Fantastic - we have now completed the analytical part of our study. Finally, we just need to aggregate our results by *Score* bucket in order to draw some conclusions. + + +```python +grouped = df.groupby(['Score']).mean() +grouped +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PolaritySubjectivitytwoMfiveMtenMthirtyM
Score
negative-0.1465080.316746NaNNaNNaNNaN
neutral0.0064360.175766-0.004829-0.0095020.0289790.137544
positive0.1292600.4068680.0120890.0127760.0359360.047345
+
+ + + +### Observations + +From our initial results - it would appear that there might be some small directional differences in returns between the positive and neutral groups over shorter time frames (twoM and fiveM) after news broke. This is a pretty good basis for further investigation. So where could we go from here? + +We have a relatively small *n* here so we might want to increase the size of the study. + +We might also want to try to seperate out more positive or negative news - ie change the threshold of the buckets to try to identify more prominent sentiment articles - maybe that could have more of an impact on performance. + +In terms of capturing news impact - we have thrown a lot of news articles out as they happened outside of market hours - as it is more complex to ascertain impact - we might try to find a way of including some of this in our analysis - I mentioned looking at overseas listings **GDR/ADRs** or surrogates above. Alternatively, we could using **EXACTLY** the same process looking at all news for an index future - say the **S&P500 emini** - as this trades on Globex pretty much round the clock - so we would be throwing out a lot less of the news articles? Great I hear you cry - but would each news article be able to influence a whole index? Are index futures more sensitive to some types of articles than others? Is there a temporal element to this? These are all excellent questions. Or what about cryptocrurrencies? They trade 24/7? and so on. + +We could also investigate what is going on with our sentiment engine. We might be able to generate more meaningful results by tinkering with the underlyng processes and parameters. Using a different, more domain-specific corpora might help us to generate more relevant scores. + +You will see there is plenty of scope to get much more involved here. + +This article was intended as an introduction to this most interesting of areas. I hope to have de-mystified this area for you somewhat and shown how it is possible to get started with this type of complex analysis using only a few lines of code, a simple easy to use yet powerfull API and some really fantastic packages, to generate some meaningful results. diff --git a/Untitled14.ipynb b/Untitled14.ipynb new file mode 100644 index 0000000..fbdc788 --- /dev/null +++ b/Untitled14.ipynb @@ -0,0 +1,862 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction to News Sentiment Analysis with Eikon Data APIs - a Python example\n", + "\n", + "This article will demonstrate how we can conduct a simple sentiment analysis of news delivered via our new [Eikon Data APIs](https://developers.thomsonreuters.com/eikon-data-apis). Natural Language Processing (NLP) is a big area of interest for those looking to gain insight and new sources of value from the vast quantities of unstructured data out there. The area is quite complex and there are many resources online that can help you familiarise yourself with this very interesting area. There are also many different packages that can help you as well as many different approaches to this problem. Whilst these are beyond the scope of this article - I will go through a simple implementation which will give you a swift enough introduction and practical codebase for further exploration and learning.\n", + "\n", + "**Pre-requisites:** \n", + "\n", + "**Thomson Reuters Eikon** with access to new [Eikon Data APIs](https://developers.thomsonreuters.com/eikon-data-apis)\n", + "\n", + "**Python 2.x/3.x**\n", + "\n", + "**Required Python Packages:** eikon, pandas, numpy, beautifulsoup, textblob, datetime \n", + "\n", + "**Required corpora download:** >>>python -m textblob.download_corpora (this is required by the sentiment engine to generate sentiment)\n", + "\n", + "### Introduction\n", + "\n", + "NLP is a field which enables computers to understand human language (voice or text). This is quite a big area of research and a little enquiry on your part will furnish you with the complexities of this problem set. Here we will be focussing on one application of this called *Sentiment Analysis*. In our case we will be taking news articles(unstructured text) for a particular company, **IBM**, and we will attempt to grade this news to see how postive, negative or neutral it is. We will then try to see if this news has had an impact on the shareprice of **IBM**. \n", + "\n", + "To do this really well is a non-trivial task, and most universtities and financial companies will have departments and teams looking at this. We ourselves provide machine readable news products with News Analytics (such as sentiment) over our **Elektron** platform in realtime at very low latency - these products are essentially consumed by *algorithmic applications* as opposed to *humans*. \n", + "\n", + "We will try to do a similar thing as simply as possible to illustrate the key elements - our task is significantly eased by not having to do this in a low latency environment. We will be abstracting most of the complexities to do with the mechanics of actually analysing the text to various packages. You can then easily replace the modules such as the sentiment engine etc to improve your results as your understanding increases. \n", + "\n", + "So lets get started. First lets load the packages that we will need to use and set our app_id. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import eikon as ek\n", + "import pandas as pd\n", + "import numpy as np\n", + "from bs4 import BeautifulSoup\n", + "from textblob import TextBlob\n", + "import datetime\n", + "from datetime import time\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "ek.set_app_id('YOUR APP ID HERE')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are two API calls for news:\n", + "\n", + "**get_news_headlines** : returns a list of news headlines satisfying a query\n", + "\n", + "**get_news_story** : returns a HTML representation of the full news article\n", + "\n", + "We will need to use both - thankfully they are really straightforward to use. We will need to use **get_news_headlines** API call to request a list of headlines. The first parameter for this call is a query. You dont really need to know this query language as you can generate it using the **News Monitor App** (type **NEWS** into Eikon search bar) in **Eikon**. \n", + "\n", + "You can see here I have just typed in 2 search terms, **IBM**, for the company, and, **English**, for the language I am interested in (in our example we will only be able to analyse English language text - though there are corpora, packages, methods you can employ to target other languages - though these are beyond the scope of this article). You can of course use any search terms you wish.\n", + "\n", + "![News App 1](Article 14 One.jpg)\n", + "\n", + "After you have typed in what you want to search for - we can simply click in the search box and this will then generate the query text which we can then copy and paste into the API call below. Its easy for us to change logical operations such as **AND** to **OR**, **NOT** to suit our query. \n", + "\n", + "![News App 2](Article 14 Two.png)\n", + "\n", + "So the line of code below gets us 100 news headlines for **IBM** in english prior to 4th Dec 2017, and stores them in a dataframe, df for us." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
versionCreatedtextstoryIdsourceCode
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS
\n", + "
" + ], + "text/plain": [ + " versionCreated \\\n", + "2017-12-01 23:11:47.374 2017-12-01 23:11:47.374 \n", + "2017-12-01 19:19:20.279 2017-12-01 19:19:20.279 \n", + "2017-12-01 18:12:41.143 2017-12-01 18:12:41.143 \n", + "2017-12-01 18:12:41.019 2017-12-01 18:12:41.019 \n", + "2017-12-01 18:06:03.633 2017-12-01 18:06:03.633 \n", + "\n", + " text \\\n", + "2017-12-01 23:11:47.374 Reuters Insider - FM Final Trade: HAL, TWTR & ... \n", + "2017-12-01 19:19:20.279 IBM ST: the upside prevails as long as 150.2 i... \n", + "2017-12-01 18:12:41.143 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:12:41.019 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:06:03.633 Moody's Affirms Seven Classes of GSMS 2016-GS4 \n", + "\n", + " storyId \\\n", + "2017-12-01 23:11:47.374 urn:newsml:reuters.com:20171201:nRTV8KBb1N:1 \n", + "2017-12-01 19:19:20.279 urn:newsml:reuters.com:20171201:nGUR2R6xQ:1 \n", + "2017-12-01 18:12:41.143 urn:newsml:reuters.com:20171201:nEOL6JJfRT:1 \n", + "2017-12-01 18:12:41.019 urn:newsml:reuters.com:20171201:nEOL3YHcVY:1 \n", + "2017-12-01 18:06:03.633 urn:newsml:reuters.com:20171201:nMDY7wGNTP:1 \n", + "\n", + " sourceCode \n", + "2017-12-01 23:11:47.374 NS:CNBC \n", + "2017-12-01 19:19:20.279 NS:GURU \n", + "2017-12-01 18:12:41.143 NS:EDG \n", + "2017-12-01 18:12:41.019 NS:EDG \n", + "2017-12-01 18:06:03.633 NS:RTRS " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = ek.get_news_headlines('R:IBM.N AND Language:LEN', date_to = \"2017-12-04\", count=100)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I will just add 3 new columns which we will need to store some variables in later." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df['Polarity'] = np.nan\n", + "df['Subjectivity'] = np.nan\n", + "df['Score'] = np.nan" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we have our frame with the most recent 100 news headline items. The headline is stored in the **text** column and the storyID which we will now use to pull down the actual articles themselves, is stored in the **storyID** column. \n", + "\n", + "We will now iterate through the headline dataframe and pull down the news articles using the second of our news API calls, get_news_story. We simply pass the **storyID** to this API call and we are returned a HTML representation of the article - which allows you to render them nicely etc - however for our purposes we want to strip the HTML tags etc out and just be left with the plain text - as we dont want to analyse HTML tags for sentiment. We will do this using the excellent **BeautifulSoup** package.\n", + "\n", + "Once we have the text of these articles we can pass them to our sentiment engine which will give us a sentiment score for each article. So what is our sentiment engine? We will be using the simple **TextBlob** package to demo a rudimentary process to show you how things work. **TextBlob** is a higher level abstraction package that sits on top of **NLTK** (Natural Language Toolkit) which is a widely used package for this type of task. \n", + "\n", + "**NLTK** is quite a complex package which gives you a lot of control over the whole analytical process - but the cost of that is complexity and required knowledge of the steps invloved. **TextBlob** shields us from this complexity, but we should at some stage understand what is going on under the hood. Thankfully there is plenty of information to guide us in this. We will be implementing the default **PatternAnalyzer** which is based on the popular **Pattern** library though there is also a **NaiveBayesAnalyzer** which is a **NLTK** classifier based on a movie review corpus. \n", + "\n", + "All of this can be achieved in just a few lines of code. This is quite a dense codeblock - so I have commented the key steps. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScore
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positive
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positive
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG0.0000000.000000neutral
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG0.0000000.000000neutral
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS0.1750000.325000positive
\n", + "
" + ], + "text/plain": [ + " versionCreated \\\n", + "2017-12-01 23:11:47.374 2017-12-01 23:11:47.374 \n", + "2017-12-01 19:19:20.279 2017-12-01 19:19:20.279 \n", + "2017-12-01 18:12:41.143 2017-12-01 18:12:41.143 \n", + "2017-12-01 18:12:41.019 2017-12-01 18:12:41.019 \n", + "2017-12-01 18:06:03.633 2017-12-01 18:06:03.633 \n", + "\n", + " text \\\n", + "2017-12-01 23:11:47.374 Reuters Insider - FM Final Trade: HAL, TWTR & ... \n", + "2017-12-01 19:19:20.279 IBM ST: the upside prevails as long as 150.2 i... \n", + "2017-12-01 18:12:41.143 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:12:41.019 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:06:03.633 Moody's Affirms Seven Classes of GSMS 2016-GS4 \n", + "\n", + " storyId \\\n", + "2017-12-01 23:11:47.374 urn:newsml:reuters.com:20171201:nRTV8KBb1N:1 \n", + "2017-12-01 19:19:20.279 urn:newsml:reuters.com:20171201:nGUR2R6xQ:1 \n", + "2017-12-01 18:12:41.143 urn:newsml:reuters.com:20171201:nEOL6JJfRT:1 \n", + "2017-12-01 18:12:41.019 urn:newsml:reuters.com:20171201:nEOL3YHcVY:1 \n", + "2017-12-01 18:06:03.633 urn:newsml:reuters.com:20171201:nMDY7wGNTP:1 \n", + "\n", + " sourceCode Polarity Subjectivity Score \n", + "2017-12-01 23:11:47.374 NS:CNBC 0.066667 0.566667 positive \n", + "2017-12-01 19:19:20.279 NS:GURU 0.055260 0.320844 positive \n", + "2017-12-01 18:12:41.143 NS:EDG 0.000000 0.000000 neutral \n", + "2017-12-01 18:12:41.019 NS:EDG 0.000000 0.000000 neutral \n", + "2017-12-01 18:06:03.633 NS:RTRS 0.175000 0.325000 positive " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for idx, storyId in enumerate(df['storyId'].values): #for each row in our df dataframe\n", + " newsText = ek.get_news_story(storyId) #get the news story\n", + " if newsText:\n", + " soup = BeautifulSoup(newsText,\"lxml\") #create a BeautifulSoup object from our HTML news article\n", + " sentA = TextBlob(soup.get_text()) #pass the text only article to TextBlob to anaylse\n", + " df['Polarity'].iloc[idx] = sentA.sentiment.polarity #write sentiment polarity back to df\n", + " df['Subjectivity'].iloc[idx] = sentA.sentiment.subjectivity #write sentiment subjectivity score back to df\n", + " if sentA.sentiment.polarity >= 0.05: # attribute bucket to sentiment polartiy\n", + " score = 'positive'\n", + " elif -.05 < sentA.sentiment.polarity < 0.05:\n", + " score = 'neutral'\n", + " else:\n", + " score = 'negative'\n", + " df['Score'].iloc[idx] = score #write score back to df\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looking at our dataframe we can now see 3 new columns on the right, *Polarity*, *Subjectivity* and *Score*. As we have seen *Polarity* is the actual sentiment polarity returned from **TextBlob** (ranging from -1(negative) to +1(positive), *Subjectivity* is a measure (ranging from 0 to 1) where 0 is very objective and 1 is very subjective, and *Score* is simply a Positive, Negative or Neutral rating based on the strength of the polarities. \n", + "\n", + "We would now like to see what, if any, impact this news has had on the shareprice of **IBM**. There are many ways of doing this - but to make things simple, I would like to see what the average return is at various points in time **AFTER** the news has broken. I want to check if there are *aggregate differences* in the *average returns* from the Positive, Neutral and Negative buckets we created earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IBM.NHIGHLOWOPENCLOSECOUNTVOLUME
Date
2018-01-05 15:21:00162.32162.18162.22162.3123.03073.0
2018-01-05 15:22:00162.42162.29162.31162.4223.02442.0
2018-01-05 15:23:00162.46162.43162.45162.4611.0960.0
2018-01-05 15:24:00162.46162.40162.46162.405.0505.0
2018-01-05 15:25:00162.39162.31162.36162.3312.01060.0
\n", + "
" + ], + "text/plain": [ + "IBM.N HIGH LOW OPEN CLOSE COUNT VOLUME\n", + "Date \n", + "2018-01-05 15:21:00 162.32 162.18 162.22 162.31 23.0 3073.0\n", + "2018-01-05 15:22:00 162.42 162.29 162.31 162.42 23.0 2442.0\n", + "2018-01-05 15:23:00 162.46 162.43 162.45 162.46 11.0 960.0\n", + "2018-01-05 15:24:00 162.46 162.40 162.46 162.40 5.0 505.0\n", + "2018-01-05 15:25:00 162.39 162.31 162.36 162.33 12.0 1060.0" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "start = df['versionCreated'].min().replace(hour=0,minute=0,second=0,microsecond=0).strftime('%Y/%m/%d')\n", + "end = df['versionCreated'].max().replace(hour=0,minute=0,second=0,microsecond=0).strftime('%Y/%m/%d')\n", + "Minute = ek.get_timeseries([\"IBM.N\"], start_date=start, interval=\"minute\")\n", + "Minute.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will need to create some new columns for the next part of this analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScoretwoMfiveMtenMthirtyM
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positiveNaNNaNNaNNaN
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positiveNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " versionCreated \\\n", + "2017-12-01 23:11:47.374 2017-12-01 23:11:47.374 \n", + "2017-12-01 19:19:20.279 2017-12-01 19:19:20.279 \n", + "\n", + " text \\\n", + "2017-12-01 23:11:47.374 Reuters Insider - FM Final Trade: HAL, TWTR & ... \n", + "2017-12-01 19:19:20.279 IBM ST: the upside prevails as long as 150.2 i... \n", + "\n", + " storyId \\\n", + "2017-12-01 23:11:47.374 urn:newsml:reuters.com:20171201:nRTV8KBb1N:1 \n", + "2017-12-01 19:19:20.279 urn:newsml:reuters.com:20171201:nGUR2R6xQ:1 \n", + "\n", + " sourceCode Polarity Subjectivity Score twoM \\\n", + "2017-12-01 23:11:47.374 NS:CNBC 0.066667 0.566667 positive NaN \n", + "2017-12-01 19:19:20.279 NS:GURU 0.055260 0.320844 positive NaN \n", + "\n", + " fiveM tenM thirtyM \n", + "2017-12-01 23:11:47.374 NaN NaN NaN \n", + "2017-12-01 19:19:20.279 NaN NaN NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['twoM'] = np.nan\n", + "df['fiveM'] = np.nan\n", + "df['tenM'] = np.nan\n", + "df['thirtyM'] = np.nan\n", + "df.head(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OK so I now just need to get the timestamp of each news item, truncate it to minute data (ie remove second and microsecond components) and get the base shareprice of **IBM** at that time, and at several itervals after that time, in our case *t+2 mins,t+5 mins, t+10 mins, t+30 mins*, calculating the % change for each interval. \n", + "\n", + "An important point to bear in mind here is that news can be generated at anytime - 24 hours a day - outside of normal market hours. So for news generated outside normal market hours for **IBM** in our case, we would have to wait until the next market opening to conduct our calculations. Of course there are a number of issues here concerning our ability to attribute price movement to our news item in isolation (basically we cannot). That said, there might be other ways of doing this - for example looking at **GDRs/ADRs** or surrogates etc - these are beyond the scope of this introductory article. In our example, these news items are simply discarded. \n", + "\n", + "We will now loop through each news item in the dataframe, calculate (where possible) and store the derived performance numbers in the columns we created earlier: twoM...thirtyM." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
versionCreatedtextstoryIdsourceCodePolaritySubjectivityScoretwoMfiveMtenMthirtyM
2017-12-01 23:11:47.3742017-12-01 23:11:47.374Reuters Insider - FM Final Trade: HAL, TWTR & ...urn:newsml:reuters.com:20171201:nRTV8KBb1N:1NS:CNBC0.0666670.566667positiveNaNNaNNaNNaN
2017-12-01 19:19:20.2792017-12-01 19:19:20.279IBM ST: the upside prevails as long as 150.2 i...urn:newsml:reuters.com:20171201:nGUR2R6xQ:1NS:GURU0.0552600.320844positive0.0711190.0840500.000000-0.109911
2017-12-01 18:12:41.1432017-12-01 18:12:41.143INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL6JJfRT:1NS:EDG0.0000000.000000neutral0.012944-0.090609-0.0323600.148858
2017-12-01 18:12:41.0192017-12-01 18:12:41.019INTERNATIONAL BUSINESS MACHINES CORP SEC Filin...urn:newsml:reuters.com:20171201:nEOL3YHcVY:1NS:EDG0.0000000.000000neutral0.012944-0.090609-0.0323600.148858
2017-12-01 18:06:03.6332017-12-01 18:06:03.633Moody's Affirms Seven Classes of GSMS 2016-GS4urn:newsml:reuters.com:20171201:nMDY7wGNTP:1NS:RTRS0.1750000.325000positive0.0972380.1555810.0972380.246337
\n", + "
" + ], + "text/plain": [ + " versionCreated \\\n", + "2017-12-01 23:11:47.374 2017-12-01 23:11:47.374 \n", + "2017-12-01 19:19:20.279 2017-12-01 19:19:20.279 \n", + "2017-12-01 18:12:41.143 2017-12-01 18:12:41.143 \n", + "2017-12-01 18:12:41.019 2017-12-01 18:12:41.019 \n", + "2017-12-01 18:06:03.633 2017-12-01 18:06:03.633 \n", + "\n", + " text \\\n", + "2017-12-01 23:11:47.374 Reuters Insider - FM Final Trade: HAL, TWTR & ... \n", + "2017-12-01 19:19:20.279 IBM ST: the upside prevails as long as 150.2 i... \n", + "2017-12-01 18:12:41.143 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:12:41.019 INTERNATIONAL BUSINESS MACHINES CORP SEC Filin... \n", + "2017-12-01 18:06:03.633 Moody's Affirms Seven Classes of GSMS 2016-GS4 \n", + "\n", + " storyId \\\n", + "2017-12-01 23:11:47.374 urn:newsml:reuters.com:20171201:nRTV8KBb1N:1 \n", + "2017-12-01 19:19:20.279 urn:newsml:reuters.com:20171201:nGUR2R6xQ:1 \n", + "2017-12-01 18:12:41.143 urn:newsml:reuters.com:20171201:nEOL6JJfRT:1 \n", + "2017-12-01 18:12:41.019 urn:newsml:reuters.com:20171201:nEOL3YHcVY:1 \n", + "2017-12-01 18:06:03.633 urn:newsml:reuters.com:20171201:nMDY7wGNTP:1 \n", + "\n", + " sourceCode Polarity Subjectivity Score \\\n", + "2017-12-01 23:11:47.374 NS:CNBC 0.066667 0.566667 positive \n", + "2017-12-01 19:19:20.279 NS:GURU 0.055260 0.320844 positive \n", + "2017-12-01 18:12:41.143 NS:EDG 0.000000 0.000000 neutral \n", + "2017-12-01 18:12:41.019 NS:EDG 0.000000 0.000000 neutral \n", + "2017-12-01 18:06:03.633 NS:RTRS 0.175000 0.325000 positive \n", + "\n", + " twoM fiveM tenM thirtyM \n", + "2017-12-01 23:11:47.374 NaN NaN NaN NaN \n", + "2017-12-01 19:19:20.279 0.071119 0.084050 0.000000 -0.109911 \n", + "2017-12-01 18:12:41.143 0.012944 -0.090609 -0.032360 0.148858 \n", + "2017-12-01 18:12:41.019 0.012944 -0.090609 -0.032360 0.148858 \n", + "2017-12-01 18:06:03.633 0.097238 0.155581 0.097238 0.246337 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for idx, newsDate in enumerate(df['versionCreated'].values):\n", + " sTime = df['versionCreated'][idx]\n", + " sTime = sTime.replace(second=0,microsecond=0)\n", + " try:\n", + " t0 = Minute.iloc[Minute.index.get_loc(sTime),2]\n", + " df['twoM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=2))),3]/(t0)-1)*100)\n", + " df['fiveM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=5))),3]/(t0)-1)*100)\n", + " df['tenM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=10))),3]/(t0)-1)*100) \n", + " df['thirtyM'][idx] = ((Minute.iloc[Minute.index.get_loc((sTime + datetime.timedelta(minutes=30))),3]/(t0)-1)*100)\n", + " except:\n", + " pass\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fantastic - we have now completed the analytical part of our study. Finally, we just need to aggregate our results by *Score* bucket in order to draw some conclusions. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PolaritySubjectivitytwoMfiveMtenMthirtyM
Score
negative-0.1465080.316746NaNNaNNaNNaN
neutral0.0064360.175766-0.004829-0.0095020.0289790.137544
positive0.1292600.4068680.0120890.0127760.0359360.047345
\n", + "
" + ], + "text/plain": [ + " Polarity Subjectivity twoM fiveM tenM thirtyM\n", + "Score \n", + "negative -0.146508 0.316746 NaN NaN NaN NaN\n", + "neutral 0.006436 0.175766 -0.004829 -0.009502 0.028979 0.137544\n", + "positive 0.129260 0.406868 0.012089 0.012776 0.035936 0.047345" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grouped = df.groupby(['Score']).mean()\n", + "grouped" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Observations\n", + "\n", + "From our initial results - it would appear that there might be some small directional differences in returns between the positive and neutral groups over shorter time frames (twoM and fiveM) after news broke. This is a pretty good basis for further investigation. So where could we go from here?\n", + "\n", + "We have a relatively small *n* here so we might want to increase the size of the study. \n", + "\n", + "We might also want to try to seperate out more positive or negative news - ie change the threshold of the buckets to try to identify more prominent sentiment articles - maybe that could have more of an impact on performance. \n", + "\n", + "In terms of capturing news impact - we have thrown a lot of news articles out as they happened outside of market hours - as it is more complex to ascertain impact - we might try to find a way of including some of this in our analysis - I mentioned looking at overseas listings **GDR/ADRs** or surrogates above. Alternatively, we could using **EXACTLY** the same process looking at all news for an index future - say the **S&P500 emini** - as this trades on Globex pretty much round the clock - so we would be throwing out a lot less of the news articles? Great I hear you cry - but would each news article be able to influence a whole index? Are index futures more sensitive to some types of articles than others? Is there a temporal element to this? These are all excellent questions. Or what about cryptocrurrencies? They trade 24/7? and so on.\n", + "\n", + "We could also investigate what is going on with our sentiment engine. We might be able to generate more meaningful results by tinkering with the underlyng processes and parameters. Using a different, more domain-specific corpora might help us to generate more relevant scores. \n", + "\n", + "You will see there is plenty of scope to get much more involved here. \n", + "\n", + "This article was intended as an introduction to this most interesting of areas. I hope to have de-mystified this area for you somewhat and shown how it is possible to get started with this type of complex analysis using only a few lines of code, a simple easy to use yet powerfull API and some really fantastic packages, to generate some meaningful results." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}