├── .ipynb_checkpoints └── Stock Sentiment Algo Trading-checkpoint.ipynb ├── Stock Sentiment Algo Trading.ipynb ├── lexicon_data ├── lm_negative.csv ├── lm_positive.csv └── stock_lex.csv ├── results ├── Figure_0.png ├── results.gif └── text generation.gif └── test ├── BABA.csv ├── strat.py ├── strat.pyc └── test.py /.ipynb_checkpoints/Stock Sentiment Algo Trading-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Initialize Sentiment Analyzer" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import nltk\n", 17 | "import warnings\n", 18 | "warnings.filterwarnings('ignore')\n", 19 | "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", 20 | "# nltk.download('vader_lexicon')\n", 21 | "\n", 22 | "sia = SentimentIntensityAnalyzer()" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "Updating Vader Lexicon with External Lexicon" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "# import csv\n", 39 | "# import pandas as pd\n", 40 | "\n", 41 | "# # stock market lexicon\n", 42 | "# stock_lex = pd.read_csv('lexicon_data/stock_lex.csv')\n", 43 | "# stock_lex['sentiment'] = (stock_lex['Aff_Score'] + stock_lex['Neg_Score'])/2\n", 44 | "# stock_lex = dict(zip(stock_lex.Item, stock_lex.sentiment))\n", 45 | "# stock_lex = {k:v for k,v in stock_lex.items() if len(k.split(' '))==1}\n", 46 | "# stock_lex_scaled = {}\n", 47 | "# for k, v in stock_lex.items():\n", 48 | "# if v > 0:\n", 49 | "# stock_lex_scaled[k] = v / max(stock_lex.values()) * 4\n", 50 | "# else:\n", 51 | "# stock_lex_scaled[k] = v / min(stock_lex.values()) * -4\n", 52 | "\n", 53 | "# # # Loughran and McDonald\n", 54 | "# # positive = []\n", 55 | "# # with open('lexicon_data/lm_positive.csv', 'r') as f:\n", 56 | "# # reader = csv.reader(f)\n", 57 | "# # for row in reader:\n", 58 | "# # positive.append(row[0].strip())\n", 59 | " \n", 60 | "# # negative = []\n", 61 | "# # with open('lexicon_data/lm_negative.csv', 'r') as f:\n", 62 | "# # reader = csv.reader(f)\n", 63 | "# # for row in reader:\n", 64 | "# # entry = row[0].strip().split(\" \")\n", 65 | "# # if len(entry) > 1:\n", 66 | "# # negative.extend(entry)\n", 67 | "# # else:\n", 68 | "# # negative.append(entry[0])\n", 69 | "\n", 70 | "# final_lex = {}\n", 71 | "# # final_lex.update({word:2.0 for word in positive})\n", 72 | "# # final_lex.update({word:-2.0 for word in negative})\n", 73 | "# final_lex.update(stock_lex_scaled)\n", 74 | "# final_lex.update(sia.lexicon)\n", 75 | "# sia.lexicon = final_lex" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "Scraping FB posts from Business Times" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 2, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "name": "stdout", 92 | "output_type": "stream", 93 | "text": [ 94 | "23 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-to-pay-100m-euros-in-italian-fiscal-accord\n", 95 | "22 Nov 2018 https://www.businesstimes.com.sg/consumer/departing-facebook-communications-chief-says-critics-were-targeted\n", 96 | "22 Nov 2018 https://www.businesstimes.com.sg/technology/zuckerberg-says-he-is-not-considering-resigning-from-facebook\n", 97 | "21 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-services-tripped-up-by-server-problem\n", 98 | "17 Nov 2018 https://www.businesstimes.com.sg/government-economy/i-dont-really-want-to-work-for-facebook-so-say-some-computer-science-students\n", 99 | "16 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-to-launch-independent-body-for-calls-on-content\n", 100 | "14 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-shuts-more-accounts-aimed-at-political-meddling\n", 101 | "13 Nov 2018 https://www.businesstimes.com.sg/hub/asean-singapore-2018/facebook-courting-startups-and-smes\n", 102 | "09 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-takes-questions-on-portals-features\n", 103 | "08 Nov 2018 https://www.businesstimes.com.sg/technology/russian-trolls-were-at-it-again-before-us-mid-term-polls-says-facebook\n", 104 | "07 Nov 2018 https://www.businesstimes.com.sg/government-economy/russian-trolls-were-at-it-again-before-midterms-facebook-says\n", 105 | "31 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-quarterly-profit-climbs-9-to-us514b\n", 106 | "29 Oct 2018 https://www.businesstimes.com.sg/technology/ahead-of-facebook-earnings-analysts-hope-it-cant-get-any-worse\n", 107 | "27 Oct 2018 https://www.businesstimes.com.sg/government-economy/facebook-blocks-iran-linked-bid-to-sway-us-british-politics\n", 108 | "26 Oct 2018 https://www.businesstimes.com.sg/companies-markets/dbs-launches-chatbot-to-take-orders-via-facebook-messenger\n", 109 | "25 Oct 2018 https://www.businesstimes.com.sg/consumer/dbs-unveils-chatbot-for-ordering-paying-for-meals-through-facebook-messenger\n", 110 | "24 Oct 2018 https://www.businesstimes.com.sg/technology/oculus-brendan-iribe-is-latest-founder-to-leave-facebook\n", 111 | "23 Oct 2018 https://www.businesstimes.com.sg/government-economy/facebook-shuts-accounts-of-marketing-group-in-brazil-election\n", 112 | "19 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-hires-ex-uk-deputy-pm-clegg-to-lead-lobbying-effort\n", 113 | "18 Oct 2018 https://www.businesstimes.com.sg/technology/at-facebook-public-funds-join-push-to-remove-zuckerberg-as-chairman\n", 114 | "13 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-now-says-data-breach-affected-29m-users-details-impact\n", 115 | "13 Oct 2018 https://www.businesstimes.com.sg/investing-wealth/oh-no-accidental-facebook-post\n", 116 | "12 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-purges-251-accounts-to-thwart-deception\n", 117 | "10 Oct 2018 https://www.businesstimes.com.sg/technology/facebooks-whatsapp-says-has-fixed-video-call-security-bug\n", 118 | "10 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-seeing-growth-in-business-network-workplace\n", 119 | "08 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-launches-ai-video-calling-device-portal\n", 120 | "05 Oct 2018 https://www.businesstimes.com.sg/technology/irish-data-authority-probes-facebook-over-breach\n", 121 | "04 Oct 2018 https://www.businesstimes.com.sg/technology/irish-data-authority-probes-facebook-over-breach-of-50m-accounts\n", 122 | "03 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-says-no-sign-recent-hack-spread-to-other-apps\n", 123 | "03 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-adds-new-tools-to-stem-online-bullying\n", 124 | "03 Oct 2018 https://www.businesstimes.com.sg/startups/facebook-imda-start-accelerator-for-data-startups\n", 125 | "03 Oct 2018 https://www.businesstimes.com.sg/stocks/us-dow-closes-at-record-but-facebook-drags-on-sp-nasdaq\n", 126 | "02 Oct 2018 https://www.businesstimes.com.sg/asean-business/facebook-imda-to-launch-startup-accelerator-in-singapore-in-february\n", 127 | "02 Oct 2018 https://www.businesstimes.com.sg/startups/facebook-imdas-startup-accelerator-to-kick-off-in-february-2019-in-singapore\n", 128 | "02 Oct 2018 https://www.businesstimes.com.sg/companies-markets/ges-us500b-market-wipeout-is-like-erasing-facebook\n", 129 | "01 Oct 2018 https://www.businesstimes.com.sg/technology/facebooks-worst-security-breach-batters-user-trust-once-again\n", 130 | "29 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-discloses-security-breach-affecting-50-million-users\n", 131 | "29 Sep 2018 https://www.businesstimes.com.sg/stocks/us-facebooks-slide-stalls-intel-led-advance-on-wall-street\n", 132 | "28 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-admits-phone-numbers-may-be-used-to-target-ads\n", 133 | "27 Sep 2018 https://www.businesstimes.com.sg/technology/google-facebook-and-twitter-agree-to-fight-fake-news-in-the-eu\n", 134 | "27 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-faces-political-hurdle-over-banned-party-in-china\n", 135 | "26 Sep 2018 https://www.businesstimes.com.sg/technology/co-founders-of-instagram-facebooks-main-success-story-quit\n", 136 | "25 Sep 2018 https://www.businesstimes.com.sg/technology/instagram-founders-clash-with-zuckerberg-leave-facebook\n", 137 | "24 Sep 2018 https://www.businesstimes.com.sg/technology/white-house-considers-draft-order-to-look-into-google-facebook\n", 138 | "21 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-expands-fake-election-news-fight-but-falsehoods-still-rampant\n", 139 | "20 Sep 2018 https://www.businesstimes.com.sg/government-economy/facebook-building-a-war-room-to-battle-election-meddling\n", 140 | "20 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-accused-of-allowing-bias-against-women-in-job-ads\n", 141 | "19 Sep 2018 https://www.businesstimes.com.sg/companies-markets/sembcorp-inks-20-year-deal-to-provide-solar-energy-for-facebook-singapore\n", 142 | "18 Sep 2018 https://www.businesstimes.com.sg/companies-markets/sembcorp-inks-20-year-deal-to-supply-solar-power-to-facebooks-singapore-operations\n", 143 | "15 Sep 2018 https://www.businesstimes.com.sg/technology/facebook%E2%80%99s-mark-zuckerberg-to-testify-in-november-in-investor-suit\n", 144 | "07 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-co-founder-sees-more-regulation-for-social-networks\n", 145 | "07 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-twitter-come-under-us-pressure-to-make-rules-clearer\n", 146 | "07 Sep 2018 https://www.businesstimes.com.sg/startups/facebook-to-build-s14b-data-centre-in-singapore-its-first-in-asia-0\n", 147 | "06 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-removes-burmese-translation-feature-after-reuters-report\n", 148 | "06 Sep 2018 https://www.businesstimes.com.sg/asean-business/facebook-to-build-its-first-data-centre-in-singapore\n", 149 | "06 Sep 2018 https://www.businesstimes.com.sg/startups/facebook-to-build-s14b-data-centre-in-singapore-its-first-in-asia\n", 150 | "05 Sep 2018 https://www.businesstimes.com.sg/government-economy/facebook-chief-says-internet-firms-in-arms-race-for-democracy\n", 151 | "05 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-accuses-blackberry-of-stealing-voice-messaging-tech\n", 152 | "05 Sep 2018 https://www.businesstimes.com.sg/technology/europes-news-agencies-blast-google-facebook-for-plundering-content\n", 153 | "04 Sep 2018 https://www.businesstimes.com.sg/technology/in-india-google-races-to-parry-the-rise-of-facebook\n", 154 | "04 Sep 2018 https://www.businesstimes.com.sg/technology/brief-facebook-outage-reported-by-users\n", 155 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-rolls-out-video-service-worldwide-0\n", 156 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-rolls-out-video-service-worldwide\n", 157 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/dozens-at-facebook-unite-to-challenge-its-%E2%80%98intolerant%E2%80%99-liberal-culture\n", 158 | "28 Aug 2018 https://www.businesstimes.com.sg/banking-finance/dbs-says-employee-who-posted-image-of-ripped-singapore-flag-on-facebook-no-longer\n", 159 | "28 Aug 2018 https://www.businesstimes.com.sg/government-economy/facebook-move-on-myanmar-raises-thorny-political-questions\n", 160 | "24 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-suspends-hundreds-of-apps-over-data-concerns\n", 161 | "23 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-suspends-400-apps-in-data-leak-probe\n", 162 | "23 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-to-pull-vpn-app-from-app-store-over-data-worry\n", 163 | "22 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-cuts-ad-target-options-to-thwart-discrimination\n", 164 | "22 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-stops-misinformation-campaigns-tied-to-iran-russia\n" 165 | ] 166 | }, 167 | { 168 | "name": "stdout", 169 | "output_type": "stream", 170 | "text": [ 171 | "21 Aug 2018 https://www.businesstimes.com.sg/technology/dangerous-for-twitter-facebook-to-ban-accounts-says-trump\n", 172 | "13 Aug 2018 https://www.businesstimes.com.sg/technology/facebooks-david-marcus-resigns-from-coinbase-board-in-blockchain-push\n", 173 | "07 Aug 2018 https://www.businesstimes.com.sg/technology/a-generation-grows-up-in-china-without-google-facebook-or-twitter\n", 174 | "07 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-shares-rise-on-optimism-for-banking-relationships\n", 175 | "04 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-fakers-get-better-at-covering-tracks-security-experts-say\n", 176 | "01 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-uncovers-political-influence-campaign-ahead-of-us-midterm-elections\n", 177 | "30 Jul 2018 https://www.businesstimes.com.sg/technology/cost-of-policing-facebook-twitter-spooking-wall-street\n", 178 | "28 Jul 2018 https://www.businesstimes.com.sg/life-culture/facebook-suspends-us-conspiracy-theorist-alex-jones\n", 179 | "28 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-is-sued-after-stock-plunge-shocked-market\n", 180 | "28 Jul 2018 https://www.businesstimes.com.sg/investing-wealth/how-facebook-suddenly-went-so-wrong-so-fast\n", 181 | "27 Jul 2018 https://www.businesstimes.com.sg/stocks/us-facebook-dives-weighing-on-stocks\n", 182 | "27 Jul 2018 https://www.businesstimes.com.sg/government-economy/top-facebook-twitter-executives-to-testify-in-sept-on-us-election-meddling\n", 183 | "27 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-to-add-shaq-show-and-singing-contest-to-video-lineup\n", 184 | "27 Jul 2018 https://www.businesstimes.com.sg/stocks/facebook-controversies-hit-it-where-it-hurts-most-growth\n", 185 | "26 Jul 2018 https://www.businesstimes.com.sg/stocks/zuckerberg-loses-us16b-in-record-facebook-fall\n", 186 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/indias-cbi-to-investigate-facebook-cambridge-analytica-data-theft\n", 187 | "26 Jul 2018 https://www.businesstimes.com.sg/stocks/us-nasdaq-falls-at-open-as-facebook-leads-tech-selloff\n", 188 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-hammered-as-user-growth-cools\n", 189 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-legally-bound-to-stop-discriminatory-advertising\n", 190 | "25 Jul 2018 https://www.businesstimes.com.sg/technology/china-to-pull-approval-for-facebooks-planned-venture\n", 191 | "25 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-to-double-its-amount-of-office-space-in-london\n", 192 | "24 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-doubles-down-on-london-with-space-for-6000-workers\n", 193 | "20 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-faces-delay-to-whatsapp-payments-in-india\n", 194 | "19 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-cracks-down-on-bogus-posts-inciting-violence\n", 195 | "19 Jul 2018 https://www.businesstimes.com.sg/technology/trump-is-the-biggest-buyer-of-political-ads-on-facebook\n", 196 | "13 Jul 2018 https://www.businesstimes.com.sg/technology/heirs-can-access-facebook-account-of-deceased-relatives-german-court\n", 197 | "11 Jul 2018 https://www.businesstimes.com.sg/technology/british-regulator-to-fine-facebook-over-data-protection-breaches\n", 198 | "10 Jul 2018 https://www.businesstimes.com.sg/technology/with-regulators-wary-facebook-is-poring-over-its-prize-asset-your-face\n", 199 | "05 Jul 2018 https://www.businesstimes.com.sg/opinion/facebook-not-the-only-one-that-needs-examination-regulation\n", 200 | "{datetime.date(2018, 11, 24): 0.288, datetime.date(2018, 11, 23): -0.84, datetime.date(2018, 11, 22): -0.903, datetime.date(2018, 11, 18): 0.988, datetime.date(2018, 11, 17): -0.988, datetime.date(2018, 11, 15): -0.982, datetime.date(2018, 11, 14): 0.998, datetime.date(2018, 11, 10): 0.982, datetime.date(2018, 11, 9): -0.847, datetime.date(2018, 11, 8): -0.567, datetime.date(2018, 11, 1): 0.973, datetime.date(2018, 10, 30): 0.856, datetime.date(2018, 10, 28): 0.952, datetime.date(2018, 10, 27): -0.481, datetime.date(2018, 10, 26): 0.983, datetime.date(2018, 10, 25): 0.969, datetime.date(2018, 10, 24): -0.977, datetime.date(2018, 10, 20): 0.875, datetime.date(2018, 10, 19): 0.981, datetime.date(2018, 10, 14): -0.455, datetime.date(2018, 10, 13): -0.951, datetime.date(2018, 10, 11): 0.156, datetime.date(2018, 10, 9): 0.935, datetime.date(2018, 10, 6): -0.009, datetime.date(2018, 10, 5): -0.928, datetime.date(2018, 10, 4): -0.002, datetime.date(2018, 10, 3): 0.318, datetime.date(2018, 10, 2): -0.952, datetime.date(2018, 9, 30): 0.835, datetime.date(2018, 9, 29): 0.621, datetime.date(2018, 9, 28): -0.948, datetime.date(2018, 9, 27): 0.998, datetime.date(2018, 9, 26): 0.486, datetime.date(2018, 9, 25): -0.975, datetime.date(2018, 9, 22): 0.012, datetime.date(2018, 9, 21): 0.975, datetime.date(2018, 9, 20): 0.453, datetime.date(2018, 9, 19): 0.988, datetime.date(2018, 9, 16): 0.975, datetime.date(2018, 9, 8): 0.329, datetime.date(2018, 9, 7): 0.327, datetime.date(2018, 9, 6): 0.251, datetime.date(2018, 9, 5): 0.402, datetime.date(2018, 8, 30): 0.332, datetime.date(2018, 8, 29): -0.461, datetime.date(2018, 8, 25): 0.388, datetime.date(2018, 8, 24): 0.815, datetime.date(2018, 8, 23): -0.148, datetime.date(2018, 8, 22): -0.969, datetime.date(2018, 8, 14): 0.88, datetime.date(2018, 8, 8): 0.996, datetime.date(2018, 8, 5): 0.973, datetime.date(2018, 8, 2): 0.991, datetime.date(2018, 7, 31): 0.973, datetime.date(2018, 7, 29): -0.139, datetime.date(2018, 7, 28): 0.511, datetime.date(2018, 7, 27): 0.603, datetime.date(2018, 7, 26): 0.593, datetime.date(2018, 7, 25): 0.888, datetime.date(2018, 7, 21): -0.916, datetime.date(2018, 7, 20): -0.297, datetime.date(2018, 7, 14): 0.942, datetime.date(2018, 7, 12): -0.955, datetime.date(2018, 7, 11): 0.929, datetime.date(2018, 7, 6): -0.59}\n" 201 | ] 202 | } 203 | ], 204 | "source": [ 205 | "from urllib.request import urlopen\n", 206 | "from bs4 import BeautifulSoup\n", 207 | "from datetime import datetime, timedelta\n", 208 | "import time\n", 209 | "import pprint\n", 210 | "\n", 211 | "date_sentiments = {}\n", 212 | "\n", 213 | "for i in range(1,11):\n", 214 | " page = urlopen('https://www.businesstimes.com.sg/search/facebook?page='+str(i)).read()\n", 215 | " soup = BeautifulSoup(page, features=\"html.parser\")\n", 216 | " posts = soup.findAll(\"div\", {\"class\": \"media-body\"})\n", 217 | " for post in posts:\n", 218 | " time.sleep(1)\n", 219 | " url = post.a['href']\n", 220 | " date = post.time.text\n", 221 | " print(date, url)\n", 222 | " try:\n", 223 | " link_page = urlopen(url).read()\n", 224 | " except:\n", 225 | " url = url[:-2]\n", 226 | " link_page = urlopen(url).read()\n", 227 | " link_soup = BeautifulSoup(link_page)\n", 228 | " sentences = link_soup.findAll(\"p\")\n", 229 | " passage = \"\"\n", 230 | " for sentence in sentences:\n", 231 | " passage += sentence.text\n", 232 | " sentiment = sia.polarity_scores(passage)['compound']\n", 233 | " date_sentiments.setdefault(date, []).append(sentiment)\n", 234 | "\n", 235 | "date_sentiment = {}\n", 236 | "\n", 237 | "for k,v in date_sentiments.items():\n", 238 | " date_sentiment[datetime.strptime(k, '%d %b %Y').date() + timedelta(days=1)] = round(sum(v)/float(len(v)),3)\n", 239 | "\n", 240 | "earliest_date = min(date_sentiment.keys())\n", 241 | "\n", 242 | "print(date_sentiment)" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "Algorithm" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 5, 255 | "metadata": { 256 | "scrolled": false 257 | }, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | "Starting Portfolio Value: 100000.00\n", 264 | "2018-07-26, Close, 176.26\n", 265 | "Sentiment Score: 0.593\n", 266 | "2018-07-27, Close, 174.89\n", 267 | "Sentiment Score: 0.603\n", 268 | "2018-07-30, Close, 171.06\n", 269 | "Sentiment Score: 0.603\n", 270 | "2018-07-31, Close, 172.58\n", 271 | "Sentiment Score: 0.973\n", 272 | "2018-08-01, Close, 171.65\n", 273 | "Sentiment Score: 0.973\n", 274 | "2018-08-02, Close, 176.37\n", 275 | "Sentiment Score: 0.991\n", 276 | "2018-08-03, Close, 177.78\n", 277 | "Sentiment Score: 0.991\n", 278 | "2018-08-06, Close, 185.69\n", 279 | "Sentiment Score: 0.991\n", 280 | "2018-08-07, Close, 183.81\n", 281 | "Sentiment Score: 0.991\n", 282 | "2018-08-08, Close, 185.18\n", 283 | "Sentiment Score: 0.996\n", 284 | "2018-08-09, Close, 183.09\n", 285 | "Sentiment Score: 0.996\n", 286 | "2018-08-10, Close, 180.26\n", 287 | "Sentiment Score: 0.996\n", 288 | "2018-08-13, Close, 180.05\n", 289 | "Sentiment Score: 0.996\n", 290 | "2018-08-14, Close, 181.11\n", 291 | "Sentiment Score: 0.88\n", 292 | "2018-08-15, Close, 179.53\n", 293 | "Sentiment Score: 0.88\n", 294 | "2018-08-16, Close, 174.70\n", 295 | "Sentiment Score: 0.88\n", 296 | "2018-08-17, Close, 173.80\n", 297 | "Sentiment Score: 0.88\n", 298 | "2018-08-20, Close, 172.50\n", 299 | "Sentiment Score: 0.88\n", 300 | "2018-08-21, Close, 172.62\n", 301 | "Sentiment Score: 0.88\n", 302 | "2018-08-22, Close, 173.64\n", 303 | "Sentiment Score: -0.969\n", 304 | "2018-08-23, Close, 172.90\n", 305 | "Sentiment Score: -0.148\n", 306 | "2018-08-23, BUY CREATE, 172.90\n", 307 | "2018-08-24, BUY EXECUTED, Price: 173.70, Cost: 1737.00, Comm 1.74\n", 308 | "2018-08-24, Close, 174.65\n", 309 | "Sentiment Score: 0.815\n", 310 | "2018-08-27, Close, 177.46\n", 311 | "Sentiment Score: 0.815\n", 312 | "2018-08-28, Close, 176.26\n", 313 | "Sentiment Score: 0.815\n", 314 | "2018-08-29, Close, 175.90\n", 315 | "Sentiment Score: -0.461\n", 316 | "2018-08-29, SELL CREATE, 175.90\n", 317 | "2018-08-30, SELL EXECUTED, Price: 175.90, Cost: 1737.00, Comm 1.76\n", 318 | "2018-08-30, OPERATION PROFIT, GROSS 22.00, NET 18.50\n", 319 | "2018-08-30, Close, 177.64\n", 320 | "Sentiment Score: 0.332\n", 321 | "2018-08-30, BUY CREATE, 177.64\n", 322 | "2018-08-31, BUY EXECUTED, Price: 177.15, Cost: 1771.50, Comm 1.77\n", 323 | "2018-08-31, Close, 175.73\n", 324 | "Sentiment Score: 0.332\n", 325 | "2018-09-04, Close, 171.16\n", 326 | "Sentiment Score: 0.332\n", 327 | "2018-09-05, Close, 167.18\n", 328 | "Sentiment Score: 0.402\n", 329 | "2018-09-06, Close, 162.53\n", 330 | "Sentiment Score: 0.251\n", 331 | "2018-09-07, Close, 163.04\n", 332 | "Sentiment Score: 0.327\n", 333 | "2018-09-10, Close, 164.18\n", 334 | "Sentiment Score: 0.327\n", 335 | "2018-09-11, Close, 165.94\n", 336 | "Sentiment Score: 0.327\n", 337 | "2018-09-12, Close, 162.00\n", 338 | "Sentiment Score: 0.327\n", 339 | "2018-09-13, Close, 161.36\n", 340 | "Sentiment Score: 0.327\n", 341 | "2018-09-14, Close, 162.32\n", 342 | "Sentiment Score: 0.327\n", 343 | "2018-09-17, Close, 160.58\n", 344 | "Sentiment Score: 0.327\n", 345 | "2018-09-18, Close, 160.30\n", 346 | "Sentiment Score: 0.327\n", 347 | "2018-09-19, Close, 163.06\n", 348 | "Sentiment Score: 0.988\n", 349 | "2018-09-20, Close, 166.02\n", 350 | "Sentiment Score: 0.453\n", 351 | "2018-09-20, SELL CREATE, 166.02\n", 352 | "2018-09-21, SELL EXECUTED, Price: 166.64, Cost: 1771.50, Comm 1.67\n", 353 | "2018-09-21, OPERATION PROFIT, GROSS -105.10, NET -108.54\n", 354 | "2018-09-21, Close, 162.93\n", 355 | "Sentiment Score: 0.975\n", 356 | "2018-09-21, BUY CREATE, 162.93\n", 357 | "2018-09-24, BUY EXECUTED, Price: 161.03, Cost: 1610.30, Comm 1.61\n", 358 | "2018-09-24, Close, 165.41\n", 359 | "Sentiment Score: 0.975\n", 360 | "2018-09-25, Close, 164.91\n", 361 | "Sentiment Score: -0.975\n", 362 | "2018-09-25, SELL CREATE, 164.91\n", 363 | "2018-09-26, SELL EXECUTED, Price: 164.30, Cost: 1610.30, Comm 1.64\n", 364 | "2018-09-26, OPERATION PROFIT, GROSS 32.70, NET 29.45\n", 365 | "2018-09-26, Close, 166.95\n", 366 | "Sentiment Score: 0.486\n", 367 | "2018-09-26, BUY CREATE, 166.95\n", 368 | "2018-09-27, BUY EXECUTED, Price: 167.55, Cost: 1675.50, Comm 1.68\n", 369 | "2018-09-27, Close, 168.84\n", 370 | "Sentiment Score: 0.998\n", 371 | "2018-09-28, Close, 164.46\n", 372 | "Sentiment Score: -0.948\n", 373 | "2018-09-28, SELL CREATE, 164.46\n", 374 | "2018-10-01, SELL EXECUTED, Price: 163.03, Cost: 1675.50, Comm 1.63\n", 375 | "2018-10-01, OPERATION PROFIT, GROSS -45.20, NET -48.51\n", 376 | "2018-10-01, Close, 162.44\n", 377 | "Sentiment Score: -0.948\n", 378 | "2018-10-02, Close, 159.33\n", 379 | "Sentiment Score: -0.952\n", 380 | "2018-10-03, Close, 162.43\n", 381 | "Sentiment Score: 0.318\n", 382 | "2018-10-03, BUY CREATE, 162.43\n", 383 | "2018-10-04, BUY EXECUTED, Price: 161.46, Cost: 1614.60, Comm 1.61\n", 384 | "2018-10-04, Close, 158.85\n", 385 | "Sentiment Score: -0.002\n", 386 | "2018-10-05, Close, 157.33\n", 387 | "Sentiment Score: -0.928\n", 388 | "2018-10-05, SELL CREATE, 157.33\n", 389 | "2018-10-08, SELL EXECUTED, Price: 155.54, Cost: 1614.60, Comm 1.56\n", 390 | "2018-10-08, OPERATION PROFIT, GROSS -59.20, NET -62.37\n", 391 | "2018-10-08, Close, 157.25\n", 392 | "Sentiment Score: -0.928\n", 393 | "2018-10-09, Close, 157.90\n", 394 | "Sentiment Score: 0.935\n", 395 | "2018-10-09, BUY CREATE, 157.90\n", 396 | "2018-10-10, BUY EXECUTED, Price: 156.82, Cost: 1568.20, Comm 1.57\n", 397 | "2018-10-10, Close, 151.38\n", 398 | "Sentiment Score: 0.935\n", 399 | "2018-10-11, Close, 153.35\n", 400 | "Sentiment Score: 0.156\n", 401 | "2018-10-11, SELL CREATE, 153.35\n", 402 | "2018-10-12, SELL EXECUTED, Price: 156.73, Cost: 1568.20, Comm 1.57\n", 403 | "2018-10-12, OPERATION PROFIT, GROSS -0.90, NET -4.04\n", 404 | "2018-10-12, Close, 153.74\n", 405 | "Sentiment Score: 0.156\n", 406 | "2018-10-15, Close, 153.52\n", 407 | "Sentiment Score: 0.156\n", 408 | "2018-10-16, Close, 158.78\n", 409 | "Sentiment Score: 0.156\n", 410 | "2018-10-17, Close, 159.42\n", 411 | "Sentiment Score: 0.156\n", 412 | "2018-10-18, Close, 154.92\n", 413 | "Sentiment Score: 0.156\n", 414 | "2018-10-19, Close, 154.05\n", 415 | "Sentiment Score: 0.981\n", 416 | "2018-10-19, BUY CREATE, 154.05\n", 417 | "2018-10-22, BUY EXECUTED, Price: 154.76, Cost: 1547.60, Comm 1.55\n", 418 | "2018-10-22, Close, 154.78\n", 419 | "Sentiment Score: 0.981\n", 420 | "2018-10-23, Close, 154.39\n", 421 | "Sentiment Score: 0.981\n", 422 | "2018-10-24, Close, 146.04\n", 423 | "Sentiment Score: -0.977\n", 424 | "2018-10-24, SELL CREATE, 146.04\n", 425 | "2018-10-25, SELL EXECUTED, Price: 147.73, Cost: 1547.60, Comm 1.48\n", 426 | "2018-10-25, OPERATION PROFIT, GROSS -70.30, NET -73.32\n", 427 | "2018-10-25, Close, 150.95\n", 428 | "Sentiment Score: 0.969\n", 429 | "2018-10-25, BUY CREATE, 150.95\n", 430 | "2018-10-26, BUY EXECUTED, Price: 145.82, Cost: 1458.20, Comm 1.46\n", 431 | "2018-10-26, Close, 145.37\n", 432 | "Sentiment Score: 0.983\n", 433 | "2018-10-29, Close, 142.09\n", 434 | "Sentiment Score: 0.983\n", 435 | "2018-10-30, Close, 146.22\n", 436 | "Sentiment Score: 0.856\n", 437 | "2018-10-31, Close, 151.79\n", 438 | "Sentiment Score: 0.856\n", 439 | "2018-11-01, Close, 151.75\n", 440 | "Sentiment Score: 0.973\n", 441 | "2018-11-02, Close, 150.35\n", 442 | "Sentiment Score: 0.973\n", 443 | "2018-11-05, Close, 148.68\n", 444 | "Sentiment Score: 0.973\n", 445 | "2018-11-06, Close, 149.94\n", 446 | "Sentiment Score: 0.973\n", 447 | "2018-11-07, Close, 151.53\n", 448 | "Sentiment Score: 0.973\n", 449 | "2018-11-08, Close, 147.87\n", 450 | "Sentiment Score: -0.567\n", 451 | "2018-11-08, SELL CREATE, 147.87\n", 452 | "2018-11-09, SELL EXECUTED, Price: 146.75, Cost: 1458.20, Comm 1.47\n", 453 | "2018-11-09, OPERATION PROFIT, GROSS 9.30, NET 6.37\n", 454 | "2018-11-09, Close, 144.96\n", 455 | "Sentiment Score: -0.847\n", 456 | "2018-11-12, Close, 141.55\n", 457 | "Sentiment Score: -0.847\n", 458 | "2018-11-13, Close, 142.16\n", 459 | "Sentiment Score: -0.847\n", 460 | "2018-11-14, Close, 144.22\n", 461 | "Sentiment Score: 0.998\n", 462 | "2018-11-14, BUY CREATE, 144.22\n", 463 | "2018-11-15, BUY EXECUTED, Price: 142.33, Cost: 1423.30, Comm 1.42\n", 464 | "2018-11-15, Close, 143.85\n", 465 | "Sentiment Score: -0.982\n", 466 | "2018-11-15, SELL CREATE, 143.85\n", 467 | "2018-11-16, SELL EXECUTED, Price: 141.07, Cost: 1423.30, Comm 1.41\n", 468 | "2018-11-16, OPERATION PROFIT, GROSS -12.60, NET -15.43\n", 469 | "2018-11-16, Close, 139.53\n", 470 | "Sentiment Score: -0.982\n", 471 | "2018-11-19, Close, 131.55\n", 472 | "Sentiment Score: -0.982\n", 473 | "2018-11-20, Close, 132.43\n", 474 | "Sentiment Score: -0.982\n", 475 | "2018-11-21, Close, 134.82\n", 476 | "Sentiment Score: -0.982\n", 477 | "2018-11-23, Close, 131.73\n", 478 | "Sentiment Score: -0.84\n", 479 | "2018-11-23, (MA Period 15) Ending Value 99742.12\n", 480 | "Final Portfolio Value: 99742.12\n" 481 | ] 482 | } 483 | ], 484 | "source": [ 485 | "from __future__ import (absolute_import, division, print_function,\n", 486 | " unicode_literals)\n", 487 | "\n", 488 | "# %matplotlib inline\n", 489 | "# import warnings\n", 490 | "# warnings.filterwarnings('ignore')\n", 491 | "\n", 492 | "import backtrader as bt\n", 493 | "import backtrader.indicators as btind\n", 494 | "import datetime\n", 495 | "import os.path\n", 496 | "import sys\n", 497 | "\n", 498 | "class Sentiment(bt.Indicator):\n", 499 | " lines = ('sentiment',)\n", 500 | " plotinfo = dict(\n", 501 | " plotymargin=0.15,\n", 502 | " plothlines=[0],\n", 503 | " plotyticks=[1.0, 0, -1.0])\n", 504 | " \n", 505 | " def next(self):\n", 506 | " self.date = self.data.datetime\n", 507 | " date = bt.num2date(self.date[0]).date()\n", 508 | " prev_sentiment = self.sentiment\n", 509 | " if date in date_sentiment:\n", 510 | " self.sentiment = date_sentiment[date]\n", 511 | " self.lines.sentiment[0] = self.sentiment\n", 512 | "\n", 513 | "\n", 514 | "class SentimentStrat(bt.Strategy):\n", 515 | " params = (\n", 516 | " ('period', 15),\n", 517 | " ('printlog', True),\n", 518 | " )\n", 519 | "\n", 520 | " def log(self, txt, dt=None, doprint=False):\n", 521 | " ''' Logging function for this strategy'''\n", 522 | " if self.params.printlog or doprint:\n", 523 | " dt = dt or self.datas[0].datetime.date(0)\n", 524 | " print('%s, %s' % (dt.isoformat(), txt))\n", 525 | "\n", 526 | " def __init__(self):\n", 527 | " # Keep a reference to the \"close\" line in the data[0] dataseries\n", 528 | " self.dataclose = self.datas[0].close\n", 529 | " # Keep track of pending orders\n", 530 | " self.order = None\n", 531 | " self.buyprice = None\n", 532 | " self.buycomm = None\n", 533 | " self.sma = bt.indicators.SimpleMovingAverage(\n", 534 | " self.datas[0], period=self.params.period)\n", 535 | " self.date = self.data.datetime\n", 536 | " self.sentiment = None\n", 537 | " Sentiment(self.data)\n", 538 | " \n", 539 | " def notify_order(self, order):\n", 540 | " if order.status in [order.Submitted, order.Accepted]:\n", 541 | " # Buy/Sell order submitted/accepted to/by broker - Nothing to do\n", 542 | " return\n", 543 | " \n", 544 | " # Check if an order has been completed\n", 545 | " # Attention: broker could reject order if not enough cash\n", 546 | " if order.status in [order.Completed]:\n", 547 | " if order.isbuy():\n", 548 | " self.log(\n", 549 | " 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %\n", 550 | " (order.executed.price,\n", 551 | " order.executed.value,\n", 552 | " order.executed.comm))\n", 553 | " self.buyprice = order.executed.price\n", 554 | " self.buycomm = order.executed.comm\n", 555 | " else: # Sell\n", 556 | " self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %\n", 557 | " (order.executed.price,\n", 558 | " order.executed.value,\n", 559 | " order.executed.comm))\n", 560 | " \n", 561 | " self.bar_executed = len(self) \n", 562 | " \n", 563 | " elif order.status in [order.Canceled, order.Margin, order.Rejected]:\n", 564 | " self.log('Order Canceled/Margin/Rejected')\n", 565 | " \n", 566 | " # Write down: no pending order\n", 567 | " self.order = None\n", 568 | " \n", 569 | " def notify_trade(self, trade):\n", 570 | " if not trade.isclosed:\n", 571 | " return\n", 572 | "\n", 573 | " self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %\n", 574 | " (trade.pnl, trade.pnlcomm))\n", 575 | " \n", 576 | " ### Main Strat ###\n", 577 | " def next(self):\n", 578 | " # log closing price of the series from the reference\n", 579 | " self.log('Close, %.2f' % self.dataclose[0])\n", 580 | " \n", 581 | " date = bt.num2date(self.date[0]).date()\n", 582 | " prev_sentiment = self.sentiment\n", 583 | " if date in date_sentiment:\n", 584 | " self.sentiment = date_sentiment[date]\n", 585 | " \n", 586 | " # Check if an order is pending. if yes, we cannot send a 2nd one\n", 587 | " if self.order:\n", 588 | " return\n", 589 | " print(self.sentiment)\n", 590 | " # If not in the market and previous sentiment not none\n", 591 | " if not self.position and prev_sentiment:\n", 592 | " # buy if current close more than sma AND sentiment increased by >= 0.5\n", 593 | " if self.dataclose[0] > self.sma[0] and self.sentiment - prev_sentiment >= 0.5:\n", 594 | " self.log('BUY CREATE, %.2f' % self.dataclose[0])\n", 595 | " self.order = self.buy()\n", 596 | " \n", 597 | " # Already in the market and previous sentiment not none\n", 598 | " elif prev_sentiment:\n", 599 | " # sell if current close less than sma AND sentiment decreased by >= 0.5\n", 600 | " if self.dataclose[0] < self.sma[0] and self.sentiment - prev_sentiment <= -0.5:\n", 601 | " self.log('SELL CREATE, %.2f' % self.dataclose[0])\n", 602 | " self.order = self.sell()\n", 603 | "\n", 604 | " def stop(self):\n", 605 | " self.log('(MA Period %2d) Ending Value %.2f' %\n", 606 | " (self.params.period, self.broker.getvalue()), doprint=True)\n", 607 | " \n", 608 | "\n", 609 | "if __name__ == '__main__':\n", 610 | " cerebro = bt.Cerebro()\n", 611 | " \n", 612 | " # Strategy\n", 613 | " cerebro.addstrategy(SentimentStrat)\n", 614 | "\n", 615 | " # Data Feed\n", 616 | " data = bt.feeds.YahooFinanceData(\n", 617 | " dataname = 'FB',\n", 618 | " fromdate = earliest_date,\n", 619 | " todate = datetime.datetime(2018,11,25),\n", 620 | " reverse = False\n", 621 | " )\n", 622 | " \n", 623 | " cerebro.adddata(data)\n", 624 | "\n", 625 | " cerebro.broker.setcash(100000.0)\n", 626 | " cerebro.addsizer(bt.sizers.FixedSize, stake=10)\n", 627 | " cerebro.broker.setcommission(commission=0.001)\n", 628 | " print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())\n", 629 | " cerebro.run()\n", 630 | " print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())\n", 631 | " \n", 632 | " cerebro.plot()\n" 633 | ] 634 | }, 635 | { 636 | "cell_type": "code", 637 | "execution_count": null, 638 | "metadata": {}, 639 | "outputs": [], 640 | "source": [] 641 | } 642 | ], 643 | "metadata": { 644 | "kernelspec": { 645 | "display_name": "Python 3", 646 | "language": "python", 647 | "name": "python3" 648 | }, 649 | "language_info": { 650 | "codemirror_mode": { 651 | "name": "ipython", 652 | "version": 3 653 | }, 654 | "file_extension": ".py", 655 | "mimetype": "text/x-python", 656 | "name": "python", 657 | "nbconvert_exporter": "python", 658 | "pygments_lexer": "ipython3", 659 | "version": "3.7.0" 660 | } 661 | }, 662 | "nbformat": 4, 663 | "nbformat_minor": 2 664 | } 665 | -------------------------------------------------------------------------------- /Stock Sentiment Algo Trading.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Initialize Sentiment Analyzer" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import nltk\n", 17 | "import warnings\n", 18 | "warnings.filterwarnings('ignore')\n", 19 | "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", 20 | "# nltk.download('vader_lexicon')\n", 21 | "\n", 22 | "sia = SentimentIntensityAnalyzer()" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "Updating Vader Lexicon with External Lexicon" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "# import csv\n", 39 | "# import pandas as pd\n", 40 | "\n", 41 | "# # stock market lexicon\n", 42 | "# stock_lex = pd.read_csv('lexicon_data/stock_lex.csv')\n", 43 | "# stock_lex['sentiment'] = (stock_lex['Aff_Score'] + stock_lex['Neg_Score'])/2\n", 44 | "# stock_lex = dict(zip(stock_lex.Item, stock_lex.sentiment))\n", 45 | "# stock_lex = {k:v for k,v in stock_lex.items() if len(k.split(' '))==1}\n", 46 | "# stock_lex_scaled = {}\n", 47 | "# for k, v in stock_lex.items():\n", 48 | "# if v > 0:\n", 49 | "# stock_lex_scaled[k] = v / max(stock_lex.values()) * 4\n", 50 | "# else:\n", 51 | "# stock_lex_scaled[k] = v / min(stock_lex.values()) * -4\n", 52 | "\n", 53 | "# # # Loughran and McDonald\n", 54 | "# # positive = []\n", 55 | "# # with open('lexicon_data/lm_positive.csv', 'r') as f:\n", 56 | "# # reader = csv.reader(f)\n", 57 | "# # for row in reader:\n", 58 | "# # positive.append(row[0].strip())\n", 59 | " \n", 60 | "# # negative = []\n", 61 | "# # with open('lexicon_data/lm_negative.csv', 'r') as f:\n", 62 | "# # reader = csv.reader(f)\n", 63 | "# # for row in reader:\n", 64 | "# # entry = row[0].strip().split(\" \")\n", 65 | "# # if len(entry) > 1:\n", 66 | "# # negative.extend(entry)\n", 67 | "# # else:\n", 68 | "# # negative.append(entry[0])\n", 69 | "\n", 70 | "# final_lex = {}\n", 71 | "# # final_lex.update({word:2.0 for word in positive})\n", 72 | "# # final_lex.update({word:-2.0 for word in negative})\n", 73 | "# final_lex.update(stock_lex_scaled)\n", 74 | "# final_lex.update(sia.lexicon)\n", 75 | "# sia.lexicon = final_lex" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "Scraping FB posts from Business Times" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 2, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "name": "stdout", 92 | "output_type": "stream", 93 | "text": [ 94 | "23 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-to-pay-100m-euros-in-italian-fiscal-accord\n", 95 | "22 Nov 2018 https://www.businesstimes.com.sg/consumer/departing-facebook-communications-chief-says-critics-were-targeted\n", 96 | "22 Nov 2018 https://www.businesstimes.com.sg/technology/zuckerberg-says-he-is-not-considering-resigning-from-facebook\n", 97 | "21 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-services-tripped-up-by-server-problem\n", 98 | "17 Nov 2018 https://www.businesstimes.com.sg/government-economy/i-dont-really-want-to-work-for-facebook-so-say-some-computer-science-students\n", 99 | "16 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-to-launch-independent-body-for-calls-on-content\n", 100 | "14 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-shuts-more-accounts-aimed-at-political-meddling\n", 101 | "13 Nov 2018 https://www.businesstimes.com.sg/hub/asean-singapore-2018/facebook-courting-startups-and-smes\n", 102 | "09 Nov 2018 https://www.businesstimes.com.sg/technology/facebook-takes-questions-on-portals-features\n", 103 | "08 Nov 2018 https://www.businesstimes.com.sg/technology/russian-trolls-were-at-it-again-before-us-mid-term-polls-says-facebook\n", 104 | "07 Nov 2018 https://www.businesstimes.com.sg/government-economy/russian-trolls-were-at-it-again-before-midterms-facebook-says\n", 105 | "31 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-quarterly-profit-climbs-9-to-us514b\n", 106 | "29 Oct 2018 https://www.businesstimes.com.sg/technology/ahead-of-facebook-earnings-analysts-hope-it-cant-get-any-worse\n", 107 | "27 Oct 2018 https://www.businesstimes.com.sg/government-economy/facebook-blocks-iran-linked-bid-to-sway-us-british-politics\n", 108 | "26 Oct 2018 https://www.businesstimes.com.sg/companies-markets/dbs-launches-chatbot-to-take-orders-via-facebook-messenger\n", 109 | "25 Oct 2018 https://www.businesstimes.com.sg/consumer/dbs-unveils-chatbot-for-ordering-paying-for-meals-through-facebook-messenger\n", 110 | "24 Oct 2018 https://www.businesstimes.com.sg/technology/oculus-brendan-iribe-is-latest-founder-to-leave-facebook\n", 111 | "23 Oct 2018 https://www.businesstimes.com.sg/government-economy/facebook-shuts-accounts-of-marketing-group-in-brazil-election\n", 112 | "19 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-hires-ex-uk-deputy-pm-clegg-to-lead-lobbying-effort\n", 113 | "18 Oct 2018 https://www.businesstimes.com.sg/technology/at-facebook-public-funds-join-push-to-remove-zuckerberg-as-chairman\n", 114 | "13 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-now-says-data-breach-affected-29m-users-details-impact\n", 115 | "13 Oct 2018 https://www.businesstimes.com.sg/investing-wealth/oh-no-accidental-facebook-post\n", 116 | "12 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-purges-251-accounts-to-thwart-deception\n", 117 | "10 Oct 2018 https://www.businesstimes.com.sg/technology/facebooks-whatsapp-says-has-fixed-video-call-security-bug\n", 118 | "10 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-seeing-growth-in-business-network-workplace\n", 119 | "08 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-launches-ai-video-calling-device-portal\n", 120 | "05 Oct 2018 https://www.businesstimes.com.sg/technology/irish-data-authority-probes-facebook-over-breach\n", 121 | "04 Oct 2018 https://www.businesstimes.com.sg/technology/irish-data-authority-probes-facebook-over-breach-of-50m-accounts\n", 122 | "03 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-says-no-sign-recent-hack-spread-to-other-apps\n", 123 | "03 Oct 2018 https://www.businesstimes.com.sg/technology/facebook-adds-new-tools-to-stem-online-bullying\n", 124 | "03 Oct 2018 https://www.businesstimes.com.sg/startups/facebook-imda-start-accelerator-for-data-startups\n", 125 | "03 Oct 2018 https://www.businesstimes.com.sg/stocks/us-dow-closes-at-record-but-facebook-drags-on-sp-nasdaq\n", 126 | "02 Oct 2018 https://www.businesstimes.com.sg/asean-business/facebook-imda-to-launch-startup-accelerator-in-singapore-in-february\n", 127 | "02 Oct 2018 https://www.businesstimes.com.sg/startups/facebook-imdas-startup-accelerator-to-kick-off-in-february-2019-in-singapore\n", 128 | "02 Oct 2018 https://www.businesstimes.com.sg/companies-markets/ges-us500b-market-wipeout-is-like-erasing-facebook\n", 129 | "01 Oct 2018 https://www.businesstimes.com.sg/technology/facebooks-worst-security-breach-batters-user-trust-once-again\n", 130 | "29 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-discloses-security-breach-affecting-50-million-users\n", 131 | "29 Sep 2018 https://www.businesstimes.com.sg/stocks/us-facebooks-slide-stalls-intel-led-advance-on-wall-street\n", 132 | "28 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-admits-phone-numbers-may-be-used-to-target-ads\n", 133 | "27 Sep 2018 https://www.businesstimes.com.sg/technology/google-facebook-and-twitter-agree-to-fight-fake-news-in-the-eu\n", 134 | "27 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-faces-political-hurdle-over-banned-party-in-china\n", 135 | "26 Sep 2018 https://www.businesstimes.com.sg/technology/co-founders-of-instagram-facebooks-main-success-story-quit\n", 136 | "25 Sep 2018 https://www.businesstimes.com.sg/technology/instagram-founders-clash-with-zuckerberg-leave-facebook\n", 137 | "24 Sep 2018 https://www.businesstimes.com.sg/technology/white-house-considers-draft-order-to-look-into-google-facebook\n", 138 | "21 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-expands-fake-election-news-fight-but-falsehoods-still-rampant\n", 139 | "20 Sep 2018 https://www.businesstimes.com.sg/government-economy/facebook-building-a-war-room-to-battle-election-meddling\n", 140 | "20 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-accused-of-allowing-bias-against-women-in-job-ads\n", 141 | "19 Sep 2018 https://www.businesstimes.com.sg/companies-markets/sembcorp-inks-20-year-deal-to-provide-solar-energy-for-facebook-singapore\n", 142 | "18 Sep 2018 https://www.businesstimes.com.sg/companies-markets/sembcorp-inks-20-year-deal-to-supply-solar-power-to-facebooks-singapore-operations\n", 143 | "15 Sep 2018 https://www.businesstimes.com.sg/technology/facebook%E2%80%99s-mark-zuckerberg-to-testify-in-november-in-investor-suit\n", 144 | "07 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-co-founder-sees-more-regulation-for-social-networks\n", 145 | "07 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-twitter-come-under-us-pressure-to-make-rules-clearer\n", 146 | "07 Sep 2018 https://www.businesstimes.com.sg/startups/facebook-to-build-s14b-data-centre-in-singapore-its-first-in-asia-0\n", 147 | "06 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-removes-burmese-translation-feature-after-reuters-report\n", 148 | "06 Sep 2018 https://www.businesstimes.com.sg/asean-business/facebook-to-build-its-first-data-centre-in-singapore\n", 149 | "06 Sep 2018 https://www.businesstimes.com.sg/startups/facebook-to-build-s14b-data-centre-in-singapore-its-first-in-asia\n", 150 | "05 Sep 2018 https://www.businesstimes.com.sg/government-economy/facebook-chief-says-internet-firms-in-arms-race-for-democracy\n", 151 | "05 Sep 2018 https://www.businesstimes.com.sg/technology/facebook-accuses-blackberry-of-stealing-voice-messaging-tech\n", 152 | "05 Sep 2018 https://www.businesstimes.com.sg/technology/europes-news-agencies-blast-google-facebook-for-plundering-content\n", 153 | "04 Sep 2018 https://www.businesstimes.com.sg/technology/in-india-google-races-to-parry-the-rise-of-facebook\n", 154 | "04 Sep 2018 https://www.businesstimes.com.sg/technology/brief-facebook-outage-reported-by-users\n", 155 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-rolls-out-video-service-worldwide-0\n", 156 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-rolls-out-video-service-worldwide\n", 157 | "29 Aug 2018 https://www.businesstimes.com.sg/technology/dozens-at-facebook-unite-to-challenge-its-%E2%80%98intolerant%E2%80%99-liberal-culture\n", 158 | "28 Aug 2018 https://www.businesstimes.com.sg/banking-finance/dbs-says-employee-who-posted-image-of-ripped-singapore-flag-on-facebook-no-longer\n", 159 | "28 Aug 2018 https://www.businesstimes.com.sg/government-economy/facebook-move-on-myanmar-raises-thorny-political-questions\n", 160 | "24 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-suspends-hundreds-of-apps-over-data-concerns\n", 161 | "23 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-suspends-400-apps-in-data-leak-probe\n", 162 | "23 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-to-pull-vpn-app-from-app-store-over-data-worry\n", 163 | "22 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-cuts-ad-target-options-to-thwart-discrimination\n", 164 | "22 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-stops-misinformation-campaigns-tied-to-iran-russia\n" 165 | ] 166 | }, 167 | { 168 | "name": "stdout", 169 | "output_type": "stream", 170 | "text": [ 171 | "21 Aug 2018 https://www.businesstimes.com.sg/technology/dangerous-for-twitter-facebook-to-ban-accounts-says-trump\n", 172 | "13 Aug 2018 https://www.businesstimes.com.sg/technology/facebooks-david-marcus-resigns-from-coinbase-board-in-blockchain-push\n", 173 | "07 Aug 2018 https://www.businesstimes.com.sg/technology/a-generation-grows-up-in-china-without-google-facebook-or-twitter\n", 174 | "07 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-shares-rise-on-optimism-for-banking-relationships\n", 175 | "04 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-fakers-get-better-at-covering-tracks-security-experts-say\n", 176 | "01 Aug 2018 https://www.businesstimes.com.sg/technology/facebook-uncovers-political-influence-campaign-ahead-of-us-midterm-elections\n", 177 | "30 Jul 2018 https://www.businesstimes.com.sg/technology/cost-of-policing-facebook-twitter-spooking-wall-street\n", 178 | "28 Jul 2018 https://www.businesstimes.com.sg/life-culture/facebook-suspends-us-conspiracy-theorist-alex-jones\n", 179 | "28 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-is-sued-after-stock-plunge-shocked-market\n", 180 | "28 Jul 2018 https://www.businesstimes.com.sg/investing-wealth/how-facebook-suddenly-went-so-wrong-so-fast\n", 181 | "27 Jul 2018 https://www.businesstimes.com.sg/stocks/us-facebook-dives-weighing-on-stocks\n", 182 | "27 Jul 2018 https://www.businesstimes.com.sg/government-economy/top-facebook-twitter-executives-to-testify-in-sept-on-us-election-meddling\n", 183 | "27 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-to-add-shaq-show-and-singing-contest-to-video-lineup\n", 184 | "27 Jul 2018 https://www.businesstimes.com.sg/stocks/facebook-controversies-hit-it-where-it-hurts-most-growth\n", 185 | "26 Jul 2018 https://www.businesstimes.com.sg/stocks/zuckerberg-loses-us16b-in-record-facebook-fall\n", 186 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/indias-cbi-to-investigate-facebook-cambridge-analytica-data-theft\n", 187 | "26 Jul 2018 https://www.businesstimes.com.sg/stocks/us-nasdaq-falls-at-open-as-facebook-leads-tech-selloff\n", 188 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-hammered-as-user-growth-cools\n", 189 | "26 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-legally-bound-to-stop-discriminatory-advertising\n", 190 | "25 Jul 2018 https://www.businesstimes.com.sg/technology/china-to-pull-approval-for-facebooks-planned-venture\n", 191 | "25 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-to-double-its-amount-of-office-space-in-london\n", 192 | "24 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-doubles-down-on-london-with-space-for-6000-workers\n", 193 | "20 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-faces-delay-to-whatsapp-payments-in-india\n", 194 | "19 Jul 2018 https://www.businesstimes.com.sg/technology/facebook-cracks-down-on-bogus-posts-inciting-violence\n", 195 | "19 Jul 2018 https://www.businesstimes.com.sg/technology/trump-is-the-biggest-buyer-of-political-ads-on-facebook\n", 196 | "13 Jul 2018 https://www.businesstimes.com.sg/technology/heirs-can-access-facebook-account-of-deceased-relatives-german-court\n", 197 | "11 Jul 2018 https://www.businesstimes.com.sg/technology/british-regulator-to-fine-facebook-over-data-protection-breaches\n", 198 | "10 Jul 2018 https://www.businesstimes.com.sg/technology/with-regulators-wary-facebook-is-poring-over-its-prize-asset-your-face\n", 199 | "05 Jul 2018 https://www.businesstimes.com.sg/opinion/facebook-not-the-only-one-that-needs-examination-regulation\n", 200 | "{datetime.date(2018, 11, 24): 0.288, datetime.date(2018, 11, 23): -0.84, datetime.date(2018, 11, 22): -0.903, datetime.date(2018, 11, 18): 0.988, datetime.date(2018, 11, 17): -0.988, datetime.date(2018, 11, 15): -0.982, datetime.date(2018, 11, 14): 0.998, datetime.date(2018, 11, 10): 0.982, datetime.date(2018, 11, 9): -0.847, datetime.date(2018, 11, 8): -0.567, datetime.date(2018, 11, 1): 0.973, datetime.date(2018, 10, 30): 0.856, datetime.date(2018, 10, 28): 0.952, datetime.date(2018, 10, 27): -0.481, datetime.date(2018, 10, 26): 0.983, datetime.date(2018, 10, 25): 0.969, datetime.date(2018, 10, 24): -0.977, datetime.date(2018, 10, 20): 0.875, datetime.date(2018, 10, 19): 0.981, datetime.date(2018, 10, 14): -0.455, datetime.date(2018, 10, 13): -0.951, datetime.date(2018, 10, 11): 0.156, datetime.date(2018, 10, 9): 0.935, datetime.date(2018, 10, 6): -0.009, datetime.date(2018, 10, 5): -0.928, datetime.date(2018, 10, 4): -0.002, datetime.date(2018, 10, 3): 0.318, datetime.date(2018, 10, 2): -0.952, datetime.date(2018, 9, 30): 0.835, datetime.date(2018, 9, 29): 0.621, datetime.date(2018, 9, 28): -0.948, datetime.date(2018, 9, 27): 0.998, datetime.date(2018, 9, 26): 0.486, datetime.date(2018, 9, 25): -0.975, datetime.date(2018, 9, 22): 0.012, datetime.date(2018, 9, 21): 0.975, datetime.date(2018, 9, 20): 0.453, datetime.date(2018, 9, 19): 0.988, datetime.date(2018, 9, 16): 0.975, datetime.date(2018, 9, 8): 0.329, datetime.date(2018, 9, 7): 0.327, datetime.date(2018, 9, 6): 0.251, datetime.date(2018, 9, 5): 0.402, datetime.date(2018, 8, 30): 0.332, datetime.date(2018, 8, 29): -0.461, datetime.date(2018, 8, 25): 0.388, datetime.date(2018, 8, 24): 0.815, datetime.date(2018, 8, 23): -0.148, datetime.date(2018, 8, 22): -0.969, datetime.date(2018, 8, 14): 0.88, datetime.date(2018, 8, 8): 0.996, datetime.date(2018, 8, 5): 0.973, datetime.date(2018, 8, 2): 0.991, datetime.date(2018, 7, 31): 0.973, datetime.date(2018, 7, 29): -0.139, datetime.date(2018, 7, 28): 0.511, datetime.date(2018, 7, 27): 0.603, datetime.date(2018, 7, 26): 0.593, datetime.date(2018, 7, 25): 0.888, datetime.date(2018, 7, 21): -0.916, datetime.date(2018, 7, 20): -0.297, datetime.date(2018, 7, 14): 0.942, datetime.date(2018, 7, 12): -0.955, datetime.date(2018, 7, 11): 0.929, datetime.date(2018, 7, 6): -0.59}\n" 201 | ] 202 | } 203 | ], 204 | "source": [ 205 | "from urllib.request import urlopen\n", 206 | "from bs4 import BeautifulSoup\n", 207 | "from datetime import datetime, timedelta\n", 208 | "import time\n", 209 | "import pprint\n", 210 | "\n", 211 | "date_sentiments = {}\n", 212 | "\n", 213 | "for i in range(1,11):\n", 214 | " page = urlopen('https://www.businesstimes.com.sg/search/facebook?page='+str(i)).read()\n", 215 | " soup = BeautifulSoup(page, features=\"html.parser\")\n", 216 | " posts = soup.findAll(\"div\", {\"class\": \"media-body\"})\n", 217 | " for post in posts:\n", 218 | " time.sleep(1)\n", 219 | " url = post.a['href']\n", 220 | " date = post.time.text\n", 221 | " print(date, url)\n", 222 | " try:\n", 223 | " link_page = urlopen(url).read()\n", 224 | " except:\n", 225 | " url = url[:-2]\n", 226 | " link_page = urlopen(url).read()\n", 227 | " link_soup = BeautifulSoup(link_page)\n", 228 | " sentences = link_soup.findAll(\"p\")\n", 229 | " passage = \"\"\n", 230 | " for sentence in sentences:\n", 231 | " passage += sentence.text\n", 232 | " sentiment = sia.polarity_scores(passage)['compound']\n", 233 | " date_sentiments.setdefault(date, []).append(sentiment)\n", 234 | "\n", 235 | "date_sentiment = {}\n", 236 | "\n", 237 | "for k,v in date_sentiments.items():\n", 238 | " date_sentiment[datetime.strptime(k, '%d %b %Y').date() + timedelta(days=1)] = round(sum(v)/float(len(v)),3)\n", 239 | "\n", 240 | "earliest_date = min(date_sentiment.keys())\n", 241 | "\n", 242 | "print(date_sentiment)" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "Algorithm" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 5, 255 | "metadata": { 256 | "scrolled": false 257 | }, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | "Starting Portfolio Value: 100000.00\n", 264 | "2018-07-26, Close, 176.26\n", 265 | "Sentiment Score: 0.593\n", 266 | "2018-07-27, Close, 174.89\n", 267 | "Sentiment Score: 0.603\n", 268 | "2018-07-30, Close, 171.06\n", 269 | "Sentiment Score: 0.603\n", 270 | "2018-07-31, Close, 172.58\n", 271 | "Sentiment Score: 0.973\n", 272 | "2018-08-01, Close, 171.65\n", 273 | "Sentiment Score: 0.973\n", 274 | "2018-08-02, Close, 176.37\n", 275 | "Sentiment Score: 0.991\n", 276 | "2018-08-03, Close, 177.78\n", 277 | "Sentiment Score: 0.991\n", 278 | "2018-08-06, Close, 185.69\n", 279 | "Sentiment Score: 0.991\n", 280 | "2018-08-07, Close, 183.81\n", 281 | "Sentiment Score: 0.991\n", 282 | "2018-08-08, Close, 185.18\n", 283 | "Sentiment Score: 0.996\n", 284 | "2018-08-09, Close, 183.09\n", 285 | "Sentiment Score: 0.996\n", 286 | "2018-08-10, Close, 180.26\n", 287 | "Sentiment Score: 0.996\n", 288 | "2018-08-13, Close, 180.05\n", 289 | "Sentiment Score: 0.996\n", 290 | "2018-08-14, Close, 181.11\n", 291 | "Sentiment Score: 0.88\n", 292 | "2018-08-15, Close, 179.53\n", 293 | "Sentiment Score: 0.88\n", 294 | "2018-08-16, Close, 174.70\n", 295 | "Sentiment Score: 0.88\n", 296 | "2018-08-17, Close, 173.80\n", 297 | "Sentiment Score: 0.88\n", 298 | "2018-08-20, Close, 172.50\n", 299 | "Sentiment Score: 0.88\n", 300 | "2018-08-21, Close, 172.62\n", 301 | "Sentiment Score: 0.88\n", 302 | "2018-08-22, Close, 173.64\n", 303 | "Sentiment Score: -0.969\n", 304 | "2018-08-23, Close, 172.90\n", 305 | "Sentiment Score: -0.148\n", 306 | "2018-08-23, BUY CREATE, 172.90\n", 307 | "2018-08-24, BUY EXECUTED, Price: 173.70, Cost: 1737.00, Comm 1.74\n", 308 | "2018-08-24, Close, 174.65\n", 309 | "Sentiment Score: 0.815\n", 310 | "2018-08-27, Close, 177.46\n", 311 | "Sentiment Score: 0.815\n", 312 | "2018-08-28, Close, 176.26\n", 313 | "Sentiment Score: 0.815\n", 314 | "2018-08-29, Close, 175.90\n", 315 | "Sentiment Score: -0.461\n", 316 | "2018-08-29, SELL CREATE, 175.90\n", 317 | "2018-08-30, SELL EXECUTED, Price: 175.90, Cost: 1737.00, Comm 1.76\n", 318 | "2018-08-30, OPERATION PROFIT, GROSS 22.00, NET 18.50\n", 319 | "2018-08-30, Close, 177.64\n", 320 | "Sentiment Score: 0.332\n", 321 | "2018-08-30, BUY CREATE, 177.64\n", 322 | "2018-08-31, BUY EXECUTED, Price: 177.15, Cost: 1771.50, Comm 1.77\n", 323 | "2018-08-31, Close, 175.73\n", 324 | "Sentiment Score: 0.332\n", 325 | "2018-09-04, Close, 171.16\n", 326 | "Sentiment Score: 0.332\n", 327 | "2018-09-05, Close, 167.18\n", 328 | "Sentiment Score: 0.402\n", 329 | "2018-09-06, Close, 162.53\n", 330 | "Sentiment Score: 0.251\n", 331 | "2018-09-07, Close, 163.04\n", 332 | "Sentiment Score: 0.327\n", 333 | "2018-09-10, Close, 164.18\n", 334 | "Sentiment Score: 0.327\n", 335 | "2018-09-11, Close, 165.94\n", 336 | "Sentiment Score: 0.327\n", 337 | "2018-09-12, Close, 162.00\n", 338 | "Sentiment Score: 0.327\n", 339 | "2018-09-13, Close, 161.36\n", 340 | "Sentiment Score: 0.327\n", 341 | "2018-09-14, Close, 162.32\n", 342 | "Sentiment Score: 0.327\n", 343 | "2018-09-17, Close, 160.58\n", 344 | "Sentiment Score: 0.327\n", 345 | "2018-09-18, Close, 160.30\n", 346 | "Sentiment Score: 0.327\n", 347 | "2018-09-19, Close, 163.06\n", 348 | "Sentiment Score: 0.988\n", 349 | "2018-09-20, Close, 166.02\n", 350 | "Sentiment Score: 0.453\n", 351 | "2018-09-20, SELL CREATE, 166.02\n", 352 | "2018-09-21, SELL EXECUTED, Price: 166.64, Cost: 1771.50, Comm 1.67\n", 353 | "2018-09-21, OPERATION PROFIT, GROSS -105.10, NET -108.54\n", 354 | "2018-09-21, Close, 162.93\n", 355 | "Sentiment Score: 0.975\n", 356 | "2018-09-21, BUY CREATE, 162.93\n", 357 | "2018-09-24, BUY EXECUTED, Price: 161.03, Cost: 1610.30, Comm 1.61\n", 358 | "2018-09-24, Close, 165.41\n", 359 | "Sentiment Score: 0.975\n", 360 | "2018-09-25, Close, 164.91\n", 361 | "Sentiment Score: -0.975\n", 362 | "2018-09-25, SELL CREATE, 164.91\n", 363 | "2018-09-26, SELL EXECUTED, Price: 164.30, Cost: 1610.30, Comm 1.64\n", 364 | "2018-09-26, OPERATION PROFIT, GROSS 32.70, NET 29.45\n", 365 | "2018-09-26, Close, 166.95\n", 366 | "Sentiment Score: 0.486\n", 367 | "2018-09-26, BUY CREATE, 166.95\n", 368 | "2018-09-27, BUY EXECUTED, Price: 167.55, Cost: 1675.50, Comm 1.68\n", 369 | "2018-09-27, Close, 168.84\n", 370 | "Sentiment Score: 0.998\n", 371 | "2018-09-28, Close, 164.46\n", 372 | "Sentiment Score: -0.948\n", 373 | "2018-09-28, SELL CREATE, 164.46\n", 374 | "2018-10-01, SELL EXECUTED, Price: 163.03, Cost: 1675.50, Comm 1.63\n", 375 | "2018-10-01, OPERATION PROFIT, GROSS -45.20, NET -48.51\n", 376 | "2018-10-01, Close, 162.44\n", 377 | "Sentiment Score: -0.948\n", 378 | "2018-10-02, Close, 159.33\n", 379 | "Sentiment Score: -0.952\n", 380 | "2018-10-03, Close, 162.43\n", 381 | "Sentiment Score: 0.318\n", 382 | "2018-10-03, BUY CREATE, 162.43\n", 383 | "2018-10-04, BUY EXECUTED, Price: 161.46, Cost: 1614.60, Comm 1.61\n", 384 | "2018-10-04, Close, 158.85\n", 385 | "Sentiment Score: -0.002\n", 386 | "2018-10-05, Close, 157.33\n", 387 | "Sentiment Score: -0.928\n", 388 | "2018-10-05, SELL CREATE, 157.33\n", 389 | "2018-10-08, SELL EXECUTED, Price: 155.54, Cost: 1614.60, Comm 1.56\n", 390 | "2018-10-08, OPERATION PROFIT, GROSS -59.20, NET -62.37\n", 391 | "2018-10-08, Close, 157.25\n", 392 | "Sentiment Score: -0.928\n", 393 | "2018-10-09, Close, 157.90\n", 394 | "Sentiment Score: 0.935\n", 395 | "2018-10-09, BUY CREATE, 157.90\n", 396 | "2018-10-10, BUY EXECUTED, Price: 156.82, Cost: 1568.20, Comm 1.57\n", 397 | "2018-10-10, Close, 151.38\n", 398 | "Sentiment Score: 0.935\n", 399 | "2018-10-11, Close, 153.35\n", 400 | "Sentiment Score: 0.156\n", 401 | "2018-10-11, SELL CREATE, 153.35\n", 402 | "2018-10-12, SELL EXECUTED, Price: 156.73, Cost: 1568.20, Comm 1.57\n", 403 | "2018-10-12, OPERATION PROFIT, GROSS -0.90, NET -4.04\n", 404 | "2018-10-12, Close, 153.74\n", 405 | "Sentiment Score: 0.156\n", 406 | "2018-10-15, Close, 153.52\n", 407 | "Sentiment Score: 0.156\n", 408 | "2018-10-16, Close, 158.78\n", 409 | "Sentiment Score: 0.156\n", 410 | "2018-10-17, Close, 159.42\n", 411 | "Sentiment Score: 0.156\n", 412 | "2018-10-18, Close, 154.92\n", 413 | "Sentiment Score: 0.156\n", 414 | "2018-10-19, Close, 154.05\n", 415 | "Sentiment Score: 0.981\n", 416 | "2018-10-19, BUY CREATE, 154.05\n", 417 | "2018-10-22, BUY EXECUTED, Price: 154.76, Cost: 1547.60, Comm 1.55\n", 418 | "2018-10-22, Close, 154.78\n", 419 | "Sentiment Score: 0.981\n", 420 | "2018-10-23, Close, 154.39\n", 421 | "Sentiment Score: 0.981\n", 422 | "2018-10-24, Close, 146.04\n", 423 | "Sentiment Score: -0.977\n", 424 | "2018-10-24, SELL CREATE, 146.04\n", 425 | "2018-10-25, SELL EXECUTED, Price: 147.73, Cost: 1547.60, Comm 1.48\n", 426 | "2018-10-25, OPERATION PROFIT, GROSS -70.30, NET -73.32\n", 427 | "2018-10-25, Close, 150.95\n", 428 | "Sentiment Score: 0.969\n", 429 | "2018-10-25, BUY CREATE, 150.95\n", 430 | "2018-10-26, BUY EXECUTED, Price: 145.82, Cost: 1458.20, Comm 1.46\n", 431 | "2018-10-26, Close, 145.37\n", 432 | "Sentiment Score: 0.983\n", 433 | "2018-10-29, Close, 142.09\n", 434 | "Sentiment Score: 0.983\n", 435 | "2018-10-30, Close, 146.22\n", 436 | "Sentiment Score: 0.856\n", 437 | "2018-10-31, Close, 151.79\n", 438 | "Sentiment Score: 0.856\n", 439 | "2018-11-01, Close, 151.75\n", 440 | "Sentiment Score: 0.973\n", 441 | "2018-11-02, Close, 150.35\n", 442 | "Sentiment Score: 0.973\n", 443 | "2018-11-05, Close, 148.68\n", 444 | "Sentiment Score: 0.973\n", 445 | "2018-11-06, Close, 149.94\n", 446 | "Sentiment Score: 0.973\n", 447 | "2018-11-07, Close, 151.53\n", 448 | "Sentiment Score: 0.973\n", 449 | "2018-11-08, Close, 147.87\n", 450 | "Sentiment Score: -0.567\n", 451 | "2018-11-08, SELL CREATE, 147.87\n", 452 | "2018-11-09, SELL EXECUTED, Price: 146.75, Cost: 1458.20, Comm 1.47\n", 453 | "2018-11-09, OPERATION PROFIT, GROSS 9.30, NET 6.37\n", 454 | "2018-11-09, Close, 144.96\n", 455 | "Sentiment Score: -0.847\n", 456 | "2018-11-12, Close, 141.55\n", 457 | "Sentiment Score: -0.847\n", 458 | "2018-11-13, Close, 142.16\n", 459 | "Sentiment Score: -0.847\n", 460 | "2018-11-14, Close, 144.22\n", 461 | "Sentiment Score: 0.998\n", 462 | "2018-11-14, BUY CREATE, 144.22\n", 463 | "2018-11-15, BUY EXECUTED, Price: 142.33, Cost: 1423.30, Comm 1.42\n", 464 | "2018-11-15, Close, 143.85\n", 465 | "Sentiment Score: -0.982\n", 466 | "2018-11-15, SELL CREATE, 143.85\n", 467 | "2018-11-16, SELL EXECUTED, Price: 141.07, Cost: 1423.30, Comm 1.41\n", 468 | "2018-11-16, OPERATION PROFIT, GROSS -12.60, NET -15.43\n", 469 | "2018-11-16, Close, 139.53\n", 470 | "Sentiment Score: -0.982\n", 471 | "2018-11-19, Close, 131.55\n", 472 | "Sentiment Score: -0.982\n", 473 | "2018-11-20, Close, 132.43\n", 474 | "Sentiment Score: -0.982\n", 475 | "2018-11-21, Close, 134.82\n", 476 | "Sentiment Score: -0.982\n", 477 | "2018-11-23, Close, 131.73\n", 478 | "Sentiment Score: -0.84\n", 479 | "2018-11-23, (MA Period 15) Ending Value 99742.12\n", 480 | "Final Portfolio Value: 99742.12\n" 481 | ] 482 | } 483 | ], 484 | "source": [ 485 | "from __future__ import (absolute_import, division, print_function,\n", 486 | " unicode_literals)\n", 487 | "\n", 488 | "# %matplotlib inline\n", 489 | "# import warnings\n", 490 | "# warnings.filterwarnings('ignore')\n", 491 | "\n", 492 | "import backtrader as bt\n", 493 | "import backtrader.indicators as btind\n", 494 | "import datetime\n", 495 | "import os.path\n", 496 | "import sys\n", 497 | "\n", 498 | "class Sentiment(bt.Indicator):\n", 499 | " lines = ('sentiment',)\n", 500 | " plotinfo = dict(\n", 501 | " plotymargin=0.15,\n", 502 | " plothlines=[0],\n", 503 | " plotyticks=[1.0, 0, -1.0])\n", 504 | " \n", 505 | " def next(self):\n", 506 | " self.date = self.data.datetime\n", 507 | " date = bt.num2date(self.date[0]).date()\n", 508 | " prev_sentiment = self.sentiment\n", 509 | " if date in date_sentiment:\n", 510 | " self.sentiment = date_sentiment[date]\n", 511 | " self.lines.sentiment[0] = self.sentiment\n", 512 | "\n", 513 | "\n", 514 | "class SentimentStrat(bt.Strategy):\n", 515 | " params = (\n", 516 | " ('period', 15),\n", 517 | " ('printlog', True),\n", 518 | " )\n", 519 | "\n", 520 | " def log(self, txt, dt=None, doprint=False):\n", 521 | " ''' Logging function for this strategy'''\n", 522 | " if self.params.printlog or doprint:\n", 523 | " dt = dt or self.datas[0].datetime.date(0)\n", 524 | " print('%s, %s' % (dt.isoformat(), txt))\n", 525 | "\n", 526 | " def __init__(self):\n", 527 | " # Keep a reference to the \"close\" line in the data[0] dataseries\n", 528 | " self.dataclose = self.datas[0].close\n", 529 | " # Keep track of pending orders\n", 530 | " self.order = None\n", 531 | " self.buyprice = None\n", 532 | " self.buycomm = None\n", 533 | " self.sma = bt.indicators.SimpleMovingAverage(\n", 534 | " self.datas[0], period=self.params.period)\n", 535 | " self.date = self.data.datetime\n", 536 | " self.sentiment = None\n", 537 | " Sentiment(self.data)\n", 538 | " \n", 539 | " def notify_order(self, order):\n", 540 | " if order.status in [order.Submitted, order.Accepted]:\n", 541 | " # Buy/Sell order submitted/accepted to/by broker - Nothing to do\n", 542 | " return\n", 543 | " \n", 544 | " # Check if an order has been completed\n", 545 | " # Attention: broker could reject order if not enough cash\n", 546 | " if order.status in [order.Completed]:\n", 547 | " if order.isbuy():\n", 548 | " self.log(\n", 549 | " 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %\n", 550 | " (order.executed.price,\n", 551 | " order.executed.value,\n", 552 | " order.executed.comm))\n", 553 | " self.buyprice = order.executed.price\n", 554 | " self.buycomm = order.executed.comm\n", 555 | " else: # Sell\n", 556 | " self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %\n", 557 | " (order.executed.price,\n", 558 | " order.executed.value,\n", 559 | " order.executed.comm))\n", 560 | " \n", 561 | " self.bar_executed = len(self) \n", 562 | " \n", 563 | " elif order.status in [order.Canceled, order.Margin, order.Rejected]:\n", 564 | " self.log('Order Canceled/Margin/Rejected')\n", 565 | " \n", 566 | " # Write down: no pending order\n", 567 | " self.order = None\n", 568 | " \n", 569 | " def notify_trade(self, trade):\n", 570 | " if not trade.isclosed:\n", 571 | " return\n", 572 | "\n", 573 | " self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %\n", 574 | " (trade.pnl, trade.pnlcomm))\n", 575 | " \n", 576 | " ### Main Strat ###\n", 577 | " def next(self):\n", 578 | " # log closing price of the series from the reference\n", 579 | " self.log('Close, %.2f' % self.dataclose[0])\n", 580 | " \n", 581 | " date = bt.num2date(self.date[0]).date()\n", 582 | " prev_sentiment = self.sentiment\n", 583 | " if date in date_sentiment:\n", 584 | " self.sentiment = date_sentiment[date]\n", 585 | " \n", 586 | " # Check if an order is pending. if yes, we cannot send a 2nd one\n", 587 | " if self.order:\n", 588 | " return\n", 589 | " print(self.sentiment)\n", 590 | " # If not in the market and previous sentiment not none\n", 591 | " if not self.position and prev_sentiment:\n", 592 | " # buy if current close more than sma AND sentiment increased by >= 0.5\n", 593 | " if self.dataclose[0] > self.sma[0] and self.sentiment - prev_sentiment >= 0.5:\n", 594 | " self.log('BUY CREATE, %.2f' % self.dataclose[0])\n", 595 | " self.order = self.buy()\n", 596 | " \n", 597 | " # Already in the market and previous sentiment not none\n", 598 | " elif prev_sentiment:\n", 599 | " # sell if current close less than sma AND sentiment decreased by >= 0.5\n", 600 | " if self.dataclose[0] < self.sma[0] and self.sentiment - prev_sentiment <= -0.5:\n", 601 | " self.log('SELL CREATE, %.2f' % self.dataclose[0])\n", 602 | " self.order = self.sell()\n", 603 | "\n", 604 | " def stop(self):\n", 605 | " self.log('(MA Period %2d) Ending Value %.2f' %\n", 606 | " (self.params.period, self.broker.getvalue()), doprint=True)\n", 607 | " \n", 608 | "\n", 609 | "if __name__ == '__main__':\n", 610 | " cerebro = bt.Cerebro()\n", 611 | " \n", 612 | " # Strategy\n", 613 | " cerebro.addstrategy(SentimentStrat)\n", 614 | "\n", 615 | " # Data Feed\n", 616 | " data = bt.feeds.YahooFinanceData(\n", 617 | " dataname = 'FB',\n", 618 | " fromdate = earliest_date,\n", 619 | " todate = datetime.datetime(2018,11,25),\n", 620 | " reverse = False\n", 621 | " )\n", 622 | " \n", 623 | " cerebro.adddata(data)\n", 624 | "\n", 625 | " cerebro.broker.setcash(100000.0)\n", 626 | " cerebro.addsizer(bt.sizers.FixedSize, stake=10)\n", 627 | " cerebro.broker.setcommission(commission=0.001)\n", 628 | " print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())\n", 629 | " cerebro.run()\n", 630 | " print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())\n", 631 | " \n", 632 | " cerebro.plot()\n" 633 | ] 634 | }, 635 | { 636 | "cell_type": "code", 637 | "execution_count": null, 638 | "metadata": {}, 639 | "outputs": [], 640 | "source": [] 641 | } 642 | ], 643 | "metadata": { 644 | "kernelspec": { 645 | "display_name": "Python 3", 646 | "language": "python", 647 | "name": "python3" 648 | }, 649 | "language_info": { 650 | "codemirror_mode": { 651 | "name": "ipython", 652 | "version": 3 653 | }, 654 | "file_extension": ".py", 655 | "mimetype": "text/x-python", 656 | "name": "python", 657 | "nbconvert_exporter": "python", 658 | "pygments_lexer": "ipython3", 659 | "version": "3.7.0" 660 | } 661 | }, 662 | "nbformat": 4, 663 | "nbformat_minor": 2 664 | } 665 | -------------------------------------------------------------------------------- /lexicon_data/lm_negative.csv: -------------------------------------------------------------------------------- 1 | ABANDON 2 | ABANDONED 3 | ABANDONING 4 | ABANDONMENT 5 | ABANDONMENTS 6 | ABANDONS 7 | ABDICATED 8 | ABDICATES 9 | ABDICATING 10 | ABDICATION 11 | ABDICATIONS 12 | ABERRANT ABERRATION 13 | ABERRATIONAL 14 | ABERRATIONS 15 | ABETTING 16 | ABNORMAL 17 | ABNORMALITIES 18 | ABNORMALITY 19 | ABNORMALLY 20 | ABOLISH 21 | ABOLISHED ABOLISHES 22 | ABOLISHING ABROGATE 23 | ABROGATED ABROGATES 24 | ABROGATING 25 | ABROGATION 26 | ABROGATIONS 27 | ABRUPT 28 | ABRUPTLY 29 | ABRUPTNESS ABSENCE 30 | ABSENCES 31 | ABSENTEEISM 32 | ABUSE 33 | ABUSED 34 | ABUSES 35 | ABUSING 36 | ABUSIVE 37 | ABUSIVELY 38 | ABUSIVENESS 39 | ACCIDENT 40 | ACCIDENTAL 41 | ACCIDENTALLY 42 | ACCIDENTS ACCUSATION 43 | ACCUSATIONS 44 | ACCUSE 45 | ACCUSED 46 | ACCUSES 47 | ACCUSING ACQUIESCE 48 | ACQUIESCED 49 | ACQUIESCES 50 | ACQUIESCING 51 | ACQUIT 52 | ACQUITS 53 | ACQUITTAL ACQUITTALS 54 | ACQUITTED 55 | ACQUITTING 56 | ADULTERATE 57 | ADULTERATED 58 | ADULTERATING 59 | ADULTERATION 60 | ADULTERATIONS 61 | ADVERSARIAL 62 | ADVERSARIES 63 | ADVERSARY 64 | ADVERSE 65 | ADVERSELY 66 | ADVERSITIES 67 | ADVERSITY 68 | AFTERMATH 69 | AFTERMATHS 70 | AGAINST 71 | AGGRAVATE 72 | AGGRAVATED 73 | AGGRAVATES 74 | AGGRAVATING 75 | AGGRAVATION 76 | AGGRAVATIONS 77 | ALERTED 78 | ALERTING ALIENATE 79 | ALIENATED 80 | ALIENATES 81 | ALIENATING ALIENATION 82 | ALIENATIONS 83 | ALLEGATION 84 | ALLEGATIONS 85 | ALLEGE 86 | ALLEGED 87 | ALLEGEDLY 88 | ALLEGES 89 | ALLEGING 90 | ANNOY 91 | ANNOYANCE 92 | ANNOYANCES 93 | ANNOYED ANNOYING 94 | ANNOYS 95 | ANNUL 96 | ANNULLED 97 | ANNULLING 98 | ANNULMENT 99 | ANNULMENTS 100 | ANNULS 101 | ANOMALIES 102 | ANOMALOUS 103 | ANOMALOUSLY 104 | ANOMALY 105 | ANTICOMPETITIVE 106 | ANTITRUST 107 | ARGUE 108 | ARGUED 109 | ARGUING 110 | ARGUMENT 111 | ARGUMENTATIVE 112 | ARGUMENTS 113 | ARREARAGE ARREARAGES ARREARS 114 | ARREST 115 | ARRESTED 116 | ARRESTS 117 | ARTIFICIALLY 118 | ASSAULT 119 | ASSAULTED 120 | ASSAULTING ASSAULTS 121 | ASSERTIONS 122 | ATTRITION AVERSELY 123 | BACKDATING 124 | BAD 125 | BAIL 126 | BAILOUT 127 | BALK 128 | BALKED 129 | BANKRUPT 130 | BANKRUPTCIES 131 | BANKRUPTCY BANKRUPTED 132 | BANKRUPTING 133 | BANKRUPTS 134 | BANS 135 | BARRED 136 | BARRIER 137 | BARRIERS 138 | BOTTLENECK 139 | BOTTLENECKS BOYCOTT 140 | BOYCOTTED 141 | BOYCOTTING 142 | BOYCOTTS 143 | BREACH 144 | BREACHED 145 | BREACHES 146 | BREACHING 147 | BREAK BREAKAGE 148 | BREAKAGES BREAKDOWN 149 | BREAKDOWNS 150 | BREAKING 151 | BREAKS 152 | BRIBE 153 | BRIBED 154 | BRIBERIES 155 | BRIBERY 156 | BRIBES 157 | BRIBING 158 | BRIDGE 159 | BROKEN 160 | BURDEN 161 | BURDENED 162 | BURDENING 163 | BURDENS BURDENSOME 164 | BURNED 165 | CALAMITIES 166 | CALAMITOUS CALAMITY CANCEL 167 | CANCELED CANCELING 168 | CANCELLATION 169 | CANCELLATIONS 170 | CANCELLED 171 | CANCELLING 172 | CANCELS 173 | CARELESS 174 | CARELESSLY CARELESSNESS 175 | CATASTROPHE 176 | CATASTROPHES 177 | CATASTROPHIC CATASTROPHICALLY 178 | CAUTION 179 | CAUTIONARY CAUTIONED 180 | CAUTIONING CAUTIONS 181 | CEASE 182 | CEASED 183 | CEASES 184 | CEASING 185 | CENSURE 186 | CENSURED 187 | CENSURES 188 | CENSURING 189 | CHALLENGE 190 | CHALLENGED CHALLENGES 191 | CHALLENGING 192 | CHARGEOFFS 193 | CIRCUMVENT CIRCUMVENTED 194 | CIRCUMVENTING 195 | CIRCUMVENTION 196 | CIRCUMVENTIONS 197 | CIRCUMVENTS 198 | CLAIMING 199 | CLAIMS 200 | CLAWBACK 201 | CLOSED 202 | CLOSEOUT 203 | CLOSEOUTS 204 | CLOSING 205 | CLOSINGS 206 | CLOSURE 207 | CLOSURES 208 | COERCE 209 | COERCED 210 | COERCES 211 | COERCING 212 | COERCION COERCIVE 213 | COLLAPSE 214 | COLLAPSED 215 | COLLAPSES 216 | COLLAPSING 217 | COLLISION COLLISIONS 218 | COLLUDE 219 | COLLUDED 220 | COLLUDES 221 | COLLUDING 222 | COLLUSION 223 | COLLUSIONS 224 | COLLUSIVE 225 | COMPLAIN 226 | COMPLAINED 227 | COMPLAINING 228 | COMPLAINS 229 | COMPLAINT 230 | COMPLAINTS 231 | COMPLICATE 232 | COMPLICATED 233 | COMPLICATES 234 | COMPLICATING 235 | COMPLICATION 236 | COMPLICATIONS 237 | COMPULSION 238 | CONCEALED 239 | CONCEALING 240 | CONCEDE 241 | CONCEDED 242 | CONCEDES 243 | CONCEDING CONCERN 244 | CONCERNED 245 | CONCERNS 246 | CONCILIATING 247 | CONCILIATION 248 | CONCILIATIONS 249 | CONDEMN 250 | CONDEMNATION 251 | CONDEMNATIONS 252 | CONDEMNED 253 | CONDEMNING 254 | CONDEMNS 255 | CONDONE CONDONED CONFESS 256 | CONFESSED 257 | CONFESSES 258 | CONFESSING 259 | CONFESSION 260 | CONFINE 261 | CONFINED 262 | CONFINEMENT 263 | CONFINEMENTS 264 | CONFINES 265 | CONFINING 266 | CONFISCATE 267 | CONFISCATED 268 | CONFISCATES 269 | CONFISCATING 270 | CONFISCATION 271 | CONFISCATIONS 272 | CONFLICT 273 | CONFLICTED 274 | CONFLICTING 275 | CONFLICTS 276 | CONFRONT 277 | CONFRONTATION 278 | CONFRONTATIONAL 279 | CONFRONTATIONS 280 | CONFRONTED 281 | CONFRONTING 282 | CONFRONTS 283 | CONFUSE 284 | CONFUSED 285 | CONFUSES 286 | CONFUSING CONFUSINGLY 287 | CONFUSION 288 | CONSPIRACIES CONSPIRACY 289 | CONSPIRATOR 290 | CONSPIRATORIAL CONSPIRATORS CONSPIRE 291 | CONSPIRED 292 | CONSPIRES 293 | CONSPIRING 294 | CONTEMPT 295 | CONTEND 296 | CONTENDED 297 | CONTENDING 298 | CONTENDS 299 | CONTENTION 300 | CONTENTIONS 301 | CONTENTIOUS 302 | CONTENTIOUSLY 303 | CONTESTED 304 | CONTESTING 305 | CONTRACTION 306 | CONTRACTIONS 307 | CONTRADICT 308 | CONTRADICTED 309 | CONTRADICTING 310 | CONTRADICTION 311 | CONTRADICTIONS 312 | CONTRADICTORY CONTRADICTS 313 | CONTRARY 314 | CONTROVERSIAL 315 | CONTROVERSIES 316 | CONTROVERSY 317 | CONVICT 318 | CONVICTED 319 | CONVICTING 320 | CONVICTION 321 | CONVICTIONS 322 | CORRECTED 323 | CORRECTING 324 | CORRECTION 325 | CORRECTIONS 326 | CORRECTS 327 | CORRUPT CORRUPTED 328 | CORRUPTING 329 | CORRUPTION 330 | CORRUPTIONS 331 | CORRUPTLY 332 | CORRUPTNESS 333 | COSTLY COUNTERCLAIM 334 | COUNTERCLAIMED 335 | COUNTERCLAIMING 336 | COUNTERCLAIMS 337 | COUNTERFEIT 338 | COUNTERFEITED 339 | COUNTERFEITER 340 | COUNTERFEITERS 341 | COUNTERFEITING 342 | COUNTERFEITS COUNTERMEASURE 343 | COUNTERMEASURES 344 | CRIME 345 | CRIMES 346 | CRIMINAL CRIMINALLY 347 | CRIMINALS 348 | CRISES 349 | CRISIS 350 | CRITICAL 351 | CRITICALLY 352 | CRITICISM 353 | CRITICISMS 354 | CRITICIZE 355 | CRITICIZED 356 | CRITICIZES 357 | CRITICIZING 358 | CRUCIAL CRUCIALLY 359 | CULPABILITY 360 | CULPABLE 361 | CULPABLY CUMBERSOME 362 | CURTAIL 363 | CURTAILED 364 | CURTAILING 365 | CURTAILMENT 366 | CURTAILMENTS 367 | CURTAILS 368 | CUT 369 | CUTBACK 370 | CUTBACKS 371 | CYBERATTACK 372 | CYBERATTACKS CYBERBULLYING 373 | CYBERCRIME 374 | CYBERCRIMES 375 | CYBERCRIMINAL 376 | CYBERCRIMINALS 377 | DAMAGE DAMAGED 378 | DAMAGES 379 | DAMAGING 380 | DAMPEN 381 | DAMPENED 382 | DANGER 383 | DANGEROUS 384 | DANGEROUSLY 385 | DANGERS 386 | DEADLOCK 387 | DEADLOCKED 388 | DEADLOCKING 389 | DEADLOCKS DEADWEIGHT 390 | DEADWEIGHTS DEBARMENT 391 | DEBARMENTS 392 | DEBARRED 393 | DECEASED 394 | DECEIT 395 | DECEITFUL 396 | DECEITFULNESS 397 | DECEIVE 398 | DECEIVED 399 | DECEIVES 400 | DECEIVING 401 | DECEPTION 402 | DECEPTIONS DECEPTIVE 403 | DECEPTIVELY 404 | DECLINE 405 | DECLINED 406 | DECLINES 407 | DECLINING 408 | DEFACE 409 | DEFACED 410 | DEFACEMENT 411 | DEFAMATION 412 | DEFAMATIONS 413 | DEFAMATORY 414 | DEFAME 415 | DEFAMED 416 | DEFAMES 417 | DEFAMING DEFAULT 418 | DEFAULTED 419 | DEFAULTING DEFAULTS 420 | DEFEAT 421 | DEFEATED 422 | DEFEATING 423 | DEFEATS 424 | DEFECT 425 | DEFECTIVE 426 | DEFECTS 427 | DEFEND 428 | DEFENDANT 429 | DEFENDANTS DEFENDED 430 | DEFENDING 431 | DEFENDS 432 | DEFENSIVE 433 | DEFER 434 | DEFICIENCIES 435 | DEFICIENCY 436 | DEFICIENT 437 | DEFICIT 438 | DEFICITS 439 | DEFRAUD 440 | DEFRAUDED 441 | DEFRAUDING 442 | DEFRAUDS 443 | DEFUNCT 444 | DEGRADATION 445 | DEGRADATIONS 446 | DEGRADE 447 | DEGRADED 448 | DEGRADES 449 | DEGRADING 450 | DELAY 451 | DELAYED DELAYING 452 | DELAYS 453 | DELETERIOUS 454 | DELIBERATE 455 | DELIBERATED DELIBERATELY DELINQUENCIES 456 | DELINQUENCY 457 | DELINQUENT 458 | DELINQUENTLY 459 | DELINQUENTS 460 | DELIST 461 | DELISTED 462 | DELISTING DELISTS 463 | DEMISE 464 | DEMISED 465 | DEMISES 466 | DEMISING 467 | DEMOLISH 468 | DEMOLISHED 469 | DEMOLISHES 470 | DEMOLISHING 471 | DEMOLITION 472 | DEMOLITIONS 473 | DEMOTE 474 | DEMOTED 475 | DEMOTES 476 | DEMOTING 477 | DEMOTION 478 | DEMOTIONS 479 | DENIAL 480 | DENIALS 481 | DENIED 482 | DENIES 483 | DENIGRATE 484 | DENIGRATED 485 | DENIGRATES 486 | DENIGRATING 487 | DENIGRATION 488 | DENY 489 | DENYING 490 | DEPLETE 491 | DEPLETED 492 | DEPLETES 493 | DEPLETING DEPLETION 494 | DEPLETIONS 495 | DEPRECATION 496 | DEPRESS 497 | DEPRESSED 498 | DEPRESSES 499 | DEPRESSING 500 | DEPRIVATION 501 | DEPRIVE 502 | DEPRIVED DEPRIVES 503 | DEPRIVING DERELICT 504 | DERELICTION 505 | DEROGATORY 506 | DESTABILIZATION 507 | DESTABILIZE 508 | DESTABILIZED 509 | DESTABILIZING 510 | DESTROY 511 | DESTROYED 512 | DESTROYING DESTROYS 513 | DESTRUCTION 514 | DESTRUCTIVE DETAIN 515 | DETAINED 516 | DETENTION 517 | DETENTIONS 518 | DETER 519 | DETERIORATE 520 | DETERIORATED 521 | DETERIORATES 522 | DETERIORATING 523 | DETERIORATION 524 | DETERIORATIONS 525 | DETERRED DETERRENCE 526 | DETERRENCES 527 | DETERRENT 528 | DETERRENTS DETERRING 529 | DETERS 530 | DETRACT 531 | DETRACTED 532 | DETRACTING DETRIMENT 533 | DETRIMENTAL 534 | DETRIMENTALLY 535 | DETRIMENTS DEVALUE 536 | DEVALUED 537 | DEVALUES 538 | DEVALUING 539 | DEVASTATE 540 | DEVASTATED 541 | DEVASTATING 542 | DEVASTATION 543 | DEVIATE 544 | DEVIATED 545 | DEVIATES 546 | DEVIATING 547 | DEVIATION 548 | DEVIATIONS 549 | DEVOLVE 550 | DEVOLVED DEVOLVES 551 | DEVOLVING 552 | DIFFICULT 553 | DIFFICULTIES DIFFICULTLY DIFFICULTY DIMINISH 554 | DIMINISHED DIMINISHES 555 | DIMINISHING 556 | DIMINUTION 557 | DISADVANTAGE 558 | DISADVANTAGED 559 | DISADVANTAGEOUS 560 | DISADVANTAGES DISAFFILIATION 561 | DISAGREE DISAGREEABLE 562 | DISAGREED 563 | DISAGREEING 564 | DISAGREEMENT 565 | DISAGREEMENTS 566 | DISAGREES 567 | DISALLOW 568 | DISALLOWANCE 569 | DISALLOWANCES DISALLOWED 570 | DISALLOWING 571 | DISALLOWS DISAPPEAR 572 | DISAPPEARANCE 573 | DISAPPEARANCES DISAPPEARED 574 | DISAPPEARING 575 | DISAPPEARS 576 | DISAPPOINT DISAPPOINTED 577 | DISAPPOINTING 578 | DISAPPOINTINGLY 579 | DISAPPOINTMENT 580 | DISAPPOINTMENTS 581 | DISAPPOINTS 582 | DISAPPROVAL 583 | DISAPPROVALS 584 | DISAPPROVE 585 | DISAPPROVED 586 | DISAPPROVES 587 | DISAPPROVING 588 | DISASSOCIATES 589 | DISASSOCIATING 590 | DISASSOCIATION 591 | DISASSOCIATIONS 592 | DISASTER 593 | DISASTERS 594 | DISASTROUS 595 | DISASTROUSLY 596 | DISAVOW 597 | DISAVOWAL 598 | DISAVOWED 599 | DISAVOWING 600 | DISAVOWS 601 | DISCIPLINARY 602 | DISCLAIM DISCLAIMED 603 | DISCLAIMER 604 | DISCLAIMERS 605 | DISCLAIMING 606 | DISCLAIMS 607 | DISCLOSE DISCLOSED 608 | DISCLOSES 609 | DISCLOSING DISCONTINUANCE 610 | DISCONTINUANCES 611 | DISCONTINUATION 612 | DISCONTINUATIONS 613 | DISCONTINUE 614 | DISCONTINUED 615 | DISCONTINUES DISCONTINUING 616 | DISCOURAGE DISCOURAGED 617 | DISCOURAGES 618 | DISCOURAGING 619 | DISCREDIT DISCREDITED 620 | DISCREDITING 621 | DISCREDITS 622 | DISCREPANCIES 623 | DISCREPANCY DISFAVOR 624 | DISFAVORED 625 | DISFAVORING DISFAVORS 626 | DISGORGE 627 | DISGORGED 628 | DISGORGEMENT 629 | DISGORGEMENTS 630 | DISGORGES DISGORGING 631 | DISGRACE 632 | DISGRACEFUL 633 | DISGRACEFULLY 634 | DISHONEST 635 | DISHONESTLY 636 | DISHONESTY 637 | DISHONOR 638 | DISHONORABLE 639 | DISHONORABLY 640 | DISHONORED 641 | DISHONORING 642 | DISHONORS 643 | DISINCENTIVES DISINTERESTED DISINTERESTEDLY 644 | DISINTERESTEDNESS DISLOYAL 645 | DISLOYALLY DISLOYALTY 646 | DISMAL 647 | DISMALLY DISMISS 648 | DISMISSAL 649 | DISMISSALS 650 | DISMISSED 651 | DISMISSES 652 | DISMISSING 653 | DISORDERLY 654 | DISPARAGE 655 | DISPARAGED 656 | DISPARAGEMENT DISPARAGEMENTS 657 | DISPARAGES 658 | DISPARAGING 659 | DISPARAGINGLY 660 | DISPARITIES DISPARITY 661 | DISPLACE DISPLACED 662 | DISPLACEMENT 663 | DISPLACEMENTS 664 | DISPLACES DISPLACING 665 | DISPOSE 666 | DISPOSSESS 667 | DISPOSSESSED 668 | DISPOSSESSES 669 | DISPOSSESSING 670 | DISPROPORTION 671 | DISPROPORTIONAL 672 | DISPROPORTIONATE 673 | DISPROPORTIONATELY 674 | DISPUTE 675 | DISPUTED 676 | DISPUTES 677 | DISPUTING 678 | DISQUALIFICATION DISQUALIFICATIONS 679 | DISQUALIFIED DISQUALIFIES 680 | DISQUALIFY 681 | DISQUALIFYING DISREGARD 682 | DISREGARDED DISREGARDING 683 | DISREGARDS 684 | DISREPUTABLE 685 | DISREPUTE 686 | DISRUPT 687 | DISRUPTED 688 | DISRUPTING 689 | DISRUPTION 690 | DISRUPTIONS DISRUPTIVE 691 | DISRUPTS 692 | DISSATISFACTION DISSATISFIED 693 | DISSENT 694 | DISSENTED 695 | DISSENTER 696 | DISSENTERS 697 | DISSENTING 698 | DISSENTS 699 | DISSIDENT 700 | DISSIDENTS 701 | DISSOLUTION 702 | DISSOLUTIONS 703 | DISTORT 704 | DISTORTED 705 | DISTORTING 706 | DISTORTION 707 | DISTORTIONS DISTORTS 708 | DISTRACT DISTRACTED 709 | DISTRACTING 710 | DISTRACTION 711 | DISTRACTIONS 712 | DISTRACTS 713 | DISTRESS 714 | DISTRESSED 715 | DISTURB 716 | DISTURBANCE DISTURBANCES 717 | DISTURBED 718 | DISTURBING DISTURBS 719 | DIVERSION 720 | DIVERT 721 | DIVERTED DIVERTING 722 | DIVERTS 723 | DIVEST 724 | DIVESTED 725 | DIVESTING 726 | DIVESTITURE 727 | DIVESTITURES 728 | DIVESTMENT 729 | DIVESTMENTS 730 | DIVESTS 731 | DIVORCE 732 | DIVORCED 733 | DIVULGE 734 | DIVULGED 735 | DIVULGES DIVULGING 736 | DOUBT 737 | DOUBTED 738 | DOUBTFUL DOUBTS 739 | DOWNGRADE 740 | DOWNGRADED 741 | DOWNGRADES 742 | DOWNGRADING DOWNSIZE 743 | DOWNSIZED 744 | DOWNSIZES 745 | DOWNSIZING 746 | DOWNSIZINGS 747 | DOWNTIME 748 | DOWNTIMES 749 | DOWNTURN 750 | DOWNTURNS 751 | DOWNWARD 752 | DOWNWARDS 753 | DRAG 754 | DRASTIC 755 | DRASTICALLY 756 | DRAWBACK 757 | DRAWBACKS 758 | DROPPED 759 | DROUGHT DROUGHTS 760 | DURESS 761 | DYSFUNCTION 762 | DYSFUNCTIONAL DYSFUNCTIONS 763 | EASING EGREGIOUS 764 | EGREGIOUSLY 765 | EMBARGO 766 | EMBARGOED 767 | EMBARGOES 768 | EMBARGOING 769 | EMBARRASS 770 | EMBARRASSED 771 | EMBARRASSES 772 | EMBARRASSING 773 | EMBARRASSMENT EMBARRASSMENTS 774 | EMBEZZLE 775 | EMBEZZLED 776 | EMBEZZLEMENT 777 | EMBEZZLEMENTS EMBEZZLER 778 | EMBEZZLES 779 | EMBEZZLING 780 | ENCROACH 781 | ENCROACHED 782 | ENCROACHES ENCROACHING 783 | ENCROACHMENT 784 | ENCROACHMENTS 785 | ENCUMBER 786 | ENCUMBERED 787 | ENCUMBERING 788 | ENCUMBERS 789 | ENCUMBRANCE 790 | ENCUMBRANCES ENDANGER 791 | ENDANGERED 792 | ENDANGERING 793 | ENDANGERMENT ENDANGERS 794 | ENJOIN 795 | ENJOINED 796 | ENJOINING ENJOINS 797 | ERODE 798 | ERODED 799 | ERODES 800 | ERODING 801 | EROSION 802 | ERRATIC 803 | ERRATICALLY 804 | ERRED 805 | ERRING 806 | ERRONEOUS 807 | ERRONEOUSLY 808 | ERROR 809 | ERRORS 810 | ERRS ESCALATE 811 | ESCALATED 812 | ESCALATES 813 | ESCALATING 814 | EVADE EVADED 815 | EVADES 816 | EVADING 817 | EVASION 818 | EVASIONS 819 | EVASIVE 820 | EVICT 821 | EVICTED 822 | EVICTING 823 | EVICTION 824 | EVICTIONS EVICTS 825 | EXACERBATE 826 | EXACERBATED 827 | EXACERBATES 828 | EXACERBATING 829 | EXACERBATION 830 | EXACERBATIONS EXAGGERATE 831 | EXAGGERATED 832 | EXAGGERATES 833 | EXAGGERATING 834 | EXAGGERATION 835 | EXCESSIVE EXCESSIVELY 836 | EXCULPATE 837 | EXCULPATED 838 | EXCULPATES 839 | EXCULPATING 840 | EXCULPATION 841 | EXCULPATIONS EXCULPATORY 842 | EXONERATE 843 | EXONERATED 844 | EXONERATES 845 | EXONERATING 846 | EXONERATION 847 | EXONERATIONS 848 | EXPLOIT 849 | EXPLOITATION 850 | EXPLOITATIONS EXPLOITATIVE EXPLOITED 851 | EXPLOITING 852 | EXPLOITS 853 | EXPOSE 854 | EXPOSED 855 | EXPOSES 856 | EXPOSING 857 | EXPROPRIATE 858 | EXPROPRIATED 859 | EXPROPRIATES 860 | EXPROPRIATING 861 | EXPROPRIATION 862 | EXPROPRIATIONS 863 | EXPULSION 864 | EXPULSIONS EXTENUATING 865 | FAIL 866 | FAILED 867 | FAILING 868 | FAILINGS 869 | FAILS 870 | FAILURE 871 | FAILURES FALLOUT 872 | FALSE 873 | FALSELY 874 | FALSIFICATION 875 | FALSIFICATIONS FALSIFIED 876 | FALSIFIES FALSIFY 877 | FALSIFYING 878 | FALSITY 879 | FATALITIES 880 | FATALITY FATALLY 881 | FAULT 882 | FAULTED 883 | FAULTS 884 | FAULTY 885 | FEAR FEARS 886 | FELONIES 887 | FELONIOUS 888 | FELONY 889 | FICTITIOUS 890 | FINED 891 | FINES 892 | FIRED 893 | FIRING 894 | FLAW 895 | FLAWED 896 | FLAWS 897 | FORBID 898 | FORBIDDEN 899 | FORBIDDING 900 | FORBIDS 901 | FORCE 902 | FORCED 903 | FORCING 904 | FORECLOSE 905 | FORECLOSED 906 | FORECLOSES 907 | FORECLOSING 908 | FORECLOSURE FORECLOSURES 909 | FOREGO 910 | FOREGOES 911 | FOREGONE FORESTALL 912 | FORESTALLED 913 | FORESTALLING 914 | FORESTALLS 915 | FORFEIT 916 | FORFEITED 917 | FORFEITING 918 | FORFEITS 919 | FORFEITURE FORFEITURES 920 | FORGERS 921 | FORGERY FRAUD 922 | FRAUDS 923 | FRAUDULENCE FRAUDULENT 924 | FRAUDULENTLY FRIVOLOUS 925 | FRIVOLOUSLY 926 | FRUSTRATE 927 | FRUSTRATED 928 | FRUSTRATES 929 | FRUSTRATING 930 | FRUSTRATINGLY 931 | FRUSTRATION 932 | FRUSTRATIONS 933 | FUGITIVE 934 | FUGITIVES 935 | GRATUITOUS 936 | GRATUITOUSLY GRIEVANCE 937 | GRIEVANCES 938 | GROSSLY 939 | GROUNDLESS GUILTY 940 | HALT 941 | HALTED 942 | HAMPER 943 | HAMPERED 944 | HAMPERING HAMPERS 945 | HARASS 946 | HARASSED 947 | HARASSING HARASSMENT HARDSHIP 948 | HARDSHIPS 949 | HARM 950 | HARMED 951 | HARMFUL 952 | HARMFULLY 953 | HARMING 954 | HARMS 955 | HARSH 956 | HARSHER HARSHEST 957 | HARSHLY 958 | HARSHNESS HAZARD 959 | HAZARDOUS 960 | HAZARDS 961 | HINDER 962 | HINDERED 963 | HINDERING 964 | HINDERS 965 | HINDRANCE 966 | HINDRANCES 967 | HOSTILE 968 | HOSTILITY 969 | HURT 970 | HURTING 971 | IDLE 972 | IDLED 973 | IDLING 974 | IGNORE 975 | IGNORED 976 | IGNORES 977 | IGNORING 978 | ILL 979 | ILLEGAL 980 | ILLEGALITIES 981 | ILLEGALITY 982 | ILLEGALLY 983 | ILLEGIBLE 984 | ILLICIT 985 | ILLICITLY 986 | ILLIQUID ILLIQUIDITY 987 | IMBALANCE 988 | IMBALANCES 989 | IMMATURE IMMORAL 990 | IMPAIR 991 | IMPAIRED IMPAIRING 992 | IMPAIRMENT 993 | IMPAIRMENTS 994 | IMPAIRS 995 | IMPASSE 996 | IMPASSES 997 | IMPEDE 998 | IMPEDED 999 | IMPEDES 1000 | IMPEDIMENT IMPEDIMENTS 1001 | IMPEDING IMPENDING 1002 | IMPERATIVE 1003 | IMPERFECTION 1004 | IMPERFECTIONS IMPERIL 1005 | IMPERMISSIBLE 1006 | IMPLICATE 1007 | IMPLICATED 1008 | IMPLICATES 1009 | IMPLICATING IMPOSSIBILITY 1010 | IMPOSSIBLE 1011 | IMPOUND 1012 | IMPOUNDED 1013 | IMPOUNDING 1014 | IMPOUNDS 1015 | IMPRACTICABLE IMPRACTICAL 1016 | IMPRACTICALITIES 1017 | IMPRACTICALITY IMPRISONMENT IMPROPER 1018 | IMPROPERLY 1019 | IMPROPRIETIES 1020 | IMPROPRIETY IMPRUDENT 1021 | IMPRUDENTLY INABILITY 1022 | INACCESSIBLE 1023 | INACCURACIES INACCURACY INACCURATE 1024 | INACCURATELY INACTION 1025 | INACTIONS INACTIVATE 1026 | INACTIVATED 1027 | INACTIVATES 1028 | INACTIVATING 1029 | INACTIVATION 1030 | INACTIVATIONS 1031 | INACTIVITY 1032 | INADEQUACIES 1033 | INADEQUACY INADEQUATE INADEQUATELY INADVERTENT 1034 | INADVERTENTLY 1035 | INADVISABILITY 1036 | INADVISABLE INAPPROPRIATE INAPPROPRIATELY 1037 | INATTENTION 1038 | INCAPABLE 1039 | INCAPACITATED 1040 | INCAPACITY 1041 | INCARCERATE 1042 | INCARCERATED 1043 | INCARCERATES 1044 | INCARCERATING 1045 | INCARCERATION 1046 | INCARCERATIONS 1047 | INCIDENCE 1048 | INCIDENCES 1049 | INCIDENT 1050 | INCIDENTS INCOMPATIBILITIES 1051 | INCOMPATIBILITY 1052 | INCOMPATIBLE INCOMPETENCE 1053 | INCOMPETENCY 1054 | INCOMPETENT 1055 | INCOMPETENTLY 1056 | INCOMPETENTS 1057 | INCOMPLETE 1058 | INCOMPLETELY INCOMPLETENESS INCONCLUSIVE 1059 | INCONSISTENCIES 1060 | INCONSISTENCY 1061 | INCONSISTENT 1062 | INCONSISTENTLY 1063 | INCONVENIENCE 1064 | INCONVENIENCES INCONVENIENT 1065 | INCORRECT INCORRECTLY 1066 | INCORRECTNESS 1067 | INDECENCY 1068 | INDECENT INDEFEASIBLE 1069 | INDEFEASIBLY 1070 | INDICT 1071 | INDICTABLE INDICTED 1072 | INDICTING 1073 | INDICTMENT 1074 | INDICTMENTS 1075 | INEFFECTIVE 1076 | INEFFECTIVELY 1077 | INEFFECTIVENESS INEFFICIENCIES 1078 | INEFFICIENCY INEFFICIENT 1079 | INEFFICIENTLY 1080 | INELIGIBILITY 1081 | INELIGIBLE 1082 | INEQUITABLE 1083 | INEQUITABLY 1084 | INEQUITIES INEQUITY 1085 | INEVITABLE INEXPERIENCE 1086 | INEXPERIENCED 1087 | INFERIOR 1088 | INFLICTED 1089 | INFRACTION 1090 | INFRACTIONS 1091 | INFRINGE 1092 | INFRINGED 1093 | INFRINGEMENT INFRINGEMENTS 1094 | INFRINGES 1095 | INFRINGING INHIBITED 1096 | INIMICAL 1097 | INJUNCTION 1098 | INJUNCTIONS 1099 | INJURE 1100 | INJURED 1101 | INJURES 1102 | INJURIES 1103 | INJURING 1104 | INJURIOUS 1105 | INJURY 1106 | INORDINATE INORDINATELY 1107 | INQUIRY 1108 | INSECURE INSENSITIVE 1109 | INSOLVENCIES 1110 | INSOLVENCY 1111 | INSOLVENT 1112 | INSTABILITY 1113 | INSUBORDINATION INSUFFICIENCY 1114 | INSUFFICIENT INSUFFICIENTLY 1115 | INSURRECTION 1116 | INSURRECTIONS 1117 | INTENTIONAL 1118 | INTERFERE 1119 | INTERFERED 1120 | INTERFERENCE 1121 | INTERFERENCES 1122 | INTERFERES 1123 | INTERFERING 1124 | INTERMITTENT 1125 | INTERMITTENTLY 1126 | INTERRUPT 1127 | INTERRUPTED 1128 | INTERRUPTING 1129 | INTERRUPTION 1130 | INTERRUPTIONS 1131 | INTERRUPTS INTIMIDATION 1132 | INTRUSION 1133 | INVALID 1134 | INVALIDATE 1135 | INVALIDATED INVALIDATES 1136 | INVALIDATING 1137 | INVALIDATION 1138 | INVALIDITY 1139 | INVESTIGATE INVESTIGATED 1140 | INVESTIGATES 1141 | INVESTIGATING 1142 | INVESTIGATION 1143 | INVESTIGATIONS 1144 | INVOLUNTARILY 1145 | INVOLUNTARY IRRECONCILABLE 1146 | IRRECONCILABLY 1147 | IRRECOVERABLE 1148 | IRRECOVERABLY 1149 | IRREGULAR 1150 | IRREGULARITIES 1151 | IRREGULARITY 1152 | IRREGULARLY 1153 | IRREPARABLE 1154 | IRREPARABLY 1155 | IRREVERSIBLE 1156 | JEOPARDIZE 1157 | JEOPARDIZED 1158 | JUSTIFIABLE 1159 | KICKBACK 1160 | KICKBACKS 1161 | KNOWINGLY 1162 | LACK 1163 | LACKED 1164 | LACKING 1165 | LACKLUSTER 1166 | LACKS 1167 | LAG 1168 | LAGGED 1169 | LAGGING 1170 | LAGS 1171 | LAPSE 1172 | LAPSED 1173 | LAPSES 1174 | LAPSING 1175 | LATE 1176 | LAUNDERING 1177 | LAYOFF 1178 | LAYOFFS 1179 | LIE 1180 | LIMITATION 1181 | LIMITATIONS 1182 | LINGERING 1183 | LIQUIDATE 1184 | LIQUIDATED 1185 | LIQUIDATES 1186 | LIQUIDATING 1187 | LIQUIDATION 1188 | LIQUIDATIONS 1189 | LIQUIDATOR 1190 | LIQUIDATORS LITIGANT 1191 | LITIGANTS 1192 | LITIGATE 1193 | LITIGATED LITIGATES 1194 | LITIGATING 1195 | LITIGATION 1196 | LITIGATIONS 1197 | LOCKOUT 1198 | LOCKOUTS LOSE 1199 | LOSES 1200 | LOSING 1201 | LOSS 1202 | LOSSES 1203 | LOST 1204 | LYING 1205 | MALFEASANCE 1206 | MALFUNCTION 1207 | MALFUNCTIONED 1208 | MALFUNCTIONING 1209 | MALFUNCTIONS 1210 | MALICE 1211 | MALICIOUS MALICIOUSLY 1212 | MALPRACTICE 1213 | MANIPULATE MANIPULATED 1214 | MANIPULATES 1215 | MANIPULATING 1216 | MANIPULATION 1217 | MANIPULATIONS 1218 | MANIPULATIVE 1219 | MARKDOWN 1220 | MARKDOWNS 1221 | MISAPPLICATION 1222 | MISAPPLICATIONS 1223 | MISAPPLIED 1224 | MISAPPLIES 1225 | MISAPPLY 1226 | MISAPPLYING 1227 | MISAPPROPRIATE 1228 | MISAPPROPRIATED 1229 | MISAPPROPRIATES 1230 | MISAPPROPRIATING 1231 | MISAPPROPRIATION MISAPPROPRIATIONS 1232 | MISBRANDED MISCALCULATE MISCALCULATED 1233 | MISCALCULATES 1234 | MISCALCULATING 1235 | MISCALCULATION 1236 | MISCALCULATIONS 1237 | MISCHARACTERIZATION 1238 | MISCHIEF 1239 | MISCLASSIFICATION 1240 | MISCLASSIFICATIONS 1241 | MISCLASSIFIED 1242 | MISCLASSIFY 1243 | MISCOMMUNICATION MISCONDUCT 1244 | MISDATED 1245 | MISDEMEANOR 1246 | MISDEMEANORS 1247 | MISDIRECTED 1248 | MISHANDLE 1249 | MISHANDLED 1250 | MISHANDLES 1251 | MISHANDLING 1252 | MISINFORM 1253 | MISINFORMATION 1254 | MISINFORMED MISINFORMING 1255 | MISINFORMS 1256 | MISINTERPRET 1257 | MISINTERPRETATION 1258 | MISINTERPRETATIONS 1259 | MISINTERPRETED 1260 | MISINTERPRETING 1261 | MISINTERPRETS MISJUDGE 1262 | MISJUDGED 1263 | MISJUDGES 1264 | MISJUDGING 1265 | MISJUDGMENT 1266 | MISJUDGMENTS 1267 | MISLABEL MISLABELED 1268 | MISLABELING 1269 | MISLABELLED 1270 | MISLABELS 1271 | MISLEAD 1272 | MISLEADING 1273 | MISLEADINGLY 1274 | MISLEADS 1275 | MISLED 1276 | MISMANAGE MISMANAGED 1277 | MISMANAGEMENT 1278 | MISMANAGES MISMANAGING 1279 | MISMATCH MISMATCHED 1280 | MISMATCHES 1281 | MISMATCHING 1282 | MISPLACED MISPRICE 1283 | MISPRICING 1284 | MISPRICINGS 1285 | MISREPRESENT 1286 | MISREPRESENTATION MISREPRESENTATIONS 1287 | MISREPRESENTED 1288 | MISREPRESENTING 1289 | MISREPRESENTS 1290 | MISS 1291 | MISSED 1292 | MISSES 1293 | MISSTATE 1294 | MISSTATED 1295 | MISSTATEMENT 1296 | MISSTATEMENTS 1297 | MISSTATES 1298 | MISSTATING 1299 | MISSTEP 1300 | MISSTEPS 1301 | MISTAKE 1302 | MISTAKEN 1303 | MISTAKENLY 1304 | MISTAKES MISTAKING MISTRIAL 1305 | MISTRIALS MISUNDERSTAND 1306 | MISUNDERSTANDING 1307 | MISUNDERSTANDINGS 1308 | MISUNDERSTOOD MISUSE 1309 | MISUSED 1310 | MISUSES 1311 | MISUSING 1312 | MONOPOLISTIC 1313 | MONOPOLISTS 1314 | MONOPOLIZATION 1315 | MONOPOLIZE MONOPOLIZED 1316 | MONOPOLIZES 1317 | MONOPOLIZING 1318 | MONOPOLY 1319 | MORATORIA 1320 | MORATORIUM 1321 | MORATORIUMS 1322 | MOTHBALLED 1323 | MOTHBALLING NEGATIVE 1324 | NEGATIVELY 1325 | NEGATIVES 1326 | NEGLECT 1327 | NEGLECTED 1328 | NEGLECTFUL 1329 | NEGLECTING 1330 | NEGLECTS 1331 | NEGLIGENCE 1332 | NEGLIGENCES NEGLIGENT 1333 | NEGLIGENTLY NONATTAINMENT NONCOMPETITIVE NONCOMPLIANCE 1334 | NONCOMPLIANCES NONCOMPLIANT 1335 | NONCOMPLYING NONCONFORMING 1336 | NONCONFORMITIES 1337 | NONCONFORMITY 1338 | NONDISCLOSURE NONFUNCTIONAL 1339 | NONPAYMENT NONPAYMENTS 1340 | NONPERFORMANCE 1341 | NONPERFORMANCES 1342 | NONPERFORMING 1343 | NONPRODUCING NONPRODUCTIVE NONRECOVERABLE 1344 | NONRENEWAL 1345 | NUISANCE 1346 | NUISANCES 1347 | NULLIFICATION NULLIFICATIONS 1348 | NULLIFIED 1349 | NULLIFIES 1350 | NULLIFY 1351 | NULLIFYING 1352 | OBJECTED 1353 | OBJECTING 1354 | OBJECTION 1355 | OBJECTIONABLE 1356 | OBJECTIONABLY OBJECTIONS OBSCENE 1357 | OBSCENITY 1358 | OBSOLESCENCE 1359 | OBSOLETE 1360 | OBSTACLE 1361 | OBSTACLES 1362 | OBSTRUCT 1363 | OBSTRUCTED 1364 | OBSTRUCTING 1365 | OBSTRUCTION 1366 | OBSTRUCTIONS 1367 | OFFENCE 1368 | OFFENCES 1369 | OFFEND 1370 | OFFENDED 1371 | OFFENDER 1372 | OFFENDERS 1373 | OFFENDING 1374 | OFFENDS 1375 | OMISSION 1376 | OMISSIONS 1377 | OMIT OMITS 1378 | OMITTED 1379 | OMITTING 1380 | ONEROUS 1381 | OPPORTUNISTIC 1382 | OPPORTUNISTICALLY 1383 | OPPOSE 1384 | OPPOSED 1385 | OPPOSES 1386 | OPPOSING 1387 | OPPOSITION 1388 | OPPOSITIONS 1389 | OUTAGE 1390 | OUTAGES 1391 | OUTDATED 1392 | OUTMODED OVERAGE 1393 | OVERAGES 1394 | OVERBUILD 1395 | OVERBUILDING 1396 | OVERBUILDS OVERBUILT 1397 | OVERBURDEN OVERBURDENED 1398 | OVERBURDENING 1399 | OVERCAPACITIES OVERCAPACITY 1400 | OVERCHARGE OVERCHARGED 1401 | OVERCHARGES 1402 | OVERCHARGING 1403 | OVERCOME 1404 | OVERCOMES 1405 | OVERCOMING 1406 | OVERDUE 1407 | OVERESTIMATE 1408 | OVERESTIMATED 1409 | OVERESTIMATES 1410 | OVERESTIMATING 1411 | OVERESTIMATION 1412 | OVERESTIMATIONS 1413 | OVERLOAD 1414 | OVERLOADED 1415 | OVERLOADING 1416 | OVERLOADS 1417 | OVERLOOK 1418 | OVERLOOKED 1419 | OVERLOOKING 1420 | OVERLOOKS 1421 | OVERPAID 1422 | OVERPAYMENT 1423 | OVERPAYMENTS 1424 | OVERPRODUCED OVERPRODUCES 1425 | OVERPRODUCING 1426 | OVERPRODUCTION 1427 | OVERRUN 1428 | OVERRUNNING 1429 | OVERRUNS 1430 | OVERSHADOW 1431 | OVERSHADOWED 1432 | OVERSHADOWING 1433 | OVERSHADOWS 1434 | OVERSTATE 1435 | OVERSTATED OVERSTATEMENT 1436 | OVERSTATEMENTS OVERSTATES 1437 | OVERSTATING 1438 | OVERSUPPLIED OVERSUPPLIES 1439 | OVERSUPPLY 1440 | OVERSUPPLYING 1441 | OVERTLY 1442 | OVERTURN 1443 | OVERTURNED 1444 | OVERTURNING 1445 | OVERTURNS 1446 | OVERVALUE 1447 | OVERVALUED OVERVALUING PANIC 1448 | PANICS 1449 | PENALIZE 1450 | PENALIZED 1451 | PENALIZES 1452 | PENALIZING PENALTIES PENALTY 1453 | PERIL 1454 | PERILS 1455 | PERJURY 1456 | PERPETRATE 1457 | PERPETRATED 1458 | PERPETRATES 1459 | PERPETRATING 1460 | PERPETRATION 1461 | PERSIST 1462 | PERSISTED PERSISTENCE PERSISTENT 1463 | PERSISTENTLY 1464 | PERSISTING 1465 | PERSISTS 1466 | PERVASIVE 1467 | PERVASIVELY 1468 | PERVASIVENESS 1469 | PETTY 1470 | PICKET 1471 | PICKETED 1472 | PICKETING 1473 | PLAINTIFF 1474 | PLAINTIFFS 1475 | PLEA 1476 | PLEAD 1477 | PLEADED 1478 | PLEADING 1479 | PLEADINGS 1480 | PLEADS 1481 | PLEAS 1482 | PLED 1483 | POOR 1484 | POORLY 1485 | POSES 1486 | POSING 1487 | POSTPONE 1488 | POSTPONED 1489 | POSTPONEMENT 1490 | POSTPONEMENTS 1491 | POSTPONES 1492 | POSTPONING 1493 | PRECIPITATED 1494 | PRECIPITOUS 1495 | PRECIPITOUSLY 1496 | PRECLUDE PRECLUDED 1497 | PRECLUDES 1498 | PRECLUDING 1499 | PREDATORY 1500 | PREJUDICE 1501 | PREJUDICED 1502 | PREJUDICES 1503 | PREJUDICIAL 1504 | PREJUDICING 1505 | PREMATURE PREMATURELY 1506 | PRESSING PRETRIAL 1507 | PREVENTING 1508 | PREVENTION 1509 | PREVENTS 1510 | PROBLEM 1511 | PROBLEMATIC 1512 | PROBLEMATICAL PROBLEMS PROLONG 1513 | PROLONGATION PROLONGATIONS 1514 | PROLONGED 1515 | PROLONGING PROLONGS 1516 | PRONE 1517 | PROSECUTE 1518 | PROSECUTED 1519 | PROSECUTES 1520 | PROSECUTING 1521 | PROSECUTION 1522 | PROSECUTIONS 1523 | PROTEST 1524 | PROTESTED PROTESTER 1525 | PROTESTERS 1526 | PROTESTING 1527 | PROTESTOR 1528 | PROTESTORS 1529 | PROTESTS 1530 | PROTRACTED 1531 | PROTRACTION 1532 | PROVOKE 1533 | PROVOKED 1534 | PROVOKES 1535 | PROVOKING 1536 | PUNISHED 1537 | PUNISHES PUNISHING 1538 | PUNISHMENT PUNISHMENTS 1539 | PUNITIVE 1540 | PURPORT 1541 | PURPORTED 1542 | PURPORTEDLY PURPORTING PURPORTS 1543 | QUESTION 1544 | QUESTIONABLE 1545 | QUESTIONABLY 1546 | QUESTIONED QUESTIONING 1547 | QUESTIONS 1548 | QUIT 1549 | QUITTING 1550 | RACKETEER 1551 | RACKETEERING 1552 | RATIONALIZATION 1553 | RATIONALIZATIONS 1554 | RATIONALIZE 1555 | RATIONALIZED 1556 | RATIONALIZES 1557 | RATIONALIZING 1558 | REASSESSMENT 1559 | REASSESSMENTS 1560 | REASSIGN 1561 | REASSIGNED 1562 | REASSIGNING 1563 | REASSIGNMENT 1564 | REASSIGNMENTS 1565 | REASSIGNS 1566 | RECALL 1567 | RECALLED 1568 | RECALLING 1569 | RECALLS 1570 | RECESSION 1571 | RECESSIONARY 1572 | RECESSIONS 1573 | RECKLESS 1574 | RECKLESSLY RECKLESSNESS 1575 | REDACT 1576 | REDACTED 1577 | REDACTING 1578 | REDACTION 1579 | REDACTIONS 1580 | REDEFAULT 1581 | REDEFAULTED 1582 | REDEFAULTS 1583 | REDRESS 1584 | REDRESSED REDRESSES 1585 | REDRESSING 1586 | REFUSAL 1587 | REFUSALS 1588 | REFUSE 1589 | REFUSED 1590 | REFUSES 1591 | REFUSING REJECT 1592 | REJECTED 1593 | REJECTING 1594 | REJECTION 1595 | REJECTIONS REJECTS 1596 | RELINQUISH RELINQUISHED 1597 | RELINQUISHES RELINQUISHING RELINQUISHMENT 1598 | RELINQUISHMENTS 1599 | RELUCTANCE 1600 | RELUCTANT 1601 | RENEGOTIATE 1602 | RENEGOTIATED 1603 | RENEGOTIATES 1604 | RENEGOTIATING 1605 | RENEGOTIATION 1606 | RENEGOTIATIONS 1607 | RENOUNCE 1608 | RENOUNCED 1609 | RENOUNCEMENT 1610 | RENOUNCEMENTS 1611 | RENOUNCES RENOUNCING REPARATION 1612 | REPARATIONS 1613 | REPOSSESSED 1614 | REPOSSESSES 1615 | REPOSSESSING 1616 | REPOSSESSION 1617 | REPOSSESSIONS 1618 | REPUDIATE 1619 | REPUDIATED REPUDIATES 1620 | REPUDIATING 1621 | REPUDIATION REPUDIATIONS 1622 | RESIGN 1623 | RESIGNATION 1624 | RESIGNATIONS 1625 | RESIGNED RESIGNING 1626 | RESIGNS 1627 | RESTATE 1628 | RESTATED RESTATEMENT 1629 | RESTATEMENTS 1630 | RESTATES 1631 | RESTATING 1632 | RESTRUCTURE 1633 | RESTRUCTURED 1634 | RESTRUCTURES 1635 | RESTRUCTURING RESTRUCTURINGS 1636 | RETALIATE 1637 | RETALIATED 1638 | RETALIATES 1639 | RETALIATING 1640 | RETALIATION 1641 | RETALIATIONS RETALIATORY 1642 | RETRIBUTION RETRIBUTIONS 1643 | REVOCATION 1644 | REVOCATIONS 1645 | REVOKE 1646 | REVOKED 1647 | REVOKES 1648 | REVOKING 1649 | RIDICULE 1650 | RIDICULED 1651 | RIDICULES 1652 | RIDICULING 1653 | RISKIER RISKIEST 1654 | RISKY 1655 | SABOTAGE 1656 | SACRIFICE 1657 | SACRIFICED SACRIFICES 1658 | SACRIFICIAL 1659 | SACRIFICING SCANDALOUS SCANDALS 1660 | SCRUTINIZE 1661 | SCRUTINIZED 1662 | SCRUTINIZES 1663 | SCRUTINIZING 1664 | SCRUTINY 1665 | SECRECY 1666 | SEIZE 1667 | SEIZED 1668 | SEIZES 1669 | SEIZING SENTENCED SENTENCING 1670 | SERIOUS 1671 | SERIOUSLY 1672 | SERIOUSNESS SETBACK 1673 | SETBACKS 1674 | SEVER 1675 | SEVERE 1676 | SEVERED 1677 | SEVERELY SEVERITIES 1678 | SEVERITY 1679 | SHARPLY 1680 | SHOCKED 1681 | SHORTAGE 1682 | SHORTAGES 1683 | SHORTFALL 1684 | SHORTFALLS 1685 | SHRINKAGE 1686 | SHRINKAGES 1687 | SHUT 1688 | SHUTDOWN 1689 | SHUTDOWNS 1690 | SHUTS 1691 | SHUTTING 1692 | SLANDER 1693 | SLANDERED 1694 | SLANDEROUS 1695 | SLANDERS SLIPPAGE 1696 | SLIPPAGES 1697 | SLOW 1698 | SLOWDOWN SLOWDOWNS 1699 | SLOWED SLOWER 1700 | SLOWEST SLOWING 1701 | SLOWLY 1702 | SLOWNESS 1703 | SLUGGISH 1704 | SLUGGISHLY 1705 | SLUGGISHNESS SOLVENCIES 1706 | SOLVENCY SPAM 1707 | SPAMMERS 1708 | SPAMMING 1709 | STAGGERING 1710 | STAGNANT 1711 | STAGNATE STAGNATED 1712 | STAGNATES 1713 | STAGNATING 1714 | STAGNATION STANDSTILL 1715 | STANDSTILLS 1716 | STOLEN 1717 | STOPPAGE 1718 | STOPPAGES 1719 | STOPPED 1720 | STOPPING 1721 | STOPS 1722 | STRAIN 1723 | STRAINED STRAINING 1724 | STRAINS 1725 | STRESS 1726 | STRESSED 1727 | STRESSES 1728 | STRESSFUL STRESSING 1729 | STRINGENT SUBJECTED 1730 | SUBJECTING 1731 | SUBJECTION 1732 | SUBPOENA 1733 | SUBPOENAED 1734 | SUBPOENAS SUBSTANDARD 1735 | SUE 1736 | SUED 1737 | SUES 1738 | SUFFER 1739 | SUFFERED 1740 | SUFFERING 1741 | SUFFERS 1742 | SUING 1743 | SUMMONED 1744 | SUMMONING 1745 | SUMMONS 1746 | SUMMONSES SUSCEPTIBILITY 1747 | SUSCEPTIBLE 1748 | SUSPECT SUSPECTED 1749 | SUSPECTS 1750 | SUSPEND 1751 | SUSPENDED 1752 | SUSPENDING 1753 | SUSPENDS 1754 | SUSPENSION SUSPENSIONS 1755 | SUSPICION 1756 | SUSPICIONS 1757 | SUSPICIOUS 1758 | SUSPICIOUSLY 1759 | TAINT 1760 | TAINTED 1761 | TAINTING 1762 | TAINTS 1763 | TAMPERED 1764 | TENSE 1765 | TERMINATE 1766 | TERMINATED 1767 | TERMINATES 1768 | TERMINATING 1769 | TERMINATION 1770 | TERMINATIONS TESTIFY 1771 | TESTIFYING 1772 | THREAT 1773 | THREATEN 1774 | THREATENED 1775 | THREATENING THREATENS 1776 | THREATS 1777 | TIGHTENING 1778 | TOLERATE 1779 | TOLERATED 1780 | TOLERATES 1781 | TOLERATING 1782 | TOLERATION 1783 | TORTUOUS 1784 | TORTUOUSLY 1785 | TRAGEDIES 1786 | TRAGEDY 1787 | TRAGIC 1788 | TRAGICALLY 1789 | TRAUMATIC 1790 | TROUBLE 1791 | TROUBLED TROUBLES 1792 | TURBULENCE 1793 | TURMOIL 1794 | UNABLE 1795 | UNACCEPTABLE 1796 | UNACCEPTABLY 1797 | UNACCOUNTED 1798 | UNANNOUNCED UNANTICIPATED 1799 | UNAPPROVED 1800 | UNATTRACTIVE 1801 | UNAUTHORIZED 1802 | UNAVAILABILITY 1803 | UNAVAILABLE 1804 | UNAVOIDABLE 1805 | UNAVOIDABLY 1806 | UNAWARE 1807 | UNCOLLECTABLE UNCOLLECTED 1808 | UNCOLLECTIBILITY 1809 | UNCOLLECTIBLE 1810 | UNCOLLECTIBLES 1811 | UNCOMPETITIVE UNCOMPLETED 1812 | UNCONSCIONABLE 1813 | UNCONSCIONABLY 1814 | UNCONTROLLABLE 1815 | UNCONTROLLABLY 1816 | UNCONTROLLED UNCORRECTED 1817 | UNCOVER 1818 | UNCOVERED 1819 | UNCOVERING 1820 | UNCOVERS 1821 | UNDELIVERABLE 1822 | UNDELIVERED UNDERCAPITALIZED 1823 | UNDERCUT 1824 | UNDERCUTS 1825 | UNDERCUTTING 1826 | UNDERESTIMATE UNDERESTIMATED 1827 | UNDERESTIMATES 1828 | UNDERESTIMATING 1829 | UNDERESTIMATION 1830 | UNDERFUNDED 1831 | UNDERINSURED 1832 | UNDERMINE UNDERMINED 1833 | UNDERMINES 1834 | UNDERMINING 1835 | UNDERPAID 1836 | UNDERPAYMENT 1837 | UNDERPAYMENTS 1838 | UNDERPAYS UNDERPERFORM 1839 | UNDERPERFORMANCE 1840 | UNDERPERFORMED 1841 | UNDERPERFORMING 1842 | UNDERPERFORMS UNDERPRODUCED 1843 | UNDERPRODUCTION 1844 | UNDERREPORTING 1845 | UNDERSTATE 1846 | UNDERSTATED 1847 | UNDERSTATEMENT 1848 | UNDERSTATEMENTS UNDERSTATES 1849 | UNDERSTATING 1850 | UNDERUTILIZATION 1851 | UNDERUTILIZED 1852 | UNDESIRABLE 1853 | UNDESIRED 1854 | UNDETECTED 1855 | UNDETERMINED UNDISCLOSED 1856 | UNDOCUMENTED 1857 | UNDUE 1858 | UNDULY 1859 | UNECONOMIC 1860 | UNECONOMICAL 1861 | UNECONOMICALLY 1862 | UNEMPLOYED 1863 | UNEMPLOYMENT 1864 | UNETHICAL 1865 | UNETHICALLY 1866 | UNEXCUSED 1867 | UNEXPECTED 1868 | UNEXPECTEDLY 1869 | UNFAIR 1870 | UNFAIRLY 1871 | UNFAVORABILITY 1872 | UNFAVORABLE 1873 | UNFAVORABLY 1874 | UNFAVOURABLE 1875 | UNFEASIBLE 1876 | UNFIT 1877 | UNFITNESS 1878 | UNFORESEEABLE 1879 | UNFORESEEN 1880 | UNFORSEEN 1881 | UNFORTUNATE 1882 | UNFORTUNATELY 1883 | UNFOUNDED 1884 | UNFRIENDLY 1885 | UNFULFILLED 1886 | UNFUNDED 1887 | UNINSURED 1888 | UNINTENDED 1889 | UNINTENTIONAL 1890 | UNINTENTIONALLY 1891 | UNJUST 1892 | UNJUSTIFIABLE 1893 | UNJUSTIFIABLY 1894 | UNJUSTIFIED 1895 | UNJUSTLY 1896 | UNKNOWING UNKNOWINGLY 1897 | UNLAWFUL 1898 | UNLAWFULLY 1899 | UNLICENSED UNLIQUIDATED 1900 | UNMARKETABLE 1901 | UNMERCHANTABLE 1902 | UNMERITORIOUS 1903 | UNNECESSARILY 1904 | UNNECESSARY 1905 | UNNEEDED 1906 | UNOBTAINABLE 1907 | UNOCCUPIED 1908 | UNPAID 1909 | UNPERFORMED 1910 | UNPLANNED 1911 | UNPOPULAR 1912 | UNPREDICTABILITY UNPREDICTABLE 1913 | UNPREDICTABLY 1914 | UNPREDICTED UNPRODUCTIVE 1915 | UNPROFITABILITY 1916 | UNPROFITABLE 1917 | UNQUALIFIED 1918 | UNREALISTIC UNREASONABLE 1919 | UNREASONABLENESS 1920 | UNREASONABLY 1921 | UNRECEPTIVE 1922 | UNRECOVERABLE 1923 | UNRECOVERED 1924 | UNREIMBURSED 1925 | UNRELIABLE 1926 | UNREMEDIED 1927 | UNREPORTED 1928 | UNRESOLVED 1929 | UNREST 1930 | UNSAFE 1931 | UNSALABLE 1932 | UNSALEABLE 1933 | UNSATISFACTORY 1934 | UNSATISFIED 1935 | UNSAVORY 1936 | UNSCHEDULED 1937 | UNSELLABLE 1938 | UNSOLD 1939 | UNSOUND 1940 | UNSTABILIZED 1941 | UNSTABLE 1942 | UNSUBSTANTIATED 1943 | UNSUCCESSFUL 1944 | UNSUCCESSFULLY 1945 | UNSUITABILITY 1946 | UNSUITABLE 1947 | UNSUITABLY 1948 | UNSUITED 1949 | UNSURE 1950 | UNSUSPECTED 1951 | UNSUSPECTING 1952 | UNSUSTAINABLE 1953 | UNTENABLE 1954 | UNTIMELY 1955 | UNTRUSTED 1956 | UNTRUTH 1957 | UNTRUTHFUL 1958 | UNTRUTHFULLY 1959 | UNTRUTHFULNESS 1960 | UNTRUTHS 1961 | UNUSABLE 1962 | UNWANTED 1963 | UNWARRANTED 1964 | UNWELCOME 1965 | UNWILLING 1966 | UNWILLINGNESS 1967 | UPSET 1968 | URGENCY 1969 | URGENT 1970 | USURIOUS 1971 | USURP 1972 | USURPED 1973 | USURPING 1974 | USURPS 1975 | USURY 1976 | VANDALISM 1977 | VERDICT 1978 | VERDICTS 1979 | VETOED 1980 | VICTIMS 1981 | VIOLATE 1982 | VIOLATED 1983 | VIOLATES 1984 | VIOLATING 1985 | VIOLATION 1986 | VIOLATIONS 1987 | VIOLATIVE 1988 | VIOLATOR 1989 | VIOLATORS 1990 | VIOLENCE 1991 | VIOLENT 1992 | VIOLENTLY 1993 | VITIATE 1994 | VITIATED 1995 | VITIATES 1996 | VITIATING 1997 | VITIATION 1998 | VOIDED 1999 | VOIDING 2000 | VOLATILE 2001 | VOLATILITY 2002 | VULNERABILITIES 2003 | VULNERABILITY 2004 | VULNERABLE 2005 | VULNERABLY 2006 | WARN 2007 | WARNED 2008 | WARNING 2009 | WARNINGS 2010 | WARNS 2011 | WASTED 2012 | WASTEFUL 2013 | WASTING 2014 | WEAK 2015 | WEAKEN 2016 | WEAKENED 2017 | WEAKENING 2018 | WEAKENS 2019 | WEAKER 2020 | WEAKEST 2021 | WEAKLY 2022 | WEAKNESS 2023 | WEAKNESSES 2024 | WILLFULLY 2025 | WORRIES 2026 | WORRY 2027 | WORRYING 2028 | WORSE 2029 | WORSEN 2030 | WORSENED 2031 | WORSENING 2032 | WORSENS 2033 | WORST 2034 | WORTHLESS 2035 | WRITEDOWN 2036 | WRITEDOWNS 2037 | WRITEOFF 2038 | WRITEOFFS 2039 | WRONG 2040 | WRONGDOING 2041 | WRONGDOINGS 2042 | WRONGFUL 2043 | WRONGFULLY 2044 | WRONGLY 2045 | ABEYANCE 2046 | ABEYANCES 2047 | ALMOST 2048 | ALTERATION 2049 | ALTERATIONS 2050 | AMBIGUITIES 2051 | AMBIGUITY AMBIGUOUS 2052 | ANOMALIES 2053 | ANOMALOUS 2054 | ANOMALOUSLY 2055 | ANOMALY 2056 | ANTICIPATE 2057 | ANTICIPATED 2058 | ANTICIPATES 2059 | ANTICIPATING 2060 | ANTICIPATION 2061 | ANTICIPATIONS 2062 | APPARENT 2063 | APPARENTLY APPEAR 2064 | APPEARED 2065 | APPEARING 2066 | APPEARS 2067 | APPROXIMATE 2068 | APPROXIMATED 2069 | APPROXIMATELY 2070 | APPROXIMATES 2071 | APPROXIMATING 2072 | APPROXIMATION 2073 | APPROXIMATIONS ARBITRARILY 2074 | ARBITRARINESS 2075 | ARBITRARY 2076 | ASSUME 2077 | ASSUMED ASSUMES 2078 | ASSUMING 2079 | ASSUMPTION 2080 | ASSUMPTIONS 2081 | BELIEVE 2082 | BELIEVED 2083 | BELIEVES 2084 | BELIEVING 2085 | CAUTIOUS 2086 | CAUTIOUSLY 2087 | CAUTIOUSNESS 2088 | CLARIFICATION 2089 | CLARIFICATIONS 2090 | CONCEIVABLE CONCEIVABLY 2091 | CONDITIONAL 2092 | CONDITIONALLY 2093 | CONFUSES CONFUSING CONFUSINGLY 2094 | CONFUSION 2095 | CONTINGENCIES 2096 | CONTINGENCY 2097 | CONTINGENT 2098 | CONTINGENTLY 2099 | CONTINGENTS 2100 | COULD 2101 | CROSSROAD 2102 | CROSSROADS 2103 | DEPEND 2104 | DEPENDED 2105 | DEPENDENCE DEPENDENCIES 2106 | DEPENDENCY 2107 | DEPENDENT 2108 | DEPENDING 2109 | DEPENDS 2110 | DESTABILIZING 2111 | DEVIATE 2112 | DEVIATED 2113 | DEVIATES 2114 | DEVIATING DEVIATION 2115 | DEVIATIONS 2116 | DIFFER 2117 | DIFFERED 2118 | DIFFERING 2119 | DIFFERS 2120 | DOUBT 2121 | DOUBTED 2122 | DOUBTFUL 2123 | DOUBTS 2124 | EXPOSURE 2125 | EXPOSURES FLUCTUATE 2126 | FLUCTUATED 2127 | FLUCTUATES 2128 | FLUCTUATING 2129 | FLUCTUATION 2130 | FLUCTUATIONS 2131 | HIDDEN 2132 | HINGES 2133 | IMPRECISE 2134 | IMPRECISION 2135 | IMPRECISIONS 2136 | IMPROBABILITY 2137 | IMPROBABLE INCOMPLETENESS 2138 | INDEFINITE 2139 | INDEFINITELY 2140 | INDEFINITENESS 2141 | INDETERMINABLE INDETERMINATE 2142 | INEXACT 2143 | INEXACTNESS INSTABILITIES INSTABILITY 2144 | INTANGIBLE 2145 | INTANGIBLES 2146 | LIKELIHOOD 2147 | MAY 2148 | MAYBE 2149 | MIGHT 2150 | NEARLY 2151 | NONASSESSABLE 2152 | OCCASIONALLY ORDINARILY 2153 | PENDING PERHAPS 2154 | POSSIBILITIES 2155 | POSSIBILITY 2156 | POSSIBLE 2157 | POSSIBLY 2158 | PRECAUTION PRECAUTIONARY 2159 | PRECAUTIONS 2160 | PREDICT 2161 | PREDICTABILITY 2162 | PREDICTED 2163 | PREDICTING PREDICTION 2164 | PREDICTIONS 2165 | PREDICTIVE PREDICTOR 2166 | PREDICTORS 2167 | PREDICTS PRELIMINARILY 2168 | PRELIMINARY 2169 | PRESUMABLY 2170 | PRESUME 2171 | PRESUMED 2172 | PRESUMES 2173 | PRESUMING 2174 | PRESUMPTION 2175 | PRESUMPTIONS PROBABILISTIC 2176 | PROBABILITIES 2177 | PROBABILITY 2178 | PROBABLE 2179 | PROBABLY 2180 | RANDOM 2181 | RANDOMIZE 2182 | RANDOMIZED 2183 | RANDOMIZES 2184 | RANDOMIZING 2185 | RANDOMLY 2186 | RANDOMNESS 2187 | REASSESS 2188 | REASSESSED 2189 | REASSESSES 2190 | REASSESSING 2191 | REASSESSMENT 2192 | REASSESSMENTS RECALCULATE 2193 | RECALCULATED 2194 | RECALCULATES 2195 | RECALCULATING 2196 | RECALCULATION 2197 | RECALCULATIONS RECONSIDER 2198 | RECONSIDERED 2199 | RECONSIDERING 2200 | RECONSIDERS 2201 | REEXAMINATION 2202 | REEXAMINE 2203 | REEXAMINING REINTERPRET 2204 | REINTERPRETATION 2205 | REINTERPRETATIONS 2206 | REINTERPRETED REINTERPRETING 2207 | REINTERPRETS 2208 | REVISE 2209 | REVISED 2210 | RISK 2211 | RISKED 2212 | RISKIER 2213 | RISKIEST 2214 | RISKINESS 2215 | RISKING 2216 | RISKS 2217 | RISKY 2218 | ROUGHLY 2219 | RUMORS 2220 | SEEMS 2221 | SELDOM 2222 | SELDOMLY 2223 | SOMETIME 2224 | SOMETIMES SOMEWHAT 2225 | SOMEWHERE 2226 | SPECULATE 2227 | SPECULATED 2228 | SPECULATES 2229 | SPECULATING 2230 | SPECULATION 2231 | SPECULATIONS 2232 | SPECULATIVE 2233 | SPECULATIVELY 2234 | SPORADIC 2235 | SPORADICALLY 2236 | SUDDEN 2237 | SUDDENLY 2238 | SUGGEST 2239 | SUGGESTED 2240 | SUGGESTING SUGGESTS 2241 | SUSCEPTIBILITY 2242 | TENDING 2243 | TENTATIVE 2244 | TENTATIVELY 2245 | TURBULENCE UNCERTAIN 2246 | UNCERTAINLY 2247 | UNCERTAINTIES 2248 | UNCERTAINTY 2249 | UNCLEAR 2250 | UNCONFIRMED 2251 | UNDECIDED 2252 | UNDEFINED 2253 | UNDESIGNATED 2254 | UNDETECTABLE 2255 | UNDETERMINABLE 2256 | UNDETERMINED 2257 | UNDOCUMENTED 2258 | UNEXPECTED 2259 | UNEXPECTEDLY UNFAMILIAR UNFAMILIARITY 2260 | UNFORECASTED 2261 | UNFORSEEN 2262 | UNGUARANTEED 2263 | UNHEDGED 2264 | UNIDENTIFIABLE 2265 | UNIDENTIFIED 2266 | UNKNOWN 2267 | UNKNOWNS 2268 | UNOBSERVABLE 2269 | UNPLANNED 2270 | UNPREDICTABILITY 2271 | UNPREDICTABLE 2272 | UNPREDICTABLY 2273 | UNPREDICTED 2274 | UNPROVED 2275 | UNPROVEN 2276 | UNQUANTIFIABLE 2277 | UNQUANTIFIED 2278 | UNRECONCILED 2279 | UNSEASONABLE 2280 | UNSEASONABLY UNSETTLED 2281 | UNSPECIFIC 2282 | UNSPECIFIED 2283 | UNTESTED 2284 | UNUSUAL UNUSUALLY 2285 | UNWRITTEN 2286 | VAGARIES 2287 | VAGUE 2288 | VAGUELY 2289 | VAGUENESS VAGUENESSES 2290 | VAGUER 2291 | VAGUEST 2292 | VARIABILITY 2293 | VARIABLE 2294 | VARIABLES 2295 | VARIABLY 2296 | VARIANCE 2297 | VARIANCES 2298 | VARIANT 2299 | VARIANTS 2300 | VARIATION 2301 | VARIATIONS 2302 | VARIED 2303 | VARIES 2304 | VARY 2305 | VARYING 2306 | VOLATILE 2307 | VOLATILITIES 2308 | VOLATILITY -------------------------------------------------------------------------------- /lexicon_data/lm_positive.csv: -------------------------------------------------------------------------------- 1 | ABLE 2 | ABUNDANCE 3 | ABUNDANT 4 | ACCLAIMED 5 | ACCOMPLISH 6 | ACCOMPLISHED 7 | ACCOMPLISHES 8 | ACCOMPLISHING 9 | ACCOMPLISHMENT 10 | ACCOMPLISHMENTS 11 | ACHIEVE 12 | ACHIEVED 13 | ACHIEVEMENT 14 | ACHIEVEMENTS 15 | ACHIEVES 16 | ACHIEVING 17 | ADEQUATELY 18 | ADVANCEMENT 19 | ADVANCEMENTS 20 | ADVANCES 21 | ADVANCING 22 | ADVANTAGE 23 | ADVANTAGED 24 | ADVANTAGEOUS 25 | ADVANTAGEOUSLY 26 | ADVANTAGES 27 | ALLIANCE 28 | ALLIANCES 29 | ASSURE 30 | ASSURED 31 | ASSURES 32 | ASSURING 33 | ATTAIN 34 | ATTAINED 35 | ATTAINING 36 | ATTAINMENT 37 | ATTAINMENTS 38 | ATTAINS 39 | ATTRACTIVE 40 | ATTRACTIVENESS 41 | BEAUTIFUL 42 | BEAUTIFULLY 43 | BENEFICIAL 44 | BENEFICIALLY 45 | BENEFIT 46 | BENEFITED 47 | BENEFITING 48 | BENEFITTED 49 | BENEFITTING 50 | BEST 51 | BETTER 52 | BOLSTERED 53 | BOLSTERING 54 | BOLSTERS 55 | BOOM 56 | BOOMING 57 | BOOST 58 | BOOSTED 59 | BREAKTHROUGH 60 | BREAKTHROUGHS 61 | BRILLIANT 62 | CHARITABLE 63 | COLLABORATE 64 | COLLABORATED 65 | COLLABORATES 66 | COLLABORATING 67 | COLLABORATION 68 | COLLABORATIONS 69 | COLLABORATIVE 70 | COLLABORATOR 71 | COLLABORATORS 72 | COMPLIMENT 73 | COMPLIMENTARY 74 | COMPLIMENTED 75 | COMPLIMENTING 76 | COMPLIMENTS 77 | CONCLUSIVE 78 | CONCLUSIVELY 79 | CONDUCIVE 80 | CONFIDENT 81 | CONSTRUCTIVE 82 | CONSTRUCTIVELY 83 | COURTEOUS 84 | CREATIVE 85 | CREATIVELY 86 | CREATIVENESS 87 | CREATIVITY 88 | DELIGHT 89 | DELIGHTED 90 | DELIGHTFUL 91 | DELIGHTFULLY 92 | DELIGHTING 93 | DELIGHTS 94 | DEPENDABILITY 95 | DEPENDABLE 96 | DESIRABLE 97 | DESIRED 98 | DESPITE 99 | DESTINED 100 | DILIGENT 101 | DILIGENTLY 102 | DISTINCTION 103 | DISTINCTIONS 104 | DISTINCTIVE 105 | DISTINCTIVELY 106 | DISTINCTIVENESS 107 | DREAM 108 | EASIER 109 | EASILY 110 | EASY 111 | EFFECTIVE 112 | EFFICIENCIES 113 | EFFICIENCY 114 | EFFICIENT 115 | EFFICIENTLY 116 | EMPOWER 117 | EMPOWERED 118 | EMPOWERING 119 | EMPOWERS 120 | ENABLE 121 | ENABLED 122 | ENABLES 123 | ENABLING 124 | ENCOURAGED 125 | ENCOURAGEMENT 126 | ENCOURAGES 127 | ENCOURAGING 128 | ENHANCE 129 | ENHANCED 130 | ENHANCEMENT 131 | ENHANCEMENTS 132 | ENHANCES 133 | ENHANCING 134 | ENJOY 135 | ENJOYABLE 136 | ENJOYABLY 137 | ENJOYED 138 | ENJOYING 139 | ENJOYMENT 140 | ENJOYS 141 | ENTHUSIASM 142 | ENTHUSIASTIC 143 | ENTHUSIASTICALLY 144 | EXCELLENCE 145 | EXCELLENT 146 | EXCELLING 147 | EXCELS 148 | EXCEPTIONAL 149 | EXCEPTIONALLY 150 | EXCITED 151 | EXCITEMENT 152 | EXCITING 153 | EXCLUSIVE 154 | EXCLUSIVELY 155 | EXCLUSIVENESS 156 | EXCLUSIVES 157 | EXCLUSIVITY 158 | EXEMPLARY 159 | FANTASTIC 160 | FAVORABLE 161 | FAVORABLY 162 | FAVORED 163 | FAVORING 164 | FAVORITE 165 | FAVORITES 166 | FRIENDLY 167 | GAIN 168 | GAINED 169 | GAINING 170 | GAINS 171 | GOOD 172 | GREAT 173 | GREATER 174 | GREATEST 175 | GREATLY 176 | GREATNESS 177 | HAPPIEST 178 | HAPPILY 179 | HAPPINESS 180 | HAPPY 181 | HIGHEST 182 | HONOR 183 | HONORABLE 184 | HONORED 185 | HONORING 186 | HONORS 187 | IDEAL 188 | IMPRESS 189 | IMPRESSED 190 | IMPRESSES 191 | IMPRESSING 192 | IMPRESSIVE 193 | IMPRESSIVELY 194 | IMPROVE 195 | IMPROVED 196 | IMPROVEMENT 197 | IMPROVEMENTS 198 | IMPROVES 199 | IMPROVING 200 | INCREDIBLE 201 | INCREDIBLY 202 | INFLUENTIAL 203 | INFORMATIVE 204 | INGENUITY 205 | INNOVATE 206 | INNOVATED 207 | INNOVATES 208 | INNOVATING 209 | INNOVATION 210 | INNOVATIONS 211 | INNOVATIVE 212 | INNOVATIVENESS 213 | INNOVATOR 214 | INNOVATORS 215 | INSIGHTFUL 216 | INSPIRATION 217 | INSPIRATIONAL 218 | INTEGRITY 219 | INVENT 220 | INVENTED 221 | INVENTING 222 | INVENTION 223 | INVENTIONS 224 | INVENTIVE 225 | INVENTIVENESS 226 | INVENTOR 227 | INVENTORS 228 | LEADERSHIP 229 | LEADING 230 | LOYAL 231 | LUCRATIVE 232 | MERITORIOUS 233 | OPPORTUNITIES 234 | OPPORTUNITY 235 | OPTIMISTIC 236 | OUTPERFORM 237 | OUTPERFORMED 238 | OUTPERFORMING 239 | OUTPERFORMS 240 | PERFECT 241 | PERFECTED 242 | PERFECTLY 243 | PERFECTS 244 | PLEASANT 245 | PLEASANTLY 246 | PLEASED 247 | PLEASURE 248 | PLENTIFUL 249 | POPULAR 250 | POPULARITY 251 | POSITIVE 252 | POSITIVELY 253 | PREEMINENCE 254 | PREEMINENT 255 | PREMIER 256 | PREMIERE 257 | PRESTIGE 258 | PRESTIGIOUS 259 | PROACTIVE 260 | PROACTIVELY 261 | PROFICIENCY 262 | PROFICIENT 263 | PROFICIENTLY 264 | PROFITABILITY 265 | PROFITABLE 266 | PROFITABLY 267 | PROGRESS 268 | PROGRESSED 269 | PROGRESSES 270 | PROGRESSING 271 | PROSPERED 272 | PROSPERING 273 | PROSPERITY 274 | PROSPEROUS 275 | PROSPERS 276 | REBOUND 277 | REBOUNDED 278 | REBOUNDING 279 | RECEPTIVE 280 | REGAIN 281 | REGAINED 282 | REGAINING 283 | RESOLVE 284 | REVOLUTIONIZE 285 | REVOLUTIONIZED 286 | REVOLUTIONIZES 287 | REVOLUTIONIZING 288 | REWARD 289 | REWARDED 290 | REWARDING 291 | REWARDS 292 | SATISFACTION 293 | SATISFACTORILY 294 | SATISFACTORY 295 | SATISFIED 296 | SATISFIES 297 | SATISFY 298 | SATISFYING 299 | SMOOTH 300 | SMOOTHING 301 | SMOOTHLY 302 | SMOOTHS 303 | SOLVES 304 | SOLVING 305 | SPECTACULAR 306 | SPECTACULARLY 307 | STABILITY 308 | STABILIZATION 309 | STABILIZATIONS 310 | STABILIZE 311 | STABILIZED 312 | STABILIZES 313 | STABILIZING 314 | STABLE 315 | STRENGTH 316 | STRENGTHEN 317 | STRENGTHENED 318 | STRENGTHENING 319 | STRENGTHENS 320 | STRENGTHS 321 | STRONG 322 | STRONGER 323 | STRONGEST 324 | SUCCEED 325 | SUCCEEDED 326 | SUCCEEDING 327 | SUCCEEDS 328 | SUCCESS 329 | SUCCESSES 330 | SUCCESSFUL 331 | SUCCESSFULLY 332 | SUPERIOR 333 | SURPASS 334 | SURPASSED 335 | SURPASSES 336 | SURPASSING 337 | TRANSPARENCY 338 | TREMENDOUS 339 | TREMENDOUSLY 340 | UNMATCHED 341 | UNPARALLELED 342 | UNSURPASSED 343 | UPTURN 344 | UPTURNS 345 | VALUABLE 346 | VERSATILE 347 | VERSATILITY 348 | VIBRANCY 349 | VIBRANT 350 | WIN 351 | WINNER 352 | WINNERS 353 | WINNING 354 | WORTHY -------------------------------------------------------------------------------- /results/Figure_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonyip184/StockSentimentTrading/ad055a34047a4597e0fad65c0052c60b0fb81bab/results/Figure_0.png -------------------------------------------------------------------------------- /results/results.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonyip184/StockSentimentTrading/ad055a34047a4597e0fad65c0052c60b0fb81bab/results/results.gif -------------------------------------------------------------------------------- /results/text generation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonyip184/StockSentimentTrading/ad055a34047a4597e0fad65c0052c60b0fb81bab/results/text generation.gif -------------------------------------------------------------------------------- /test/BABA.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Adj Close,Volume 2 | 2017-10-09,178.970001,183.132004,178.750000,182.089996,182.089996,15011600 3 | 2017-10-10,181.649994,184.460007,181.360001,183.119995,183.119995,13201300 4 | 2017-10-11,183.000000,184.699997,182.600998,184.690002,184.690002,11974400 5 | 2017-10-12,184.039993,184.389999,180.348007,180.529999,180.529999,15441200 6 | 2017-10-13,180.960007,181.399994,177.970001,178.449997,178.449997,18107700 7 | 2017-10-16,180.000000,180.050003,178.509995,179.559998,179.559998,12855900 8 | 2017-10-17,179.580002,180.119995,175.300003,175.320007,175.320007,20132200 9 | 2017-10-18,177.089996,180.000000,176.279999,179.610001,179.610001,21736500 10 | 2017-10-19,177.001007,179.610001,175.449997,177.929993,177.929993,13539000 11 | 2017-10-20,179.020004,179.520004,177.080002,177.320007,177.320007,11953200 12 | 2017-10-23,177.800003,178.009995,173.050003,173.130005,173.130005,17610900 13 | 2017-10-24,174.000000,175.979996,173.259995,173.699997,173.699997,11946000 14 | 2017-10-25,174.690002,175.440002,169.300003,170.220001,170.220001,18109400 15 | 2017-10-26,170.619995,171.449997,168.580002,170.320007,170.320007,13527400 16 | 2017-10-27,173.190002,177.000000,171.110001,176.149994,176.149994,19712600 17 | 2017-10-30,178.429993,181.899994,177.589996,181.580002,181.580002,20219700 18 | 2017-10-31,183.570007,185.119995,181.811005,184.889999,184.889999,21256700 19 | 2017-11-01,187.880005,188.880005,183.580002,186.080002,186.080002,28594700 20 | 2017-11-02,190.990005,191.220001,183.309998,184.809998,184.809998,41239900 21 | 2017-11-03,186.509995,186.929993,182.059998,183.210007,183.210007,19697300 22 | 2017-11-06,184.070007,188.250000,184.000000,187.839996,187.839996,19873100 23 | 2017-11-07,189.580002,189.860001,187.000000,188.509995,188.509995,17781000 24 | 2017-11-08,187.979996,188.149994,185.100006,185.899994,185.899994,13944600 25 | 2017-11-09,184.210007,185.130005,181.050003,185.130005,185.130005,19755600 26 | 2017-11-10,187.029999,187.169998,185.399994,186.410004,186.410004,15031000 27 | 2017-11-13,186.770004,187.880005,184.000000,184.539993,184.539993,17139100 28 | 2017-11-14,184.300003,184.380005,181.149994,181.789993,181.789993,14475300 29 | 2017-11-15,179.369995,181.880005,176.735992,181.479996,181.479996,16567000 30 | 2017-11-16,183.309998,186.270004,183.119995,185.429993,185.429993,18389500 31 | 2017-11-17,185.919998,186.500000,184.669998,185.130005,185.130005,13422700 32 | 2017-11-20,187.600006,190.000000,186.610992,188.000000,188.000000,25992300 33 | 2017-11-21,190.350006,191.559998,188.800003,190.899994,190.899994,19639500 34 | 2017-11-22,191.539993,191.750000,189.369995,189.839996,189.839996,14417600 35 | 2017-11-24,189.389999,191.699997,188.699997,191.190002,191.190002,9887300 36 | 2017-11-27,190.490005,191.449997,187.550003,188.029999,188.029999,14952800 37 | 2017-11-28,188.830002,189.100006,186.500000,186.690002,186.690002,13378100 38 | 2017-11-29,185.250000,185.410004,173.619995,179.910004,179.910004,40204100 39 | 2017-11-30,179.529999,179.800003,176.320007,177.080002,177.080002,25851100 40 | 2017-12-01,175.270004,179.800003,173.800003,174.610001,174.610001,26782300 41 | 2017-12-04,177.199997,177.580002,168.259995,169.580002,169.580002,35895100 42 | 2017-12-05,165.279999,172.960007,164.250000,168.960007,168.960007,31609900 43 | 2017-12-06,172.630005,173.229996,167.865005,172.630005,172.630005,23897800 44 | 2017-12-07,175.289993,175.820007,172.259995,174.470001,174.470001,15697900 45 | 2017-12-08,177.570007,178.960007,176.369995,177.619995,177.619995,23543400 46 | 2017-12-11,179.899994,180.679993,178.149994,179.289993,179.289993,15626200 47 | 2017-12-12,174.639999,178.160004,173.770004,174.639999,174.639999,22656500 48 | 2017-12-13,175.190002,177.699997,174.300003,176.470001,176.470001,18653400 49 | 2017-12-14,173.110001,173.389999,169.610001,171.750000,171.750000,32830000 50 | 2017-12-15,172.889999,173.550003,170.000000,173.550003,173.550003,41356700 51 | 2017-12-18,174.600006,174.699997,172.369995,173.369995,173.369995,17023300 52 | 2017-12-19,171.970001,173.000000,170.509995,171.279999,171.279999,23936200 53 | 2017-12-20,171.789993,172.899994,170.800003,172.639999,172.639999,17121400 54 | 2017-12-21,172.800003,176.250000,172.651001,175.320007,175.320007,14812400 55 | 2017-12-22,175.839996,176.660004,175.039993,176.289993,176.289993,12524700 56 | 2017-12-26,174.550003,175.149994,171.729996,172.330002,172.330002,12913800 57 | 2017-12-27,172.289993,173.869995,171.729996,172.970001,172.970001,10152300 58 | 2017-12-28,173.039993,173.529999,171.669998,172.300003,172.300003,9508100 59 | 2017-12-29,172.279999,173.669998,171.199997,172.429993,172.429993,9704600 60 | 2018-01-02,176.399002,184.100006,175.699997,183.649994,183.649994,29916900 61 | 2018-01-03,185.190002,185.634995,181.399994,184.000000,184.000000,20121900 62 | 2018-01-04,185.899994,187.746994,184.429993,185.710007,185.710007,19473800 63 | 2018-01-05,187.169998,190.750000,186.300995,190.699997,190.699997,18168300 64 | 2018-01-08,190.460007,191.660004,189.070007,190.330002,190.330002,16230100 65 | 2018-01-09,191.130005,192.490005,188.000000,190.800003,190.800003,19495100 66 | 2018-01-10,188.100006,190.389999,186.580002,189.789993,189.789993,17943800 67 | 2018-01-11,189.729996,190.429993,188.100006,188.750000,188.750000,12400400 68 | 2018-01-12,189.910004,190.199997,187.250000,187.789993,187.789993,11789600 69 | 2018-01-16,190.399994,191.740005,181.750000,182.399994,182.399994,27428500 70 | 2018-01-17,183.300003,184.800003,179.320007,183.830002,183.830002,21311600 71 | 2018-01-18,184.279999,185.845001,182.690002,184.399994,184.399994,14190700 72 | 2018-01-19,185.149994,185.238998,182.800003,184.050003,184.050003,15349300 73 | 2018-01-22,184.975006,185.039993,181.679993,184.020004,184.020004,16016300 74 | 2018-01-23,185.279999,192.399994,183.539993,192.279999,192.279999,31305900 75 | 2018-01-24,194.710007,198.860001,192.399994,195.529999,195.529999,34497300 76 | 2018-01-25,196.339996,199.589996,194.100006,198.330002,198.330002,23421600 77 | 2018-01-26,200.330002,205.229996,199.210007,205.220001,205.220001,23768600 78 | 2018-01-29,204.830002,205.690002,201.820007,203.009995,203.009995,21908600 79 | 2018-01-30,198.679993,202.539993,196.490005,199.660004,199.660004,23377500 80 | 2018-01-31,202.820007,206.199997,202.800003,204.289993,204.289993,26982500 81 | 2018-02-01,192.750000,199.490005,191.139999,192.220001,192.220001,52628900 82 | 2018-02-02,194.789993,195.679993,186.800003,187.309998,187.309998,32233900 83 | 2018-02-05,183.699997,190.470001,179.899994,180.529999,180.529999,31084000 84 | 2018-02-06,174.720001,185.589996,174.169998,185.169998,185.169998,35804500 85 | 2018-02-07,183.500000,186.830002,180.300003,180.300003,180.300003,19672100 86 | 2018-02-08,182.270004,183.100006,171.389999,173.699997,173.699997,32051300 87 | 2018-02-09,175.119995,177.615997,168.880005,176.669998,176.669998,28049500 88 | 2018-02-12,180.440002,180.789993,175.085999,177.440002,177.440002,18280300 89 | 2018-02-13,177.419998,182.149994,177.000000,179.250000,179.250000,15507000 90 | 2018-02-14,179.220001,186.929993,178.899994,186.759995,186.759995,21047400 91 | 2018-02-15,189.250000,189.559998,184.431000,187.449997,187.449997,14361100 92 | 2018-02-16,186.750000,188.270004,183.539993,183.679993,183.679993,16114100 93 | 2018-02-20,183.669998,188.830002,183.000000,187.190002,187.190002,14854900 94 | 2018-02-21,189.369995,193.169998,188.460007,188.820007,188.820007,22071600 95 | 2018-02-22,190.199997,190.740005,187.770004,188.750000,188.750000,12282800 96 | 2018-02-23,190.179993,193.404999,189.949997,193.289993,193.289993,16937300 97 | 2018-02-26,194.460007,195.149994,190.649994,194.190002,194.190002,19463100 98 | 2018-02-27,192.589996,193.567001,187.210007,188.259995,188.259995,23218500 99 | 2018-02-28,187.250000,188.240005,185.000000,186.139999,186.139999,19367600 100 | 2018-03-01,186.179993,187.479996,180.050003,181.990005,181.990005,17286300 101 | 2018-03-02,178.009995,180.229996,175.449997,179.759995,179.759995,18909100 102 | 2018-03-05,179.410004,181.949997,177.070007,181.600006,181.600006,15656700 103 | 2018-03-06,185.190002,188.009995,184.820007,187.369995,187.369995,17856100 104 | 2018-03-07,184.369995,189.070007,184.320007,189.050003,189.050003,13728900 105 | 2018-03-08,189.050003,190.229996,186.570007,187.179993,187.179993,14331400 106 | 2018-03-09,189.639999,190.699997,188.009995,190.550003,190.550003,14208400 107 | 2018-03-12,192.300003,194.399994,190.899994,192.740005,192.740005,17826200 108 | 2018-03-13,193.880005,194.250000,187.389999,188.410004,188.410004,14826700 109 | 2018-03-14,190.289993,193.630005,190.220001,192.559998,192.559998,20032300 110 | 2018-03-15,198.440002,201.500000,196.520004,199.059998,199.059998,33504600 111 | 2018-03-16,198.399994,200.380005,197.259995,200.279999,200.279999,26948700 112 | 2018-03-19,198.000000,198.429993,192.800995,194.529999,194.529999,19681400 113 | 2018-03-20,194.949997,199.210007,194.539993,198.949997,198.949997,11952000 114 | 2018-03-21,198.800003,198.880005,194.570007,195.300003,195.300003,12047300 115 | 2018-03-22,190.750000,192.389999,184.600006,184.649994,184.649994,25355700 116 | 2018-03-23,186.850006,187.139999,180.401001,181.199997,181.199997,18714400 117 | 2018-03-26,187.889999,190.619995,184.320007,190.500000,190.500000,16758700 118 | 2018-03-27,192.240005,192.250000,180.660004,181.889999,181.889999,16627900 119 | 2018-03-28,180.729996,183.440002,177.570007,178.910004,178.910004,20081100 120 | 2018-03-29,180.880005,185.130005,178.619995,183.539993,183.539993,16378900 121 | 2018-04-02,182.809998,183.509995,175.750000,177.610001,177.610001,16028700 122 | 2018-04-03,179.259995,179.580002,173.000000,174.669998,174.669998,19975100 123 | 2018-04-04,166.880005,172.410004,166.130005,172.070007,172.070007,24573600 124 | 2018-04-05,175.479996,176.559998,171.169998,172.570007,172.570007,18250900 125 | 2018-04-06,169.839996,172.270004,166.399994,167.520004,167.520004,18210000 126 | 2018-04-09,169.750000,172.720001,168.610001,169.869995,169.869995,14717300 127 | 2018-04-10,175.100006,177.880005,173.850006,177.100006,177.100006,20436200 128 | 2018-04-11,176.479996,178.160004,174.740005,175.360001,175.360001,10170500 129 | 2018-04-12,175.929993,177.899994,174.559998,175.919998,175.919998,11133900 130 | 2018-04-13,176.720001,176.800003,171.070007,172.039993,172.039993,13526200 131 | 2018-04-16,172.009995,174.789993,171.009995,174.699997,174.699997,9876200 132 | 2018-04-17,174.830002,179.339996,174.830002,178.699997,178.699997,16285800 133 | 2018-04-18,178.899994,182.880005,177.639999,182.679993,182.679993,16972700 134 | 2018-04-19,183.259995,183.630005,179.520004,181.389999,181.389999,11989000 135 | 2018-04-20,179.360001,181.389999,177.529999,179.110001,179.110001,14473100 136 | 2018-04-23,178.630005,179.320007,174.710007,175.570007,175.570007,12033900 137 | 2018-04-24,177.630005,178.000000,170.679993,173.089996,173.089996,14567500 138 | 2018-04-25,170.520004,171.300003,166.639999,170.220001,170.220001,17048000 139 | 2018-04-26,173.250000,174.360001,172.050003,173.899994,173.899994,13398000 140 | 2018-04-27,177.110001,178.199997,174.009995,177.160004,177.160004,15062500 141 | 2018-04-30,178.089996,180.039993,177.050003,178.539993,178.539993,14654000 142 | 2018-05-01,177.580002,180.320007,177.440002,179.500000,179.500000,10787700 143 | 2018-05-02,180.800003,184.264008,180.110001,181.449997,181.449997,20681800 144 | 2018-05-03,183.500000,183.589996,175.770004,182.449997,182.449997,26257600 145 | 2018-05-04,180.399994,190.600006,178.619995,188.889999,188.889999,57788300 146 | 2018-05-07,190.410004,196.600006,190.300003,195.350006,195.350006,29862200 147 | 2018-05-08,194.199997,197.339996,193.009995,196.309998,196.309998,21856300 148 | 2018-05-09,195.839996,197.380005,194.500000,195.429993,195.429993,13780600 149 | 2018-05-10,196.300003,199.770004,195.160004,195.960007,195.960007,21295000 150 | 2018-05-11,196.399994,196.460007,193.380005,194.360001,194.360001,12741100 151 | 2018-05-14,195.899994,200.000000,195.869995,198.639999,198.639999,17627100 152 | 2018-05-15,195.229996,196.779999,193.860001,196.610001,196.610001,12694900 153 | 2018-05-16,196.750000,199.750000,196.300003,198.110001,198.110001,12887500 154 | 2018-05-17,196.000000,198.429993,195.570007,196.020004,196.020004,13470500 155 | 2018-05-18,196.429993,197.779999,194.720001,195.000000,195.000000,14242300 156 | 2018-05-21,197.800003,199.789993,196.399994,197.639999,197.639999,13830500 157 | 2018-05-22,198.300003,198.626999,195.699997,195.869995,195.869995,9700100 158 | 2018-05-23,193.880005,196.899994,192.800995,196.800003,196.800003,12520300 159 | 2018-05-24,198.119995,199.720001,195.697006,197.369995,197.369995,18348900 160 | 2018-05-25,197.570007,201.500000,197.210007,199.199997,199.199997,21270000 161 | 2018-05-29,197.940002,202.279999,197.000000,198.000000,198.000000,18458800 162 | 2018-05-30,199.699997,200.539993,197.500000,197.979996,197.979996,13930600 163 | 2018-05-31,198.000000,199.479996,196.850006,198.009995,198.009995,17982500 164 | 2018-06-01,199.500000,204.990005,199.449997,204.339996,204.339996,23054600 165 | 2018-06-04,205.119995,209.750000,204.729996,208.949997,208.949997,19308800 166 | 2018-06-05,209.949997,211.699997,207.130005,208.369995,208.369995,17787700 167 | 2018-06-06,209.860001,210.460007,207.289001,208.300003,208.300003,13800500 168 | 2018-06-07,207.460007,209.000000,200.880005,203.619995,203.619995,26747800 169 | 2018-06-08,201.110001,206.229996,200.429993,205.070007,205.070007,17525200 170 | 2018-06-11,206.500000,207.600006,205.009995,205.699997,205.699997,12061400 171 | 2018-06-12,206.949997,209.800003,206.899994,209.080002,209.080002,15910900 172 | 2018-06-13,209.440002,209.649994,206.600006,206.619995,206.619995,13844200 173 | 2018-06-14,207.720001,211.119995,207.509995,210.860001,210.860001,18838300 174 | 2018-06-15,207.490005,210.080002,206.009995,208.000000,208.000000,28665600 175 | 2018-06-18,205.160004,208.600006,203.880005,208.570007,208.570007,14645200 176 | 2018-06-19,203.529999,204.509995,199.500000,204.429993,204.429993,24484200 177 | 2018-06-20,205.050003,207.229996,205.020004,206.229996,206.229996,15559600 178 | 2018-06-21,205.839996,206.000000,201.039993,202.210007,202.210007,13963800 179 | 2018-06-22,203.380005,203.800003,200.250000,202.009995,202.009995,9585000 180 | 2018-06-25,197.850006,198.100006,187.860001,191.250000,191.250000,32750900 181 | 2018-06-26,193.339996,193.660004,188.419998,191.419998,191.419998,20740400 182 | 2018-06-27,193.460007,193.600006,184.889999,185.020004,185.020004,23887000 183 | 2018-06-28,183.199997,188.960007,182.039993,188.380005,188.380005,19553800 184 | 2018-06-29,185.360001,188.970001,184.259995,185.529999,185.529999,26023400 185 | 2018-07-02,181.660004,186.360001,181.059998,186.360001,186.360001,17325900 186 | 2018-07-03,187.880005,188.500000,184.360001,184.750000,184.750000,11673700 187 | 2018-07-05,187.169998,187.440002,182.899994,186.880005,186.880005,18412100 188 | 2018-07-06,186.009995,192.490005,185.539993,192.270004,192.270004,17035600 189 | 2018-07-09,194.449997,194.690002,190.869995,192.750000,192.750000,15466400 190 | 2018-07-10,192.889999,195.130005,191.479996,192.550003,192.550003,12611400 191 | 2018-07-11,188.600006,190.050003,187.419998,187.419998,187.419998,15947000 192 | 2018-07-12,190.770004,192.580002,189.789993,190.169998,190.169998,17440400 193 | 2018-07-13,191.610001,192.119995,189.300003,190.039993,190.039993,12550500 194 | 2018-07-16,189.570007,191.369995,189.149994,190.350006,190.350006,12205600 195 | 2018-07-17,188.649994,192.949997,187.899994,192.660004,192.660004,13270700 196 | 2018-07-18,192.449997,193.229996,189.910004,190.789993,190.789993,10796600 197 | 2018-07-19,188.679993,189.679993,186.869995,187.339996,187.339996,13373100 198 | 2018-07-20,189.490005,189.500000,186.610001,187.250000,187.250000,12807500 199 | 2018-07-23,187.179993,187.809998,184.800003,187.039993,187.039993,10996200 200 | 2018-07-24,190.190002,193.070007,188.350006,189.000000,189.000000,18414800 201 | 2018-07-25,190.610001,198.350006,190.139999,197.979996,197.979996,20735400 202 | 2018-07-26,193.210007,196.119995,192.619995,194.179993,194.179993,13885500 203 | 2018-07-27,196.100006,196.270004,186.929993,189.419998,189.419998,19907100 204 | 2018-07-30,190.220001,190.589996,182.059998,184.820007,184.820007,19906300 205 | 2018-07-31,186.399994,188.947998,183.990005,187.229996,187.229996,17016600 206 | 2018-08-01,186.000000,189.059998,183.960007,185.270004,185.270004,14370700 207 | 2018-08-02,181.539993,182.899994,179.779999,182.600006,182.600006,20976500 208 | 2018-08-03,184.149994,184.500000,180.080002,180.839996,180.839996,18185100 209 | 2018-08-06,180.699997,180.860001,177.490005,178.619995,178.619995,35419000 210 | 2018-08-07,180.289993,183.000000,179.740005,179.919998,179.919998,20620300 211 | 2018-08-08,180.000000,180.179993,176.550003,177.520004,177.520004,21152400 212 | 2018-08-09,179.309998,180.630005,176.759995,177.190002,177.190002,35207300 213 | 2018-08-10,175.570007,180.449997,174.750000,180.009995,180.009995,22049200 214 | 2018-08-13,179.649994,180.649994,177.000000,177.679993,177.679993,14674000 215 | 2018-08-14,175.139999,176.199997,170.770004,172.529999,172.529999,38508600 216 | 2018-08-15,167.110001,169.850006,165.389999,169.830002,169.830002,41278600 217 | 2018-08-16,172.330002,175.699997,171.570007,171.990005,171.990005,34263300 218 | 2018-08-17,172.520004,174.199997,168.380005,172.779999,172.779999,24695400 219 | 2018-08-20,175.220001,178.860001,174.360001,176.289993,176.289993,25900700 220 | 2018-08-21,177.630005,179.669998,176.970001,177.919998,177.919998,20337400 221 | 2018-08-22,178.149994,179.740005,175.500000,177.850006,177.850006,27138500 222 | 2018-08-23,184.970001,186.500000,171.910004,172.229996,172.229996,78843400 223 | 2018-08-24,175.000000,176.369995,172.449997,174.229996,174.229996,30442800 224 | 2018-08-27,177.100006,180.880005,176.220001,180.649994,180.649994,23533800 225 | 2018-08-28,182.149994,182.380005,177.500000,178.190002,178.190002,15319000 226 | 2018-08-29,179.350006,179.660004,176.830002,178.500000,178.500000,11892600 227 | 2018-08-30,177.330002,178.100006,174.121994,174.600006,174.600006,17086200 228 | 2018-08-31,173.110001,176.681000,172.759995,175.009995,175.009995,13730800 229 | 2018-09-04,173.500000,173.949997,169.000000,170.440002,170.440002,23450500 230 | 2018-09-05,167.479996,168.279999,162.029999,164.229996,164.229996,35694700 231 | 2018-09-06,164.160004,166.479996,158.669998,159.869995,159.869995,33052000 232 | 2018-09-07,159.949997,164.610001,159.509995,162.369995,162.369995,19452400 233 | 2018-09-10,158.589996,160.720001,155.000000,156.360001,156.360001,39092700 234 | 2018-09-11,153.179993,158.449997,152.850006,157.460007,157.460007,25884100 235 | 2018-09-12,158.199997,162.820007,156.181000,161.460007,161.460007,32490500 236 | 2018-09-13,165.410004,167.220001,164.009995,165.529999,165.529999,25696500 237 | 2018-09-14,167.880005,168.000000,163.380997,164.740005,164.740005,23417700 238 | 2018-09-17,161.500000,161.649994,158.289001,158.889999,158.889999,20423200 239 | 2018-09-18,156.880005,159.399994,155.520004,156.649994,156.649994,27240600 240 | 2018-09-19,158.820007,163.130005,158.820007,162.630005,162.630005,23028300 241 | 2018-09-20,166.889999,167.699997,164.716003,165.880005,165.880005,22808000 242 | 2018-09-21,169.460007,169.839996,164.500000,164.630005,164.630005,22081900 243 | 2018-09-24,162.809998,163.399002,160.100006,163.160004,163.160004,13123400 244 | 2018-09-25,164.050003,165.440002,162.830002,164.250000,164.250000,9588700 245 | 2018-09-26,165.520004,167.389999,164.869995,165.399994,165.399994,13592500 246 | 2018-09-27,166.389999,167.050003,164.919998,166.320007,166.320007,12689200 247 | 2018-09-28,164.899994,165.660004,163.300003,164.759995,164.759995,10486500 248 | 2018-10-01,165.919998,165.949997,161.559998,162.000000,162.000000,10615200 249 | 2018-10-02,159.789993,161.028000,158.270004,160.229996,160.229996,14730500 250 | 2018-10-03,163.149994,164.539993,161.929993,162.369995,162.369995,13118800 251 | 2018-10-04,160.059998,160.080002,153.869995,156.130005,156.130005,32176100 252 | 2018-10-05,156.139999,157.119995,152.250000,154.630005,154.630005,20271000 253 | 2018-10-08,150.199997,152.636002,148.339996,151.139999,151.139999,25060400 254 | 2018-10-09,147.970001,150.589996,146.470001,146.940002,146.940002,31045300 255 | -------------------------------------------------------------------------------- /test/strat.py: -------------------------------------------------------------------------------- 1 | from __future__ import (absolute_import, division, print_function, 2 | unicode_literals) 3 | import backtrader as bt 4 | import datetime # For datetime objects 5 | import os.path # To manage paths 6 | import sys # To find out the script name (in argv[0]) 7 | 8 | # Create a Stratey 9 | class TestStrategy(bt.Strategy): 10 | params = ( 11 | ('period', 15), 12 | ('printlog', True), 13 | ) 14 | 15 | def log(self, txt, dt=None, doprint=False): 16 | ''' Logging function for this strategy''' 17 | if self.params.printlog or doprint: 18 | dt = dt or self.datas[0].datetime.date(0) 19 | print('%s, %s' % (dt.isoformat(), txt)) 20 | 21 | def __init__(self): 22 | # Keep a reference to the "close" line in the data[0] dataseries 23 | self.dataclose = self.datas[0].close 24 | # Keep track of pending orders 25 | self.order = None 26 | self.buyprice = None 27 | self.buycomm = None 28 | self.sma = bt.indicators.SimpleMovingAverage( 29 | self.datas[0], period=self.params.period) 30 | 31 | bt.indicators.ExponentialMovingAverage(self.datas[0], period=25) 32 | bt.indicators.WeightedMovingAverage(self.datas[0], period=25, 33 | subplot=True) 34 | bt.indicators.StochasticSlow(self.datas[0]) 35 | bt.indicators.MACDHisto(self.datas[0]) 36 | rsi = bt.indicators.RSI(self.datas[0]) 37 | bt.indicators.SmoothedMovingAverage(rsi, period=10) 38 | bt.indicators.ATR(self.datas[0], plot=False) 39 | 40 | def notify_order(self, order): 41 | if order.status in [order.Submitted, order.Accepted]: 42 | # Buy/Sell order submitted/accepted to/by broker - Nothing to do 43 | return 44 | 45 | # Check if an order has been completed 46 | # Attention: broker could reject order if not enough cash 47 | if order.status in [order.Completed]: 48 | if order.isbuy(): 49 | self.log( 50 | 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % 51 | (order.executed.price, 52 | order.executed.value, 53 | order.executed.comm)) 54 | self.buyprice = order.executed.price 55 | self.buycomm = order.executed.comm 56 | else: # Sell 57 | self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % 58 | (order.executed.price, 59 | order.executed.value, 60 | order.executed.comm)) 61 | 62 | self.bar_executed = len(self) 63 | 64 | elif order.status in [order.Canceled, order.Margin, order.Rejected]: 65 | self.log('Order Canceled/Margin/Rejected') 66 | 67 | # Write down: no pending order 68 | self.order = None 69 | 70 | def notify_trade(self, trade): 71 | if not trade.isclosed: 72 | return 73 | 74 | self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % 75 | (trade.pnl, trade.pnlcomm)) 76 | 77 | def next(self): 78 | # Simply log the closing price of the series from the reference 79 | self.log('Close, %.2f' % self.dataclose[0]) 80 | 81 | # Check if an order is pending ... if yes, we cannot send a 2nd one 82 | if self.order: 83 | return 84 | 85 | # Check if we are in the market 86 | if not self.position: 87 | # buy if ... current close less than previous close 88 | if self.dataclose[0] > self.sma[0]: 89 | self.log('BUY CREATE, %.2f' % self.dataclose[0]) 90 | self.order = self.buy() 91 | 92 | # Already in the market ... we might sell 93 | else: 94 | if self.dataclose[0] < self.sma[0]: 95 | self.log('SELL CREATE, %.2f' % self.dataclose[0]) 96 | self.order = self.sell() 97 | 98 | def stop(self): 99 | self.log('(MA Period %2d) Ending Value %.2f' % 100 | (self.params.period, self.broker.getvalue()), doprint=True) 101 | 102 | 103 | 104 | if __name__ == '__main__': 105 | cerebro = bt.Cerebro() 106 | 107 | # # search best hyperparams 108 | # strats = cerebro.optstrategy( 109 | # TestStrategy, 110 | # period=range(10, 31)) 111 | 112 | # Add a strategy 113 | cerebro.addstrategy(TestStrategy) 114 | 115 | # Create a Data Feed 116 | data = bt.feeds.YahooFinanceCSVData( 117 | dataname='BABA.csv', 118 | reverse=False) 119 | 120 | # Add the Data Feed to Cerebro 121 | cerebro.adddata(data) 122 | 123 | cerebro.broker.setcash(100000.0) 124 | cerebro.addsizer(bt.sizers.FixedSize, stake=10) 125 | cerebro.broker.setcommission(commission=0.001) 126 | print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) 127 | cerebro.run() 128 | print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) 129 | 130 | cerebro.plot() -------------------------------------------------------------------------------- /test/strat.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonyip184/StockSentimentTrading/ad055a34047a4597e0fad65c0052c60b0fb81bab/test/strat.pyc -------------------------------------------------------------------------------- /test/test.py: -------------------------------------------------------------------------------- 1 | from __future__ import (absolute_import, division, print_function, 2 | unicode_literals) 3 | 4 | import backtrader as bt 5 | import backtrader.indicators as btind 6 | import os.path 7 | import sys 8 | import nltk 9 | import warnings 10 | warnings.filterwarnings('ignore') 11 | from nltk.sentiment.vader import SentimentIntensityAnalyzer 12 | from urllib.request import urlopen 13 | from bs4 import BeautifulSoup 14 | from datetime import datetime, timedelta 15 | import time 16 | import pprint 17 | # nltk.download('vader_lexicon') 18 | sia = SentimentIntensityAnalyzer() 19 | 20 | 21 | date_sentiments = {} 22 | 23 | for i in range(1,11): 24 | page = urlopen('https://www.businesstimes.com.sg/search/facebook?page='+str(i)).read() 25 | soup = BeautifulSoup(page, features="html.parser") 26 | posts = soup.findAll("div", {"class": "media-body"}) 27 | for post in posts: 28 | time.sleep(1) 29 | url = post.a['href'] 30 | date = post.time.text 31 | print(date, url) 32 | try: 33 | link_page = urlopen(url).read() 34 | except: 35 | url = url[:-2] 36 | link_page = urlopen(url).read() 37 | link_soup = BeautifulSoup(link_page) 38 | sentences = link_soup.findAll("p") 39 | passage = "" 40 | for sentence in sentences: 41 | passage += sentence.text 42 | sentiment = sia.polarity_scores(passage)['compound'] 43 | date_sentiments.setdefault(date, []).append(sentiment) 44 | 45 | date_sentiment = {} 46 | 47 | for k,v in date_sentiments.items(): 48 | date_sentiment[datetime.strptime(k, '%d %b %Y').date() + timedelta(days=1)] = round(sum(v)/float(len(v)),3) 49 | 50 | earliest_date = min(date_sentiment.keys()) 51 | 52 | print(date_sentiment) 53 | 54 | 55 | 56 | class Sentiment(bt.Indicator): 57 | lines = ('sentiment',) 58 | plotinfo = dict( 59 | plotymargin=0.15, 60 | plothlines=[0], 61 | plotyticks=[1.0, 0, -1.0]) 62 | 63 | def next(self): 64 | self.date = self.data.datetime 65 | date = bt.num2date(self.date[0]).date() 66 | prev_sentiment = self.sentiment 67 | if date in date_sentiment: 68 | self.sentiment = date_sentiment[date] 69 | self.lines.sentiment[0] = self.sentiment 70 | 71 | 72 | class SentimentStrat(bt.Strategy): 73 | params = ( 74 | ('period', 15), 75 | ('printlog', True), 76 | ) 77 | 78 | def log(self, txt, dt=None, doprint=False): 79 | ''' Logging function for this strategy''' 80 | if self.params.printlog or doprint: 81 | dt = dt or self.datas[0].datetime.date(0) 82 | print('%s, %s' % (dt.isoformat(), txt)) 83 | 84 | def __init__(self): 85 | # Keep a reference to the "close" line in the data[0] dataseries 86 | self.dataclose = self.datas[0].close 87 | # Keep track of pending orders 88 | self.order = None 89 | self.buyprice = None 90 | self.buycomm = None 91 | self.sma = bt.indicators.SimpleMovingAverage( 92 | self.datas[0], period=self.params.period) 93 | self.date = self.data.datetime 94 | self.sentiment = None 95 | Sentiment(self.data) 96 | 97 | def notify_order(self, order): 98 | if order.status in [order.Submitted, order.Accepted]: 99 | # Buy/Sell order submitted/accepted to/by broker - Nothing to do 100 | return 101 | 102 | # Check if an order has been completed 103 | # Attention: broker could reject order if not enough cash 104 | if order.status in [order.Completed]: 105 | if order.isbuy(): 106 | self.log( 107 | 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % 108 | (order.executed.price, 109 | order.executed.value, 110 | order.executed.comm)) 111 | self.buyprice = order.executed.price 112 | self.buycomm = order.executed.comm 113 | else: # Sell 114 | self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % 115 | (order.executed.price, 116 | order.executed.value, 117 | order.executed.comm)) 118 | 119 | self.bar_executed = len(self) 120 | 121 | elif order.status in [order.Canceled, order.Margin, order.Rejected]: 122 | self.log('Order Canceled/Margin/Rejected') 123 | 124 | # Write down: no pending order 125 | self.order = None 126 | 127 | def notify_trade(self, trade): 128 | if not trade.isclosed: 129 | return 130 | 131 | self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % 132 | (trade.pnl, trade.pnlcomm)) 133 | 134 | ### Main Strat ### 135 | def next(self): 136 | # log closing price of the series from the reference 137 | self.log('Close, %.2f' % self.dataclose[0]) 138 | 139 | date = bt.num2date(self.date[0]).date() 140 | prev_sentiment = self.sentiment 141 | if date in date_sentiment: 142 | self.sentiment = date_sentiment[date] 143 | 144 | # Check if an order is pending. if yes, we cannot send a 2nd one 145 | if self.order: 146 | return 147 | print(self.sentiment) 148 | # If not in the market and previous sentiment not none 149 | if not self.position and prev_sentiment: 150 | # buy if current close more than sma AND sentiment increased by >= 0.5 151 | if self.sentiment - prev_sentiment >= 0.5: 152 | self.log('BUY CREATE, %.2f' % self.dataclose[0]) 153 | self.order = self.buy() 154 | 155 | # Already in the market and previous sentiment not none 156 | elif prev_sentiment: 157 | # sell if current close less than sma AND sentiment decreased by >= 0.5 158 | if self.sentiment - prev_sentiment <= -0.5: 159 | self.log('SELL CREATE, %.2f' % self.dataclose[0]) 160 | self.order = self.sell() 161 | 162 | def stop(self): 163 | self.log('(MA Period %2d) Ending Value %.2f' % 164 | (self.params.period, self.broker.getvalue()), doprint=True) 165 | 166 | 167 | if __name__ == '__main__': 168 | cerebro = bt.Cerebro() 169 | 170 | # Strategy 171 | cerebro.addstrategy(SentimentStrat) 172 | 173 | # Data Feed 174 | data = bt.feeds.YahooFinanceData( 175 | dataname = 'FB', 176 | fromdate = earliest_date, 177 | todate = datetime(2018,11,25), 178 | reverse = False 179 | ) 180 | 181 | cerebro.adddata(data) 182 | 183 | cerebro.broker.setcash(100000.0) 184 | cerebro.addsizer(bt.sizers.FixedSize, stake=10) 185 | cerebro.broker.setcommission(commission=0.001) 186 | print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) 187 | cerebro.run() 188 | print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) 189 | 190 | cerebro.plot() --------------------------------------------------------------------------------