diff --git a/archives.html b/archives.html index 98dcbb6..cd0d38f 100644 --- a/archives.html +++ b/archives.html @@ -82,6 +82,8 @@

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/author/bradlee-speice.html b/author/bradlee-speice.html index 2295db2..93b41e9 100644 --- a/author/bradlee-speice.html +++ b/author/bradlee-speice.html @@ -82,6 +82,8 @@

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/author/bradlee-speice2.html b/author/bradlee-speice2.html index 2295db2..93b41e9 100644 --- a/author/bradlee-speice2.html +++ b/author/bradlee-speice2.html @@ -82,6 +82,8 @@

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/authors.html b/authors.html index 9b1aa87..96e8e13 100644 --- a/authors.html +++ b/authors.html @@ -82,6 +82,8 @@

Bradlee Speice

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/autocallable-bonds.html b/autocallable-bonds.html index d9df85f..b359b30 100644 --- a/autocallable-bonds.html +++ b/autocallable-bonds.html @@ -95,7 +95,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at
In [1]:
-
using Gadfly
+
using Gadfly
 
@@ -131,10 +131,10 @@ Because these are all very similar, we decided to demonstrate all 3 products at
In [2]:
-
S0 = 102.2
+
S0 = 102.2
 nominal = 100
 q = 2.84 / 100
-σ = 15.37 / 100
+σ = 15.37 / 100
 term = [0, .49, .9, 1.21, 1.45, 1.69] / 100 + 1
 
 ###
@@ -187,7 +187,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at
 
In [3]:
-
simulate_gbm = function(S0, μ, σ, T, n)
+
simulate_gbm = function(S0, μ, σ, T, n)
     # Set the initial state
     m = length(S0)
     t = T / n
@@ -196,7 +196,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at
     
     # Build out all states
     for i=1:(n-1)
-        motion[:,i+1] = motion[:,i] .* exp((μ - σ^2/2)*t) .* exp(sqrt(t) * σ .* randn(m))
+        motion[:,i+1] = motion[:,i] .* exp((μ - σ^2/2)*t) .* exp(sqrt(t) * σ .* randn(m))
     end
     
     return motion
@@ -258,9 +258,9 @@ Because these are all very similar, we decided to demonstrate all 3 products at
 
In [4]:
-
initial = ones(5) * S0
+
initial = ones(5) * S0
 # Using μ=0, T=.25 for now, we'll use the proper values later
-motion = simulate_gbm(initial, 0, σ, .25, 200) 
+motion = simulate_gbm(initial, 0, σ, .25, 200) 
 
 display_motion(motion, .25)
 
@@ -1866,7 +1866,7 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20")
In [5]:
-
forward_term = function(yearly_term)
+
forward_term = function(yearly_term)
     # It is assumed that we have a yearly term structure passed in, and starts at year 0
     # This implies a nominal rate above 0 for the first year!
     years = length(term)-1 # because we start at 0
@@ -1896,14 +1896,14 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20")
 
In [6]:
-
# Example term structure taken from:
+
# Example term structure taken from:
 # http://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yield
 # Linear interpolation used years in-between periods, assuming real-dollar
 # interest rates
 forward_yield = forward_term(term)
 calculated_term2 = term[1] * forward_yield[1]
 
-println("Actual term[2]: $(term[2]); Calculated term[2]: $(calculated_term2)")
+println("Actual term[2]: $(term[2]); Calculated term[2]: $(calculated_term2)")
 
@@ -1940,11 +1940,11 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20")
In [7]:
-
full_motion = ones(5) * S0
+
full_motion = ones(5) * S0
 full_term = vcat(term[1], forward_yield)
 for i=1:T
-    μ = (full_term[i] - 1 - q)
-    year_motion = simulate_gbm(full_motion[:,end], μ, σ, 1, n)
+    μ = (full_term[i] - 1 - q)
+    year_motion = simulate_gbm(full_motion[:,end], μ, σ, 1, n)
     full_motion = hcat(full_motion, year_motion)
 end
 
@@ -3501,14 +3501,14 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20")
 
In [8]:
-
full_simulation = function(S0, T, n, m, term)
+
full_simulation = function(S0, T, n, m, term)
     forward = vcat(term[1], forward_term(term))
 
     # And an S0 to kick things off.
     final_motion = ones(m) * S0
     for i=1:T
-        μ = (forward[i] - 1 - q)
-        year_motion = simulate_gbm(final_motion[:,end], μ, σ, 1, n)
+        μ = (forward[i] - 1 - q)
+        year_motion = simulate_gbm(final_motion[:,end], μ, σ, 1, n)
         final_motion = hcat(final_motion, year_motion)
     end
     return final_motion
@@ -3517,7 +3517,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20")
 tic()
 full_simulation(S0, T, n, m, term)
 time = toq()
-@printf("Time to run simulation: %.2fs", time)
+@printf("Time to run simulation: %.2fs", time)
 
@@ -3562,7 +3562,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20")
In [9]:
-
call_barrier = S0
+
call_barrier = S0
 strike = S0
 protection_barrier = S0 * .6
 coupon = nominal * .07
@@ -3576,7 +3576,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20")
 
     for i=1:t
         price = year_prices[i]
-        if price  call_barrier
+        if price  call_barrier
             return (nominal + coupon*i) * exp((prod(forward_structure[i:end])-1)*(t-i))
         end
     end
@@ -3606,13 +3606,13 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20")
     tic()
     mean_payoffs[i] = athena()
     time = toq()
-    @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", i, mean_payoffs[i], time)
+    @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", i, mean_payoffs[i], time)
 end
 
 final_mean = mean(mean_payoffs)
-println("Mean over $num_simulations simulations: $(mean(mean_payoffs))")
+println("Mean over $num_simulations simulations: $(mean(mean_payoffs))")
 pv = final_mean * (exp(-(prod(forward_structure)-1)*T))
-@printf("Present value of Athena note: \$%.2f, notional: \$%.2f", pv, nominal)
+@printf("Present value of Athena note: \$%.2f, notional: \$%.2f", pv, nominal)
 
@@ -3673,7 +3673,7 @@ Present value of Athena note: $95.00, notional: $100.00
In [10]:
-
call_barrier = S0
+
call_barrier = S0
 coupon_barrier = S0 * .8
 protection_barrier = S0 * .6
 coupon = nominal * .06
@@ -3686,9 +3686,9 @@ Present value of Athena note: $95.00, notional: $100.00
for i=1:t price = year_prices[i] - if price call_barrier + if price call_barrier return (nominal + coupon + total_coupons)*exp((prod(forward_structure[i:end])-1)*(t-i)) - elseif price coupon_barrier + elseif price coupon_barrier total_coupons = total_coupons * exp(forward_structure[i]-1) + coupon else total_coupons *= exp(forward_structure[i]-1) @@ -3720,13 +3720,13 @@ Present value of Athena note: $95.00, notional: $100.00
tic() mean_payoffs[i] = phoenix_no_memory() time = toq() - @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", i, mean_payoffs[i], time) + @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", i, mean_payoffs[i], time) end final_mean = mean(mean_payoffs) -println("Mean over $num_simulations simulations: $(mean(mean_payoffs))") +println("Mean over $num_simulations simulations: $(mean(mean_payoffs))") pv = final_mean * exp(-(prod(forward_structure)-1)*(T)) -@printf("Present value of Phoenix without memory note: \$%.2f", pv) +@printf("Present value of Phoenix without memory note: \$%.2f", pv)
@@ -3773,7 +3773,7 @@ Present value of Phoenix without memory note: $97.44
In [11]:
-
call_barrier = S0
+
call_barrier = S0
 coupon_barrier = S0 * .8
 protection_barrier = S0 * .6
 coupon = nominal * .07
@@ -3827,14 +3827,14 @@ Present value of Phoenix without memory note: $97.44
tic() mean_payoffs[i] = phoenix_with_memory() time = toq() - @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", + @printf("Mean of simulation %i: \$%.4f; Simulation time: %.2fs\n", i, mean_payoffs[i], time) end final_mean = mean(mean_payoffs) -println("Mean over $num_simulations simulations: $(mean(mean_payoffs))") +println("Mean over $num_simulations simulations: $(mean(mean_payoffs))") pv = final_mean * exp(-(prod(forward_structure)-1)*(T)) -@printf("Present value of Phoenix with memory note: \$%.2f", pv) +@printf("Present value of Phoenix with memory note: \$%.2f", pv)
diff --git a/categories.html b/categories.html index 2e0e432..77aebb2 100644 --- a/categories.html +++ b/categories.html @@ -82,6 +82,8 @@

Blog

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/category/blog.html b/category/blog.html index 0365414..782a8a4 100644 --- a/category/blog.html +++ b/category/blog.html @@ -83,6 +83,8 @@

Blog

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/category/blog2.html b/category/blog2.html index 0365414..782a8a4 100644 --- a/category/blog2.html +++ b/category/blog2.html @@ -83,6 +83,8 @@

Blog

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
diff --git a/cloudy-in-seattle.html b/cloudy-in-seattle.html index 7bd28c3..a9ae5c5 100644 --- a/cloudy-in-seattle.html +++ b/cloudy-in-seattle.html @@ -4,7 +4,7 @@ - + @@ -92,7 +92,7 @@
In [1]:
-
import pickle
+
import pickle
 import pandas as pd
 import numpy as np
 from bokeh.plotting import output_notebook, figure, show
@@ -359,7 +359,7 @@
 
In [2]:
-
city_forecasts = pickle.load(open('city_forecasts.p', 'rb'))
+
city_forecasts = pickle.load(open('city_forecasts.p', 'rb'))
 forecasts_df = pd.DataFrame.from_dict(city_forecasts)
 
@@ -373,24 +373,24 @@
In [3]:
-
cities = ['binghamton', 'cary', 'nyc', 'seattle']
+
cities = ['binghamton', 'cary', 'nyc', 'seattle']
 city_colors = {cities[i]: Palette[i] for i in range(0, 4)}
 
 def safe_cover(frame):
-    if frame and 'cloudCover' in frame:
-        return frame['cloudCover']
+    if frame and 'cloudCover' in frame:
+        return frame['cloudCover']
     else:
         return np.NaN
 
 def monthly_avg_cloudcover(city, year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    cloud_cover_vals = list(map(lambda x: safe_cover(forecasts_df[city][x]['currently']), dates))
+                             freq='D', closed='left')
+    cloud_cover_vals = list(map(lambda x: safe_cover(forecasts_df[city][x]['currently']), dates))
     cloud_cover_samples = len(list(filter(lambda x: x is not np.NaN, cloud_cover_vals)))
-    # Ignore an issue with nanmean having all NaN values. We'll discuss the data issues below.
+    # Ignore an issue with nanmean having all NaN values. We'll discuss the data issues below.
     with warnings.catch_warnings():
-        warnings.simplefilter('ignore')
+        warnings.simplefilter('ignore')
         return np.nanmean(cloud_cover_vals), cloud_cover_samples
 
@@ -404,23 +404,23 @@
In [4]:
-
years = range(1990, 2016)
+
years = range(1990, 2016)
 def city_avg_cc(city, month):
     return [monthly_avg_cloudcover(city, y, month) for y in years]
 
 months = [
-    ('July', 7),
-    ('August', 8),
-    ('September', 9),
-    ('October', 10),
-    ('November', 11)
+    ('July', 7),
+    ('August', 8),
+    ('September', 9),
+    ('October', 10),
+    ('November', 11)
 ]
 
 for month, month_id in months:
     month_averages = {city: city_avg_cc(city, month_id) for city in cities}
-    f = figure(title="{} Average Cloud Cover".format(month),
-               x_axis_label='Year',
-               y_axis_label='Cloud Cover Percentage')
+    f = figure(title="{} Average Cloud Cover".format(month),
+               x_axis_label='Year',
+               y_axis_label='Cloud Cover Percentage')
     for city in cities:
         f.line(years, [x[0] for x in month_averages[city]],
                legend=city, color=city_colors[city])
@@ -609,21 +609,21 @@
 
In [5]:
-
def safe_precip(frame):
-    if frame and 'precipProbability' in frame:
-        return frame['precipProbability']
+
def safe_precip(frame):
+    if frame and 'precipProbability' in frame:
+        return frame['precipProbability']
     else:
         return np.NaN
 
 def monthly_avg_precip(city, year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    precip_vals = list(map(lambda x: safe_precip(forecasts_df[city][x]['currently']), dates))
+                             freq='D', closed='left')
+    precip_vals = list(map(lambda x: safe_precip(forecasts_df[city][x]['currently']), dates))
     precip_samples = len(list(filter(lambda x: x is not np.NaN, precip_vals)))
-    # Ignore an issue with nanmean having all NaN values. We'll discuss the data issues below.
+    # Ignore an issue with nanmean having all NaN values. We'll discuss the data issues below.
     with warnings.catch_warnings():
-        warnings.simplefilter('ignore')
+        warnings.simplefilter('ignore')
         return np.nanmean(precip_vals), precip_samples
 
 def city_avg_precip(city, month):
@@ -631,9 +631,9 @@
 
 for month, month_id in months:
     month_averages = {city: city_avg_cc(city, month_id) for city in cities}
-    f = figure(title="{} Average Precipitation Chance".format(month),
-               x_axis_label='Year',
-               y_axis_label='Precipitation Chance Percentage')
+    f = figure(title="{} Average Precipitation Chance".format(month),
+               x_axis_label='Year',
+               y_axis_label='Precipitation Chance Percentage')
     for city in cities:
         f.line(years, [x[0] for x in month_averages[city]],
                legend=city, color=city_colors[city])
diff --git a/complaining-about-the-weather.html b/complaining-about-the-weather.html
index 3dce470..08d7adc 100644
--- a/complaining-about-the-weather.html
+++ b/complaining-about-the-weather.html
@@ -92,7 +92,7 @@
 
In [1]:
-
from bokeh.plotting import figure, output_notebook, show
+
from bokeh.plotting import figure, output_notebook, show
 from bokeh.palettes import PuBuGn9 as Palette
 import pandas as pd
 import numpy as np
@@ -352,7 +352,7 @@
 
In [2]:
-
city_forecasts = pickle.load(open('city_forecasts.p', 'rb'))
+
city_forecasts = pickle.load(open('city_forecasts.p', 'rb'))
 forecast_df = pd.DataFrame.from_dict(city_forecasts)
 
@@ -366,31 +366,31 @@
In [3]:
-
cary_forecast = forecast_df['cary']
+
cary_forecast = forecast_df['cary']
 years = range(1990, 2016)
 months = range(7, 12)
-months_str = ['July', 'August', 'September', 'October', 'November']
+months_str = ['July', 'August', 'September', 'October', 'November']
 
 def safe_cover(frame):
-    if frame and 'cloudCover' in frame:
-        return frame['cloudCover']
+    if frame and 'cloudCover' in frame:
+        return frame['cloudCover']
     else:
         return np.NaN
 
 def monthly_avg_cloudcover(year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    cloud_cover_vals = list(map(lambda x: safe_cover(cary_forecast[x]['currently']), dates))
+                             freq='D', closed='left')
+    cloud_cover_vals = list(map(lambda x: safe_cover(cary_forecast[x]['currently']), dates))
     cloud_cover_samples = len(list(filter(lambda x: x is not np.NaN, cloud_cover_vals)))
     return np.nanmean(cloud_cover_vals), cloud_cover_samples
 
 
 monthly_cover_vals = [[monthly_avg_cloudcover(y, m)[0] for y in years] for m in months]
 
-f = figure(title='Monthly Average Cloud Cover',
+f = figure(title='Monthly Average Cloud Cover',
            x_range=(1990, 2015),
-          x_axis_label='Year')
+          x_axis_label='Year')
 for x in range(0, len(months)):
     f.line(years, monthly_cover_vals[x], legend=months_str[x], color=Palette[x])
 show(f)
@@ -454,11 +454,11 @@
 
In [4]:
-
def monthly_cloudy_days(year, month):
+
def monthly_cloudy_days(year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    cloud_cover_vals = list(map(lambda x: safe_cover(cary_forecast[x]['currently']), dates))
+                             freq='D', closed='left')
+    cloud_cover_vals = list(map(lambda x: safe_cover(cary_forecast[x]['currently']), dates))
     cloud_cover_samples = len(list(filter(lambda x: x is not np.NaN, cloud_cover_vals)))
     cloudy_days = [cover > .5 for cover in cloud_cover_vals]
     return np.count_nonzero(cloudy_days), cloud_cover_samples
@@ -466,16 +466,16 @@
 monthly_days_vals = [[monthly_cloudy_days(y, m)[0] for y in years] for m in months]
 monthly_cover_samples = [[monthly_cloudy_days(y, m)[1] for y in years] for m in months]
 
-f = figure(title='Monthly Cloudy Days',
+f = figure(title='Monthly Cloudy Days',
            x_range=(1990, 2015),
-          x_axis_label='Year')
+          x_axis_label='Year')
 for x in range(0, len(months)):
     f.line(years, monthly_days_vals[x], legend=months_str[x], color=Palette[x])
 show(f)
 
-f = figure(title='Monthly Cloud Cover Samples',
+f = figure(title='Monthly Cloud Cover Samples',
           x_range=(1990, 2015),
-          x_axis_label='Year',
+          x_axis_label='Year',
           height=300)
 for x in range(0, len(months)):
     f.line(years, monthly_cover_samples[x], legend=months_str[x], color=Palette[x])
@@ -570,25 +570,25 @@
 
In [5]:
-
def safe_precip(frame):
-    if frame and 'precipProbability' in frame:
-        return frame['precipProbability']
+
def safe_precip(frame):
+    if frame and 'precipProbability' in frame:
+        return frame['precipProbability']
     else:
         return np.NaN
 
 def monthly_avg_precip(year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    precip_vals = list(map(lambda x: safe_precip(cary_forecast[x]['currently']), dates))
+                             freq='D', closed='left')
+    precip_vals = list(map(lambda x: safe_precip(cary_forecast[x]['currently']), dates))
     precip_samples = len(list(filter(lambda x: x is not np.NaN, precip_vals)))
     return np.nanmean(precip_vals), precip_samples
 
 monthly_avg_precip_vals = [[monthly_avg_precip(y, m)[0] for y in years] for m in months]
 
-f = figure(title='Monthly Average Precipitation Chance',
+f = figure(title='Monthly Average Precipitation Chance',
            x_range=(1990, 2015),
-          x_axis_label='Year')
+          x_axis_label='Year')
 for x in range(0, len(months)):
     f.line(years, monthly_avg_precip_vals[x], legend=months_str[x], color=Palette[x])
 show(f)
@@ -651,11 +651,11 @@
 
In [6]:
-
def monthly_rainy_days(year, month):
+
def monthly_rainy_days(year, month):
     dates = pd.DatetimeIndex(start=datetime(year, month, 1, 12),
                              end=datetime(year, month + 1, 1, 12),
-                             freq='D', closed='left')
-    precip_prob_vals = list(map(lambda x: safe_precip(cary_forecast[x]['currently']), dates))
+                             freq='D', closed='left')
+    precip_prob_vals = list(map(lambda x: safe_precip(cary_forecast[x]['currently']), dates))
     precip_prob_samples = len(list(filter(lambda x: x is not np.NaN, precip_prob_vals)))
     precip_days = [prob > .25 for prob in precip_prob_vals]
     return np.count_nonzero(precip_days), precip_prob_samples
@@ -663,16 +663,16 @@
 monthly_precip_days_vals = [[monthly_rainy_days(y, m)[0] for y in years] for m in months]
 monthly_precip_samples = [[monthly_rainy_days(y, m)[1] for y in years] for m in months]
 
-f = figure(title='Monthly Rainy Days',
+f = figure(title='Monthly Rainy Days',
            x_range=(1990, 2015),
-          x_axis_label='Year')
+          x_axis_label='Year')
 for x in range(0, len(months)):
     f.line(years, monthly_precip_days_vals[x], legend=months_str[x], color=Palette[x])
 show(f)
 
-f = figure(title='Monthly Rainy Days Samples',
+f = figure(title='Monthly Rainy Days Samples',
           x_range=(1990, 2015),
-          x_axis_label='Year',
+          x_axis_label='Year',
           height=300)
 for x in range(0, len(months)):
     f.line(years, monthly_precip_samples[x], legend=months_str[x], color=Palette[x])
@@ -770,69 +770,69 @@
 

Generating the Forecast file

The following code was generates the file that was used throughout the blog post. Please note that I'm retrieving data for other cities to use in a future blog post, only Cary data was used for this post.

-
import pandas as pd
+
import pandas as pd
 from functools import reduce
 import requests
 from datetime import datetime
 
-# Coordinate data from http://itouchmap.com/latlong.html
+# Coordinate data from http://itouchmap.com/latlong.html
 cary_loc = (35.79154,-78.781117)
 nyc_loc = (40.78306,-73.971249)
 seattle_loc = (47.60621,-122.332071)
 binghamton_loc = (42.098687,-75.917974)
 cities = {
-    'cary': cary_loc,
-    'nyc': nyc_loc,
-    'seattle': seattle_loc,
-    'binghamton': binghamton_loc
+    'cary': cary_loc,
+    'nyc': nyc_loc,
+    'seattle': seattle_loc,
+    'binghamton': binghamton_loc
 }
 
-apikey = '' # My super-secret API Key
+apikey = '' # My super-secret API Key
 
 def get_forecast(lat, long, date=None):
-    forecast_base = "https://api.forecast.io/forecast/"
+    forecast_base = "https://api.forecast.io/forecast/"
     if date is None:
-        url = forecast_base + apikey + '/{},{}'.format(lat, long)
+        url = forecast_base + apikey + '/{},{}'.format(lat, long)
     else:
         epoch = int(date.timestamp())
-        url = forecast_base + apikey + '/{},{},{}'.format(lat, long, epoch)
+        url = forecast_base + apikey + '/{},{},{}'.format(lat, long, epoch)
 
     return requests.get(url).json()
 
 years = range(1990,2016)
-# For datetimes, the 12 is for getting the weather at noon.
-# We're doing this over midnight because we're more concerned
-# with what people see, and people don't typically see the weather
-# at midnight.
+# For datetimes, the 12 is for getting the weather at noon.
+# We're doing this over midnight because we're more concerned
+# with what people see, and people don't typically see the weather
+# at midnight.
 dt_indices = [pd.date_range(start=datetime(year, 7, 1, 12),
                           end=datetime(year, 11, 30, 12))
               for year in years]
 dt_merge = reduce(lambda x, y: x.union(y), dt_indices)
 
-# Because we have to pay a little bit to use the API, we use for loops here
-# instead of a comprehension - if something breaks, we want to preserve the
-# data already retrieved
+# Because we have to pay a little bit to use the API, we use for loops here
+# instead of a comprehension - if something breaks, we want to preserve the
+# data already retrieved
 city_forecasts = {}
 for city, loc in cities.items():
-    print("Retrieving data for {} starting at {}".format(city,
-                                                         datetime.now().strftime("%I:%M:%S %p")))
+    print("Retrieving data for {} starting at {}".format(city,
+                                                         datetime.now().strftime("%I:%M:%S %p")))
     for dt in dt_merge:
         try:
             city_forecasts[(city, dt)] = get_forecast(*loc, dt)
         except Exception as e:
             print(e)
             city_forecasts[(city, dt)] = None
-print("End forecast retrieval: {}".format(datetime.now().strftime("%I:%M:%S %p")))
+print("End forecast retrieval: {}".format(datetime.now().strftime("%I:%M:%S %p")))
 
 import pickle
-pickle.dump(city_forecasts, open('city_forecasts.p', 'wb'))
+pickle.dump(city_forecasts, open('city_forecasts.p', 'wb'))
 
-### Output:
-# Retrieving data for binghamton starting at 05:13:42 PM
-# Retrieving data for seattle starting at 05:30:51 PM
-# Retrieving data for nyc starting at 05:48:30 PM
-# Retrieving data for cary starting at 06:08:32 PM
-# End forecast retrieval: 06:25:21 PM
+### Output:
+# Retrieving data for binghamton starting at 05:13:42 PM
+# Retrieving data for seattle starting at 05:30:51 PM
+# Retrieving data for nyc starting at 05:48:30 PM
+# Retrieving data for cary starting at 06:08:32 PM
+# End forecast retrieval: 06:25:21 PM
 
diff --git a/event-studies-and-earnings-releases.html b/event-studies-and-earnings-releases.html new file mode 100644 index 0000000..fc5ebe9 --- /dev/null +++ b/event-studies-and-earnings-releases.html @@ -0,0 +1,5377 @@ + + + + + + + + + + + Event Studies and Earnings Releases - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + + +
+
+
+
+

Event Studies and Earnings Releases

+

Bradlee Speice, Wed 08 June 2016, Blog

+
+
+

+ +earnings, event study

+
+
+
+
+ + + +
+ + + + +
+ + +

+

+
+
+
+
+

Or, being suspicious of market insiders.

+
+

Use the button below to show the code I've used to generate this article. Because there is a significant amount more code involved than most other posts I've written, it's hidden by default to allow people to concentrate on the important bits.

+ +
+
+
+
+
+
In [1]:
+
+
+
from IPython.display import HTML
+
+HTML('''<script>
+code_show=true; 
+function code_toggle() {
+ if (code_show){
+ $('div.input').hide();
+ } else {
+ $('div.input').show();
+ }
+ code_show = !code_show
+} 
+$( document ).ready(code_toggle);
+</script>
+<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>''')
+
+ +
+
+
+ +
+
+ + +
Out[1]:
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+
+
+

The Market Just Knew

I recently saw two examples of stock charts that have kept me thinking for a while. And now that the semester is complete, I finally have enough time to really look at them and give them the treatment they deserve. The first is good old Apple:

+ +
+
+
+
+
+
In [2]:
+
+
+
from secrets import QUANDL_KEY
+import matplotlib.pyplot as plt
+from matplotlib.dates import date2num
+from matplotlib.finance import candlestick_ohlc
+from matplotlib.dates import DateFormatter, WeekdayLocator,\
+    DayLocator, MONDAY
+import quandl
+from datetime import datetime
+import pandas as pd
+%matplotlib inline
+
+def fetch_ticker(ticker, start, end):
+    # Quandl is currently giving me issues with returning
+    # the entire dataset and not slicing server-side.
+    # So instead, we'll do it client-side!
+    q_format = '%Y-%m-%d'
+    ticker_data = quandl.get('YAHOO/' + ticker,
+                             start_date=start.strftime(q_format),
+                             end_date=end.strftime(q_format),
+                             authtoken=QUANDL_KEY)
+    return ticker_data
+
+def ohlc_dataframe(data, ax=None):
+    # Much of this code re-used from:
+    # http://matplotlib.org/examples/pylab_examples/finance_demo.html
+    if ax is None:
+        f, ax = plt.subplots()
+    
+    vals = [(date2num(date), *(data.loc[date]))
+            for date in data.index]
+    candlestick_ohlc(ax, vals)
+    
+    mondays = WeekdayLocator(MONDAY)
+    alldays = DayLocator()
+    weekFormatter = DateFormatter('%b %d')
+    ax.xaxis.set_major_locator(mondays)
+    ax.xaxis.set_minor_locator(alldays)
+    ax.xaxis.set_major_formatter(weekFormatter)
+    return ax
+
+AAPL = fetch_ticker('AAPL', datetime(2016, 3, 1), datetime(2016, 5, 1))
+ax = ohlc_dataframe(AAPL)
+plt.vlines(date2num(datetime(2016, 4, 26, 12)),
+           ax.get_ylim()[0], ax.get_ylim()[1],
+           color='b',
+          label='Earnings Release')
+plt.legend(loc=3)
+plt.title("Apple Price 3/1/2016 - 5/1/2016");
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

The second chart is from Facebook:

+ +
+
+
+
+
+
In [3]:
+
+
+
FB = fetch_ticker('FB', datetime(2016, 3, 1), datetime(2016, 5, 5))
+ax = ohlc_dataframe(FB)
+plt.vlines(date2num(datetime(2016, 4, 27, 12)),
+           ax.get_ylim()[0], ax.get_ylim()[1],
+           color='b', label='Earnings Release')
+plt.title('Facebook Price 3/5/2016 - 5/5/2016')
+plt.legend(loc=2);
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

These two charts demonstrate two very specific phonomena: how the market prepares for earnings releases. Let's look at those charts again, but with some extra information. As we're about the see, the market "knew" in advance that Apple was going to perform poorly. The market expected that Facebook was going to perform poorly, and instead shot the lights out. Let's see that trend in action:

+ +
+
+
+
+
+
In [4]:
+
+
+
def plot_hilo(ax, start, end, data):
+    ax.plot([date2num(start), date2num(end)],
+            [data.loc[start]['High'], data.loc[end]['High']],
+            color='b')
+    ax.plot([date2num(start), date2num(end)],
+            [data.loc[start]['Low'], data.loc[end]['Low']],
+            color='b')
+
+f, axarr = plt.subplots(1, 2)
+
+ax_aapl = axarr[0]
+ax_fb = axarr[1]
+
+# Plot the AAPL trend up and down
+ohlc_dataframe(AAPL, ax=ax_aapl)
+plot_hilo(ax_aapl, datetime(2016, 3, 1), datetime(2016, 4, 15), AAPL)
+plot_hilo(ax_aapl, datetime(2016, 4, 18), datetime(2016, 4, 26), AAPL)
+ax_aapl.vlines(date2num(datetime(2016, 4, 26, 12)),
+               ax_aapl.get_ylim()[0], ax_aapl.get_ylim()[1],
+               color='g', label='Earnings Release')
+ax_aapl.legend(loc=2)
+ax_aapl.set_title('AAPL Price History')
+
+# Plot the FB trend down and up
+ohlc_dataframe(FB, ax=ax_fb)
+plot_hilo(ax_fb, datetime(2016, 3, 30), datetime(2016, 4, 27), FB)
+plot_hilo(ax_fb, datetime(2016, 4, 28), datetime(2016, 5, 5), FB)
+ax_fb.vlines(date2num(datetime(2016, 4, 27, 12)),
+             ax_fb.get_ylim()[0], ax_fb.get_ylim()[1],
+             color='g', label='Earnings Release')
+ax_fb.legend(loc=2)
+ax_fb.set_title('FB Price History')
+
+f.set_size_inches(18, 6)
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

As we can see above, the market broke a prevailing trend on Apple in order to go down, and ultimately predict the earnings release. For Facebook, the opposite happened. While the trend was down, the earnings were fantastic and the market corrected itself much higher.

+ +
+
+
+
+
+
+
+
+

Formulating the Question

While these are two specific examples, there are plenty of other examples you could cite one way or another. Even if the preponderance of evidence shows that the market correctly predicts earnings releases, we need not accuse people of collusion; for a company like Apple with many suppliers we can generally forecast how Apple has done based on those same suppliers.

+

The question then, is this: how well does the market predict the earnings releases? It's an incredibly broad question that I want to disect in a couple of different ways:

+
    +
  1. Given a stock that has been trending down over the past N days before an earnings release, how likely does it continue downward after the release?
  2. +
  3. Given a stock trending up, how likely does it continue up?
  4. +
  5. Is there a difference in accuracy between large- and small-cap stocks?
  6. +
  7. How often, and for how long, do markets trend before an earnings release?
  8. +
+

I want to especially thank Alejandro Saltiel for helping me retrieve the data. He's great. And now for all of the interesting bits.

+ +
+
+
+
+
+
+
+
+

Event Studies

Before we go too much further, I want to introduce the actual event study. Each chart intends to capture a lot of information and present an easy-to-understand pattern:

+ +
+
+
+
+
+
In [5]:
+
+
+
import numpy as np
+import pandas as pd
+from pandas.tseries.holiday import USFederalHolidayCalendar
+from pandas.tseries.offsets import CustomBusinessDay
+from datetime import datetime, timedelta
+
+# If you remove rules, it removes them from *all* calendars
+# To ensure we don't pop rules we don't want to, first make
+# sure to fully copy the object
+trade_calendar = USFederalHolidayCalendar()
+trade_calendar.rules.pop(6) # Remove Columbus day
+trade_calendar.rules.pop(7) # Remove Veteran's day
+TradeDay = lambda days: CustomBusinessDay(days, calendar=trade_calendar)
+
+def plot_study(array):
+    # Given a 2-d array, we assume the event happens at index `lookback`,
+    # and create all of our summary statistics from there.
+    lookback = int((array.shape[1] - 1) / 2)
+    norm_factor = np.repeat(array[:,lookback].reshape(-1, 1), array.shape[1], axis=1)
+    centered_data = array / norm_factor - 1
+    lookforward = centered_data.shape[1] - lookback
+    means = centered_data.mean(axis=0)
+    lookforward_data = centered_data[:,lookforward:]
+    std_dev = np.hstack([0, lookforward_data.std(axis=0)])
+    maxes = lookforward_data.max(axis=0)
+    mins = lookforward_data.min(axis=0)
+    
+    f, axarr = plt.subplots(1, 2)
+    range_begin = -lookback
+    range_end = lookforward
+    axarr[0].plot(range(range_begin, range_end), means)
+    axarr[1].plot(range(range_begin, range_end), means)
+    axarr[0].fill_between(range(0, range_end),
+                     means[-lookforward:] + std_dev,
+                     means[-lookforward:] - std_dev,
+                    alpha=.5, label="$\pm$ 1 s.d.")
+    axarr[1].fill_between(range(0, range_end),
+                     means[-lookforward:] + std_dev,
+                     means[-lookforward:] - std_dev,
+                    alpha=.5, label="$\pm$ 1 s.d.")
+    
+    max_err = maxes - means[-lookforward+1:]
+    min_err = means[-lookforward+1:] - mins
+    axarr[0].errorbar(range(1, range_end),
+                  means[-lookforward+1:],
+                  yerr=[min_err, max_err], label='Max & Min')
+    axarr[0].legend(loc=2)
+    axarr[1].legend(loc=2)
+    
+    axarr[0].set_xlim((-lookback-1, lookback+1))
+    axarr[1].set_xlim((-lookback-1, lookback+1))
+    
+def plot_study_small(array):
+    # Given a 2-d array, we assume the event happens at index `lookback`,
+    # and create all of our summary statistics from there.
+    lookback = int((array.shape[1] - 1) / 2)
+    norm_factor = np.repeat(array[:,lookback].reshape(-1, 1), array.shape[1], axis=1)
+    centered_data = array / norm_factor - 1
+    lookforward = centered_data.shape[1] - lookback
+    means = centered_data.mean(axis=0)
+    lookforward_data = centered_data[:,lookforward:]
+    std_dev = np.hstack([0, lookforward_data.std(axis=0)])
+    maxes = lookforward_data.max(axis=0)
+    mins = lookforward_data.min(axis=0)
+    
+    range_begin = -lookback
+    range_end = lookforward
+    plt.plot(range(range_begin, range_end), means)
+    plt.fill_between(range(0, range_end),
+                     means[-lookforward:] + std_dev,
+                     means[-lookforward:] - std_dev,
+                    alpha=.5, label="$\pm$ 1 s.d.")
+    
+    max_err = maxes - means[-lookforward+1:]
+    min_err = means[-lookforward+1:] - mins
+    plt.errorbar(range(1, range_end),
+                  means[-lookforward+1:],
+                  yerr=[min_err, max_err], label='Max & Min')
+    plt.legend(loc=2)
+    plt.xlim((-lookback-1, lookback+1))
+    
+def fetch_event_data(ticker, events, horizon=5):
+    # Use horizon+1 to account for including the day of the event,
+    # and half-open interval - that is, for a horizon of 5,
+    # we should be including 11 events. Additionally, using the
+    # CustomBusinessDay means we automatically handle issues if
+    # for example a company reports Friday afternoon - the date
+    # calculator will turn this into a "Saturday" release, but
+    # we effectively shift that to Monday with the logic below.
+    td_back = TradeDay(horizon+1)
+    td_forward = TradeDay(horizon+1)
+    
+    start_date = min(events) - td_back
+    end_date = max(events) + td_forward
+    total_data = fetch_ticker(ticker, start_date, end_date)
+    event_data = [total_data.ix[event-td_back:event+td_forward]\
+                      [0:horizon*2+1]\
+                      ['Adjusted Close']
+                  for event in events]
+    return np.array(event_data)
+
+# Generate a couple of random events
+
+event_dates = [datetime(2016, 5, 27) - timedelta(days=1) - TradeDay(x*20) for x in range(1, 40)]
+data = fetch_event_data('CELG', event_dates)
+plot_study_small(data)
+plt.legend(loc=3)
+plt.gcf().set_size_inches(12, 6);
+
+
+plt.annotate('Mean price for days leading up to each event',
+             (-5, -.01), (-4.5, .025),
+             arrowprops=dict(facecolor='black', shrink=0.05))
+plt.annotate('', (-.1, .005), (-.5, .02),
+             arrowprops={'facecolor': 'black', 'shrink': .05})
+plt.annotate('$\pm$ 1 std. dev. each day', (5, .055), (2.5, .085),
+            arrowprops={'facecolor': 'black', 'shrink': .05})
+plt.annotate('Min/Max each day', (.9, -.07), (-1, -.1),
+            arrowprops={'facecolor': 'black', 'shrink': .05});
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

And as a quick textual explanation as well:

+
    +
  • The blue line represents the mean price for each day, represented as a percentage of the price on the '0-day'. For example, if we defined an 'event' as whenever the stock price dropped for three days, we would see a decreasing blue line to the left of the 0-day.

    +
  • +
  • The blue shaded area represents one standard deviation above and below the mean price for each day following an event. This is intended to give us an idea of what the stock price does in general following an event.

    +
  • +
  • The green bars are the minimum and maximum price for each day following an event. This instructs us as to how much it's possible for the stock to move.

    +
  • +
+ +
+
+
+
+
+
+
+
+

Event Type 1: Trending down over the past N days

The first type of event I want to study is how stocks perform when they've been trending down over the past couple of days prior to a release. However, we need to clarify what exactly is meant by "trending down." To do so, we'll use the following metric: the midpoint between each day's opening and closing price goes down over a period of N days.

+

It's probably helpful to have an example:

+ +
+
+
+
+
+
In [6]:
+
+
+
f, axarr = plt.subplots(1, 2)
+f.set_size_inches(18, 6)
+
+FB_plot = axarr[0]
+ohlc_dataframe(FB[datetime(2016, 4, 18):], FB_plot)
+
+FB_truncated = FB[datetime(2016, 4, 18):datetime(2016, 4, 27)]
+midpoint = FB_truncated['Open']/2 + FB_truncated['Close']/2
+FB_plot.plot(FB_truncated.index, midpoint, label='Midpoint')
+FB_plot.vlines(date2num(datetime(2016, 4, 27, 12)),
+               ax_fb.get_ylim()[0], ax_fb.get_ylim()[1],
+               color='g', label='Earnings Release')
+FB_plot.legend(loc=2)
+FB_plot.set_title('FB Midpoint Plot')
+
+AAPL_plot = axarr[1]
+ohlc_dataframe(AAPL[datetime(2016, 4, 10):], AAPL_plot)
+AAPL_truncated = AAPL[datetime(2016, 4, 10):datetime(2016, 4, 26)]
+midpoint = AAPL_truncated['Open']/2 + AAPL_truncated['Close']/2
+AAPL_plot.plot(AAPL_truncated.index, midpoint, label='Midpoint')
+AAPL_plot.vlines(date2num(datetime(2016, 4, 26, 12)),
+                 ax_aapl.get_ylim()[0], ax_aapl.get_ylim()[1],
+                 color='g', label='Earnings Release')
+AAPL_plot.legend(loc=3)
+AAPL_plot.set_title('AAPL Midpoint Plot');
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Given these charts, we can see that FB was trending down for the four days preceding the earnings release, and AAPL was trending down for a whopping 8 days (we don't count the peak day). This will define the methodology that we will use for the study.

+

So what are the results? For a given horizon, how well does the market actually perform?

+ +
+
+
+
+
+
In [7]:
+
+
+
# Read in the events for each stock;
+# The file was created using the first code block in the Appendix
+import yaml
+from dateutil.parser import parse
+from progressbar import ProgressBar
+
+data_str = open('earnings_dates.yaml', 'r').read()
+# Need to remove invalid lines
+filtered = filter(lambda x: '{' not in x, data_str.split('\n'))
+earnings_data = yaml.load('\n'.join(filtered))
+
+# Convert our earnings data into a list of (ticker, date) pairs
+# to make it easy to work with.
+# This is horribly inefficient, but should get us what we need
+ticker_dates = []
+for ticker, date_list in earnings_data.items():
+    for iso_str in date_list:
+        ticker_dates.append((ticker, parse(iso_str)))
+
+def does_trend_down(ticker, event, horizon):
+    # Figure out if the `event` has a downtrend for
+    # the `horizon` days preceding it
+    # As an interpretation note: it is assumed that
+    # the closing price of day `event` is the reference
+    # point, and we want `horizon` days before that.
+    # The price_data.hdf was created in the second appendix code block
+    try:
+        ticker_data = pd.read_hdf('price_data.hdf', ticker)
+        data = ticker_data[event-TradeDay(horizon):event]
+        midpoints = data['Open']/2 + data['Close']/2
+
+        # Shift dates one forward into the future and subtract
+        # Effectively: do we trend down over all days?
+        elems = midpoints - midpoints.shift(1)
+        return len(elems)-1 == len(elems.dropna()[elems <= 0])
+    except KeyError:
+        # If the stock doesn't exist, it doesn't qualify as trending down
+        # Mostly this is here to make sure the entire analysis doesn't 
+        # blow up if there were issues in data retrieval
+        return False
+
+def study_trend(horizon, trend_function):
+    five_day_events = np.zeros((1, horizon*2 + 1))
+    invalid_events = []
+    for ticker, event in ProgressBar()(ticker_dates):
+        if trend_function(ticker, event, horizon):
+            ticker_data = pd.read_hdf('price_data.hdf', ticker)
+            event_data = ticker_data[event-TradeDay(horizon):event+TradeDay(horizon)]['Close']
+
+            try:
+                five_day_events = np.vstack([five_day_events, event_data])
+            except ValueError:
+                # Sometimes we don't get exactly the right number of values due to calendar
+                # issues. I've fixed most everything I can, and the few issues that are left
+                # I assume don't systemically bias the results (i.e. data could be missing
+                # because it doesn't exist, etc.). After running through, ~1% of events get
+                # discarded this way
+                invalid_events.append((ticker, event))
+            
+
+    # Remove our initial zero row
+    five_day_events = five_day_events[1:,:]
+    plot_study(five_day_events)
+    plt.gcf().suptitle('Action over {} days: {} events'
+                       .format(horizon,five_day_events.shape[0]))
+    plt.gcf().set_size_inches(18, 6)
+    
+# Start with a 5 day study
+study_trend(5, does_trend_down)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:21:38 Time: 0:21:38
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

When a stock has been trending down for 5 days, once the earnings are announced it really doesn't move on average. However, the variability is incredible. This implies two important things:

+
    +
  1. The market is just as often wrong about an earnings announcement before it happens as it is correct
  2. +
  3. The incredible width of the min/max bars and standard deviation area tell us that the market reacts violently after the earnings are released.
  4. +
+

Let's repeat the same study, but over a time horizon of 8 days and 3 days. Presumably if a stock has been going down for 8 days at a time before the earnings, the market should be more accurate.

+ +
+
+
+
+
+
In [8]:
+
+
+
# 8 day study next
+study_trend(8, does_trend_down)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:29 Time: 0:20:29
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

However, looking only at stocks that trended down for 8 days prior to a release, the same pattern emerges: on average, the stock doesn't move, but the market reaction is often incredibly violent.

+ +
+
+
+
+
+
In [9]:
+
+
+
# 3 day study after that
+study_trend(3, does_trend_down)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:26 Time: 0:26:26
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Finally, when we look at a 3-day horizon, we start getting some incredible outliers. Stocks have a potential to move over ~300% up, and the standard deviation width is again, incredible. The results for a 3-day horizon follow the same pattern we've seen in the 5- and 8-day horizons.

+ +
+
+
+
+
+
+
+
+

Event Type 2: Trending up for N days

We're now going to repeat the analysis, but do it for uptrends instead. That is, instead of looking at stocks that have been trending down over the past number of days, we focus only on stocks that have been trending up.

+ +
+
+
+
+
+
In [10]:
+
+
+
def does_trend_up(ticker, event, horizon):
+    # Figure out if the `event` has an uptrend for
+    # the `horizon` days preceding it
+    # As an interpretation note: it is assumed that
+    # the closing price of day `event` is the reference
+    # point, and we want `horizon` days before that.
+    # The price_data.hdf was created in the second appendix code block
+    try:
+        ticker_data = pd.read_hdf('price_data.hdf', ticker)
+        data = ticker_data[event-TradeDay(horizon):event]
+        midpoints = data['Open']/2 + data['Close']/2
+
+        # Shift dates one forward into the future and subtract
+        # Effectively: do we trend down over all days?
+        elems = midpoints - midpoints.shift(1)
+        return len(elems)-1 == len(elems.dropna()[elems >= 0])
+    except KeyError:
+        # If the stock doesn't exist, it doesn't qualify as trending down
+        # Mostly this is here to make sure the entire analysis doesn't 
+        # blow up if there were issues in data retrieval
+        return False
+
+study_trend(5, does_trend_up)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:22:51 Time: 0:22:51
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

The patterns here are very similar. With the exception of noting that stocks can go to nearly 400% after an earnings announcement (most likely this included a takeover announcement, etc.), we still see large min/max bars and wide standard deviation of returns.

+

We'll repeat the pattern for stocks going up for both 8 and 3 days straight, but at this point, the results should be very predictable:

+ +
+
+
+
+
+
In [11]:
+
+
+
study_trend(8, does_trend_up)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:51 Time: 0:20:51
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
In [12]:
+
+
+
study_trend(3, does_trend_up)
+
+ +
+
+
+ +
+
+ + +
+
+
100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:56 Time: 0:26:56
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Conclusion and Summary

I guess the most important thing to summarize with is this: looking at the entire market, stock performance prior to an earnings release has no bearing on the stock's performance. Honestly: given the huge variability of returns after an earnings release, even when the stock has been trending for a long time, you're best off divesting before an earnings release and letting the market sort itself out.

+

However, there is a big caveat. These results are taken when we look at the entire market. So while we can say that the market as a whole knows nothing and just reacts violently, I want to take a closer look into this data. Does the market typically perform poorly on large-cap/high liquidity stocks? Do smaller companies have investors that know them better and can thus predict performance better? Are specific market sectors better at prediction? Presumably technology stocks are more volatile than the industrials.

+

So there are some more interesting questions I still want to ask with this data. Knowing that the hard work of data processing is largely already done, it should be fairly simple to continue this analysis and get much more refined with it. Until next time.

+ +
+
+
+
+
+
+
+
+

Appendix

Export event data for Russell 3000 companies:

+
import pandas as pd
+from html.parser import HTMLParser
+from datetime import datetime, timedelta
+import requests
+import re
+from dateutil import parser
+import progressbar
+from concurrent import futures
+import yaml
+
+class EarningsParser(HTMLParser):
+    store_dates = False
+    earnings_offset = None
+    dates = []
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.dates = []
+
+    def handle_starttag(self, tag, attrs):
+        if tag == 'table':
+            self.store_dates = True
+
+    def handle_data(self, data):
+        if self.store_dates:
+            match = re.match(r'\d+/\d+/\d+', data)
+            if match:
+                self.dates.append(match.group(0))
+
+        # If a company reports before the bell, record the earnings date
+        # being at midnight the day before. Ex: WMT reports 5/19/2016,
+        # but we want the reference point to be the closing price on 5/18/2016
+        if 'After Close' in data:
+            self.earnings_offset = timedelta(days=0)
+        elif 'Before Open' in data:
+            self.earnings_offset = timedelta(days=-1)
+
+    def handle_endtag(self, tag):
+        if tag == 'table':
+            self.store_dates = False
+
+def earnings_releases(ticker):
+    #print("Looking up ticker {}".format(ticker))
+    user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) '\
+        'Gecko/20100101 Firefox/46.0'
+    headers = {'user-agent': user_agent}
+    base_url = 'http://www.streetinsider.com/ec_earnings.php?q={}'\
+        .format(ticker)
+    e = EarningsParser()
+    s = requests.Session()
+    a = requests.adapters.HTTPAdapter(max_retries=0)
+    s.mount('http://', a)
+    e.feed(str(s.get(base_url, headers=headers).content))
+
+    if e.earnings_offset is not None:
+        dates = map(lambda x: parser.parse(x) + e.earnings_offset, e.dates)
+        past = filter(lambda x: x < datetime.now(), dates)
+        return list(map(lambda d: d.isoformat(), past))
+
+# Use a Russell-3000 ETF tracker (ticker IWV) to get a list of holdings
+r3000 = pd.read_csv('https://www.ishares.com/us/products/239714/'
+                    'ishares-russell-3000-etf/1449138789749.ajax?'
+                    'fileType=csv&fileName=IWV_holdings&dataType=fund',
+                    header=10)
+r3000_equities = r3000[(r3000['Exchange'] == 'NASDAQ') |
+                       (r3000['Exchange'] == 'New York Stock Exchange Inc.')]
+
+dates_file = open('earnings_dates.yaml', 'w')
+
+with futures.ThreadPoolExecutor(max_workers=8) as pool:
+    fs = {pool.submit(earnings_releases, r3000_equities.ix[t]['Ticker']): t
+          for t in r3000_equities.index}
+    pbar = progressbar.ProgressBar(term_width=80,
+                                   max_value=r3000_equities.index.max())
+
+    for future in futures.as_completed(fs):
+        i = fs[future]
+        pbar.update(i)
+        dates_file.write(yaml.dump({r3000_equities.ix[i]['Ticker']:
+            future.result()}))
+
+

Downloading stock price data needed for the event studies:

+
from secrets import QUANDL_KEY
+import pandas as pd
+import yaml
+from dateutil.parser import parse
+from datetime import timedelta
+import quandl
+from progressbar import ProgressBar
+
+def fetch_ticker(ticker, start, end):
+    # Quandl is currently giving me issues with returning
+    # the entire dataset and not slicing server-side.
+    # So instead, we'll do it client-side!
+    q_format = '%Y-%m-%d'
+    ticker_data = quandl.get('YAHOO/' + ticker,
+                             start_date=start.strftime(q_format),
+                             end_date=end.strftime(q_format),
+                             authtoken=QUANDL_KEY)
+    return ticker_data
+
+data_str = open('earnings_dates.yaml', 'r').read()
+# Need to remove invalid lines
+filtered = filter(lambda x: '{' not in x, data_str.split('\n'))
+earnings_data = yaml.load('\n'.join(filtered))
+
+# Get the first 1500 keys - split up into two statements
+# because of Quandl rate limits
+tickers = list(earnings_data.keys())
+
+price_dict = {}
+invalid_tickers = []
+for ticker in ProgressBar()(tickers[0:1500]):
+    try:
+        # Replace '.' with '-' in name for some tickers
+        fixed = ticker.replace('.', '-')
+        event_strs = earnings_data[ticker]
+        events = [parse(event) for event in event_strs]
+        td = timedelta(days=20)
+        price_dict[ticker] = fetch_ticker(fixed,
+            min(events)-td, max(events)+td)
+    except quandl.NotFoundError:
+        invalid_tickers.append(ticker)
+
+# Execute this after 10 minutes have passed
+for ticker in ProgressBar()(tickers[1500:]):
+    try:
+        # Replace '.' with '-' in name for some tickers
+        fixed = ticker.replace('.', '-')
+        event_strs = earnings_data[ticker]
+        events = [parse(event) for event in event_strs]
+        td = timedelta(days=20)
+        price_dict[ticker] = fetch_ticker(fixed,
+            min(events)-td, max(events)+td)
+    except quandl.NotFoundError:
+        invalid_tickers.append(ticker)
+
+prices_store = pd.HDFStore('price_data.hdf')
+for ticker, prices in price_dict.items():
+    prices_store[ticker] = prices
+
+ +
+
+

+ + + + + +
+
+ + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index f436db0..90913f7 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,5 +1,5241 @@ -Bradlee Speicehttps://bspeice.github.io/2016-05-15T00:00:00-04:00The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> +Bradlee Speicehttps://bspeice.github.io/2016-06-08T00:00:00-04:00Event Studies and Earnings Releases2016-06-08T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-06-08:event-studies-and-earnings-releases.html<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/3.0.0/jquery.min.js"></script> + +<p> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Or, being suspicious of market insiders.</p> +<hr> +<p>Use the button below to show the code I've used to generate this article. Because there is a significant amount more code involved than most other posts I've written, it's hidden by default to allow people to concentrate on the important bits.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[1]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">HTML</span> + +<span class="n">HTML</span><span class="p">(</span><span class="s">&#39;&#39;&#39;&lt;script&gt;</span> +<span class="s">code_show=true; </span> +<span class="s">function code_toggle() {</span> +<span class="s"> if (code_show){</span> +<span class="s"> $(&#39;div.input&#39;).hide();</span> +<span class="s"> } else {</span> +<span class="s"> $(&#39;div.input&#39;).show();</span> +<span class="s"> }</span> +<span class="s"> code_show = !code_show</span> +<span class="s">} </span> +<span class="s">$( document ).ready(code_toggle);</span> +<span class="s">&lt;/script&gt;</span> +<span class="s">&lt;form action=&quot;javascript:code_toggle()&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;Click here to toggle on/off the raw code.&quot;&gt;&lt;/form&gt;&#39;&#39;&#39;</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt output_prompt">Out[1]:</div> + +<div class="output_html rendered_html output_subarea output_execute_result"> +<script> +code_show=true; +function code_toggle() { + if (code_show){ + $('div.input').hide(); + } else { + $('div.input').show(); + } + code_show = !code_show +} +$( document ).ready(code_toggle); +</script> +<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="The-Market-Just-Knew">The Market Just Knew<a class="anchor-link" href="#The-Market-Just-Knew">&#182;</a></h1><p>I recently saw two examples of stock charts that have kept me thinking for a while. And now that the semester is complete, I finally have enough time to really look at them and give them the treatment they deserve. The first is good old Apple:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[2]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">secrets</span> <span class="k">import</span> <span class="n">QUANDL_KEY</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="kn">from</span> <span class="nn">matplotlib.dates</span> <span class="k">import</span> <span class="n">date2num</span> +<span class="kn">from</span> <span class="nn">matplotlib.finance</span> <span class="k">import</span> <span class="n">candlestick_ohlc</span> +<span class="kn">from</span> <span class="nn">matplotlib.dates</span> <span class="k">import</span> <span class="n">DateFormatter</span><span class="p">,</span> <span class="n">WeekdayLocator</span><span class="p">,</span>\ + <span class="n">DayLocator</span><span class="p">,</span> <span class="n">MONDAY</span> +<span class="kn">import</span> <span class="nn">quandl</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="o">%</span><span class="k">matplotlib</span> inline + +<span class="k">def</span> <span class="nf">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span> + <span class="c"># Quandl is currently giving me issues with returning</span> + <span class="c"># the entire dataset and not slicing server-side.</span> + <span class="c"># So instead, we&#39;ll do it client-side!</span> + <span class="n">q_format</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-%d&#39;</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/&#39;</span> <span class="o">+</span> <span class="n">ticker</span><span class="p">,</span> + <span class="n">start_date</span><span class="o">=</span><span class="n">start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">end_date</span><span class="o">=</span><span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">authtoken</span><span class="o">=</span><span class="n">QUANDL_KEY</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ticker_data</span> + +<span class="k">def</span> <span class="nf">ohlc_dataframe</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="k">None</span><span class="p">):</span> + <span class="c"># Much of this code re-used from:</span> + <span class="c"># http://matplotlib.org/examples/pylab_examples/finance_demo.html</span> + <span class="k">if</span> <span class="n">ax</span> <span class="ow">is</span> <span class="k">None</span><span class="p">:</span> + <span class="n">f</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span> + + <span class="n">vals</span> <span class="o">=</span> <span class="p">[(</span><span class="n">date2num</span><span class="p">(</span><span class="n">date</span><span class="p">),</span> <span class="o">*</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">date</span><span class="p">]))</span> + <span class="k">for</span> <span class="n">date</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">index</span><span class="p">]</span> + <span class="n">candlestick_ohlc</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">vals</span><span class="p">)</span> + + <span class="n">mondays</span> <span class="o">=</span> <span class="n">WeekdayLocator</span><span class="p">(</span><span class="n">MONDAY</span><span class="p">)</span> + <span class="n">alldays</span> <span class="o">=</span> <span class="n">DayLocator</span><span class="p">()</span> + <span class="n">weekFormatter</span> <span class="o">=</span> <span class="n">DateFormatter</span><span class="p">(</span><span class="s">&#39;%b %d&#39;</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_major_locator</span><span class="p">(</span><span class="n">mondays</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_minor_locator</span><span class="p">(</span><span class="n">alldays</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_major_formatter</span><span class="p">(</span><span class="n">weekFormatter</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ax</span> + +<span class="n">AAPL</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="s">&#39;AAPL&#39;</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> +<span class="n">ax</span> <span class="o">=</span> <span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">,</span> + <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&quot;Apple Price 3/1/2016 - 5/1/2016&quot;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +rgAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>The second chart is from Facebook:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[3]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">FB</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="s">&#39;FB&#39;</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span> +<span class="n">ax</span> <span class="o">=</span> <span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Facebook Price 3/5/2016 - 5/5/2016&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +g+z11183M7Ott97aHn/8cTMzW7NmjT333HMp12HOnDn2pS99yczMPvnkE7vqqqts0003tXfffdfM +zFatWmVjx461++67z8zMFixYYGPHjrX33nvPzMzq6uqsqanJzMzuuOMO22GHHWzp0qXW2dlpF198 +sR1wwAFdy7r55putra3NOjs77corr7Ta2lpbv369mZntv//+dtNNN5mZWUdHhz399NNZLT9Zqe9P +rjR1221mzy5WGCkR13vFSPl59dfxxx/PmDFjGD16NGPGjKGpqQmA7bffnsMOO4whQ4YwduxYZsyY +0aM2ed5557HNNtuw6aabdiurqalh1KhRHHPMMTz//PNpl51u3D/84Q+ceeaZ7Ljjjmy22WY0NDR0 +O7IYOnQoL730EuvWraO6upovfOELaZfx5JNPMmbMGDbffHN+8IMfcNNNN7HFFsFNOm+66SaOPvpo +pkyZAsBhhx3GXnvtxb333ttjPtdccw0XXnghkydPZtCgQVxwwQU8//zzrFy5EoBp06YxatQoBg0a +xIwZM1i/fj1Lly7tive1117jH//4B8OGDWOfffbp8/Kdy4syvHK5LBN78Hua+6u/5s2bx+rVq2lr +a2P16tWcddZZALzzzjtMnTqVcePGMWrUKE499VTee++9btOOG9fz2d41NTVd74cNG0Z7e3vaZacb +9+233+7WbBN9D3D77bdzzz33MGHCBA455BCeeir97fL3339/Vq9ezZo1azj22GO72tsB3nzzTW69 +9VbGjBnT9eP2+OOP09LS0mM+b775Juedd17XuGPHjkUSq1atAqCxsZGdd96Z0aNHM3r0aNauXdu1 +vZqamli6dCk77rgj++67b9cJ3HTL//vf/552fZyrNH7ytB8sza/CRRddxKBBg3jppZeorq5m3rx5 +/Ou//mu3cZTLoUIvtt56a956662uzytWrOi2rC9+8YvccccddHZ28qtf/YqTTz65W3t3KsOGDePq +q69mu+2246yzzmL33Xdn/PjxnH766VxzzTUZYxo/fjw/+tGPmDp1ao9hixYt4vLLL+eRRx5h5513 +BmDMmDFd23b77bdn7tzgiYu33347J510EqtXr+7T8p2rVGVZYy9V69atY/jw4YwYMYJVq1Zx+eWX +D9iyTz75ZGbPns2rr77KBx98wE9/+tOuYRs2bGDu3LmsXbuWwYMHM2LEiKx75IwePZpvfetbzJoV +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>These two charts demonstrate two very specific phonomena: how the market prepares for earnings releases. Let's look at those charts again, but with some extra information. As we're about the see, the market "knew" in advance that Apple was going to perform poorly. The market expected that Facebook was going to perform poorly, and instead shot the lights out. Let's see that trend in action:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[4]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">plot_hilo</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> + <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="n">date2num</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">date2num</span><span class="p">(</span><span class="n">end</span><span class="p">)],</span> + <span class="p">[</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">start</span><span class="p">][</span><span class="s">&#39;High&#39;</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">end</span><span class="p">][</span><span class="s">&#39;High&#39;</span><span class="p">]],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="n">date2num</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">date2num</span><span class="p">(</span><span class="n">end</span><span class="p">)],</span> + <span class="p">[</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">start</span><span class="p">][</span><span class="s">&#39;Low&#39;</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">end</span><span class="p">][</span><span class="s">&#39;Low&#39;</span><span class="p">]],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">)</span> + +<span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + +<span class="n">ax_aapl</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> +<span class="n">ax_fb</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> + +<span class="c"># Plot the AAPL trend up and down</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax_aapl</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_aapl</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">15</span><span class="p">),</span> <span class="n">AAPL</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_aapl</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">),</span> <span class="n">AAPL</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;AAPL Price History&#39;</span><span class="p">)</span> + +<span class="c"># Plot the FB trend down and up</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax_fb</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_fb</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">),</span> <span class="n">FB</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_fb</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">28</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">FB</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;FB Price History&#39;</span><span class="p">)</span> + +<span class="n">f</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +qlShcePGzJkzJ8vXjxs3juOOO45q1apx5plnsnbt2n37brrpJo444ggqVapE8+bNmTt37r598+fP +p3nz5lSqVImaNWsyaNCgfF1fRESksNJ4ROMREZFAOOcC+fKXPlBW26NFQkKC++ijjzLdt3LlSvfh +hx+63bt3uz/++MO1a9fODRgwYL/XNm7c2K1fv97t2LFj37YWLVq45ORkt3HjRnfssce60aNHO+ec +mz17tqtdu/Z+r8/q2FmzZrmaNWu6ZcuWuX/++cddcsklrlixYm7VqlXOOedq1qzpPv/8c+ecc5s2 +bXLffPNNpvcwYcIEd+qppzrnnNuzZ4978sknXenSpd3vv//unHNu/fr1rlq1au7dd991zjn34Ycf +umrVqrk//vjDOedcYmKiGzt2rHPOuRkzZrh69eq55cuXu9TUVHffffe5U045Zd+1XnjhBbdx40aX +mprqRo0a5eLj493OnTudc861atXKTZkyxTnn3LZt29xXX32Vq+tnFO3/nkSkcGBYeH/WhH52BfYe +XZS+NB7ReETjEREJh3CPBaJBVuMRzUTIh27dulG1alWqVKlC1apVGTt2LABHHXUUHTt2pESJElSr +Vo0BAwYckJXu378/hx12GKVLl95vW1xcHJUrV6Zr1658++23WV47q2NfffVV+vbtS4MGDShTpgzD +hg1LGxwBUKpUKb7//nu2bt1KpUqVOOmkk7K8xhdffEHVqlU55JBDuPXWW5kyZQrVq1cHYMqUKXTp +0oVOnToB0LFjR5o1a8Y777xzwHlGjx7N4MGDqV+/PsWKFeP222/n22+/Zd26dQD07t2bypUrU6xY +MQYMGMDOnTtZvnz5vnhXrlzJn3/+SdmyZTn55JPzfH0REZHCTOMRjUdERIIQkzURbLiF5TxuaObT +AHMyc+bMTNcg/vbbb/Tv35/PPvuMv//+m9TUVKpWrbrfMbVq1TrgdXFxcft+XbZsWX799dcsr53V +sRs2bKB58+b79qWfdggwffp07rnnHm677TYaNWrEiBEjaNmyZabXaNWqFZ9++inbt2/nyiuv5NNP +P6Vnz54ArFmzhldeeYU333wT8DNZ9uzZQ8eOHQ84z5o1a+jfvz8DBw7cd6yZsX79emrXrs3IkSMZ +N27cvnvYunUrf/zxBwBjx47lzjvvpEGDBhx55JHcdddddOnSJcvrd+jQIcs/MxERkUgIx3gkv2MR +0HhE4xERkWDEZBLhYN5ww3J9l/n177jjDooVK8b3339PpUqVmDlzJjfeeON+x5iFJwGSUc2aNfnl +l1/2/X7t2rX7Xatp06bMmDGD1NRUnnjiCXr16rXfesDMlC1blqeffpojjzySK6+8kkaNGlG7dm0u +u+wyRo8enWNMtWvX5r///S8XXXTRAfvmzp3LQw89xCeffMJxxx0HQNWqVff92R511FFMnToV8AOO +nj178tdff+Xp+iIiIpGk8ciBNB4RESn8tJwhjLZu3Ur58uWpUKEC69ev56GHHiqwa/fq1Yvx48fz +448/sn37du699959+3bv3s3UqVPZsmULxYsXp0KFCrmuxFylShWuvvpqhg8fDsAll1zCm2++yfvv +v8/evXvZsWMHc+bMYcOGDQe89rrrruP+++/nhx9+AGDz5s1MmzYN8H9WJUuWpFq1auzatYu7776b +rVu37nvtCy+8sO8pQKVKlTAzihUrlqfri4iIFEUaj+xP4xERkfBSEiEfunbtSsWKFfd99ejRA4Ch +Q4eycOHCfesD07anySzrn5cnAdkd27lzZ/r160f79u2pX78+rVq1Ati31nHy5MnUrVuXypUr89xz +z+3LqudG//79mTVrFkuXLqVWrVrMnDmT+++/n0MPPZQ6deowcuRI9u7de0CM3bp14/bbb+fCCy+k +cuXKNGzYkHfffReATp060alTJ+rXr0/dunUpW7bsflMe33333X3VmwcMGMDLL79M6dKlc7y+iIhI +UaHxiMYjIiJBsKymwkX8wmYus2ubWZbT8yT3fvzxR0488UR27txJsWJFN1ekf08iUhBsuIV1anvo +Z1dk5pvLfjQeiSyNRzz9exIp/NLGAjt2QMmSkMuJVlEtq/FI0f1pXgjNmDGDXbt2sXHjRm677TbO +OeecIv2GLSIiIgVP4xERKcqefBI6dICffw46ksjRT/RCZPTo0dSoUYN69epRsmRJnn766aBDEhER +kSJG4xERKcoGDICu8fM5+WQYOxYK4ySkmOzOIJmbNWtW0CGIiIhIEafxiIgUZcWLw6Bj36bznc25 +9FJ4/XUYMwbi44OOLHw0E0FEREREREQkjE44Ab76Cho3hpNOglBTmEJBSQQRERERERGRMCtVCu65 +B2bMgDvugEsugY0bg47q4CmJICIiIiIiIhIhLVvCt99ClSrQsCG8/37QER0cJRFEREREREREIqhs +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 +wqAjyClHHQUzZ8Jrr8Hxx8N//hN0RMFTEkFERERERESkErvsAsXF0KqV394wY0bQEQWrTtABiIiI +iIiIiGSyunVh2DBfePG446BTp32DDikwWokgIiIiIiIiEodevWDqVGjbNnc/SufuyEVERCRrmNkI +Mysxs7lljjUyswlmtsjM3jSzhmUu28/MpprZfDP7t5nVCyZyEREJm913h2uvPTHoMAKjJIKIiIhk +g5HA0eWOXQ1Mcs61BN4GrgEws9rAE8C5zrl9gAJgffpCFRERCS8lEURERCTjOeemAKvKHT4BGB37 +fjTQM/Z9V+Dfzrn5sd9d5ZxzaQlUREQk5JREEBERkWy1g3OuBMA5FwV2iB3fA8DM3jCzWWZ2RVAB +ioiIhI26M4iIiEhYlK42qAMcArQDfgXeMrNZzrl3AotMREQkJJREEBERkWxVYmZ5zrkSM4sAK2PH +vwLec86tAjCz8UAboMIkwqBBg377vqCggIKCglTGLCIikpGKi4spLi6u8npKIoiIiEi2sNi/UuOA +QuA24ExgbOz4m8AVZrYVsAE4HLizshstm0TIRpFIhJKSEoYPH040Gg06HBERyVLlE+mDBw+u8HpK +IoiIiEjGM7Mx+C4L25vZcqAIGAo8Z2ZnAV8AJwM4534wszuBWcAm4DXn3OuBBJ4GJSUlm30VERFJ +JSURREREMkl+ftARZCTnXP9KLjqykuuPAcakLiIREZHcpO4MIiIimaSwMOgIJJcoaSUiItWkJIKI +iIhIpsvL2/xrsihpJSIi1aQkgoiIiEimi0ahqMh/FRERCZCSCCIiIiIiIiISFyURRERERERERCQu +SiKIiIiIhFi+iieKiEgSKYkgIiIiEmKFKp4oIiJJpCSCiIiIiIiIiMRFSQQRERERERERiYuSCCIi +IiIiIiISFyURRERERERERCQuSiKIiIiIiIiISFyURBARERERERGRuCiJICIiIiIiIiJxURJBRERE +REREROKiJIKIiIiIiIiIxEVJBBERERERERGJi5IIIiIiIiIiIhIXJRFEREREslheXt5mX0VERFJJ +SQQRERGRbJCfX+HhaDRKUVER0Wg0vfGIiEhOUhJBREREJBsUFgYdgYiIiJIIIiIiIiIiIhIfJRFE +REREREREJC5KIoiIiIiIiIhIXJREEBEREREREZG4KIkgIiIikuXyK+ncICIikmxKIoiIiIhkuUJ1 +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 +cAw4PwAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>As we can see above, the market broke a prevailing trend on Apple in order to go down, and ultimately predict the earnings release. For Facebook, the opposite happened. While the trend was down, the earnings were fantastic and the market corrected itself much higher.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Formulating-the-Question">Formulating the Question<a class="anchor-link" href="#Formulating-the-Question">&#182;</a></h1><p>While these are two specific examples, there are plenty of other examples you could cite one way or another. Even if the preponderance of evidence shows that the market correctly predicts earnings releases, we need not accuse people of collusion; for a company like Apple with many suppliers we can generally forecast how Apple has done based on those same suppliers.</p> +<p>The question then, is this: <strong>how well does the market predict the earnings releases?</strong> It's an incredibly broad question that I want to disect in a couple of different ways:</p> +<ol> +<li>Given a stock that has been trending down over the past N days before an earnings release, how likely does it continue downward after the release?</li> +<li>Given a stock trending up, how likely does it continue up?</li> +<li>Is there a difference in accuracy between large- and small-cap stocks?</li> +<li>How often, and for how long, do markets trend before an earnings release?</li> +</ol> +<p><strong>I want to especially thank Alejandro Saltiel for helping me retrieve the data.</strong> He's great. And now for all of the interesting bits.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Studies">Event Studies<a class="anchor-link" href="#Event-Studies">&#182;</a></h1><p>Before we go too much further, I want to introduce the actual event study. Each chart intends to capture a lot of information and present an easy-to-understand pattern:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[5]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">pandas.tseries.holiday</span> <span class="k">import</span> <span class="n">USFederalHolidayCalendar</span> +<span class="kn">from</span> <span class="nn">pandas.tseries.offsets</span> <span class="k">import</span> <span class="n">CustomBusinessDay</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> + +<span class="c"># If you remove rules, it removes them from *all* calendars</span> +<span class="c"># To ensure we don&#39;t pop rules we don&#39;t want to, first make</span> +<span class="c"># sure to fully copy the object</span> +<span class="n">trade_calendar</span> <span class="o">=</span> <span class="n">USFederalHolidayCalendar</span><span class="p">()</span> +<span class="n">trade_calendar</span><span class="o">.</span><span class="n">rules</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="c"># Remove Columbus day</span> +<span class="n">trade_calendar</span><span class="o">.</span><span class="n">rules</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="c"># Remove Veteran&#39;s day</span> +<span class="n">TradeDay</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">days</span><span class="p">:</span> <span class="n">CustomBusinessDay</span><span class="p">(</span><span class="n">days</span><span class="p">,</span> <span class="n">calendar</span><span class="o">=</span><span class="n">trade_calendar</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">plot_study</span><span class="p">(</span><span class="n">array</span><span class="p">):</span> + <span class="c"># Given a 2-d array, we assume the event happens at index `lookback`,</span> + <span class="c"># and create all of our summary statistics from there.</span> + <span class="n">lookback</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">norm_factor</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">array</span><span class="p">[:,</span><span class="n">lookback</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">centered_data</span> <span class="o">=</span> <span class="n">array</span> <span class="o">/</span> <span class="n">norm_factor</span> <span class="o">-</span> <span class="mi">1</span> + <span class="n">lookforward</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">lookback</span> + <span class="n">means</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">lookforward_data</span> <span class="o">=</span> <span class="n">centered_data</span><span class="p">[:,</span><span class="n">lookforward</span><span class="p">:]</span> + <span class="n">std_dev</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">std</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)])</span> + <span class="n">maxes</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">mins</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">range_begin</span> <span class="o">=</span> <span class="o">-</span><span class="n">lookback</span> + <span class="n">range_end</span> <span class="o">=</span> <span class="n">lookforward</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + + <span class="n">max_err</span> <span class="o">=</span> <span class="n">maxes</span> <span class="o">-</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">min_err</span> <span class="o">=</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">mins</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:],</span> + <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">min_err</span><span class="p">,</span> <span class="n">max_err</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Max &amp; Min&#39;</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + +<span class="k">def</span> <span class="nf">plot_study_small</span><span class="p">(</span><span class="n">array</span><span class="p">):</span> + <span class="c"># Given a 2-d array, we assume the event happens at index `lookback`,</span> + <span class="c"># and create all of our summary statistics from there.</span> + <span class="n">lookback</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">norm_factor</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">array</span><span class="p">[:,</span><span class="n">lookback</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">centered_data</span> <span class="o">=</span> <span class="n">array</span> <span class="o">/</span> <span class="n">norm_factor</span> <span class="o">-</span> <span class="mi">1</span> + <span class="n">lookforward</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">lookback</span> + <span class="n">means</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">lookforward_data</span> <span class="o">=</span> <span class="n">centered_data</span><span class="p">[:,</span><span class="n">lookforward</span><span class="p">:]</span> + <span class="n">std_dev</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">std</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)])</span> + <span class="n">maxes</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">mins</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">range_begin</span> <span class="o">=</span> <span class="o">-</span><span class="n">lookback</span> + <span class="n">range_end</span> <span class="o">=</span> <span class="n">lookforward</span> + <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + + <span class="n">max_err</span> <span class="o">=</span> <span class="n">maxes</span> <span class="o">-</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">min_err</span> <span class="o">=</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">mins</span> + <span class="n">plt</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:],</span> + <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">min_err</span><span class="p">,</span> <span class="n">max_err</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Max &amp; Min&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + +<span class="k">def</span> <span class="nf">fetch_event_data</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">events</span><span class="p">,</span> <span class="n">horizon</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span> + <span class="c"># Use horizon+1 to account for including the day of the event,</span> + <span class="c"># and half-open interval - that is, for a horizon of 5,</span> + <span class="c"># we should be including 11 events. Additionally, using the</span> + <span class="c"># CustomBusinessDay means we automatically handle issues if</span> + <span class="c"># for example a company reports Friday afternoon - the date</span> + <span class="c"># calculator will turn this into a &quot;Saturday&quot; release, but</span> + <span class="c"># we effectively shift that to Monday with the logic below.</span> + <span class="n">td_back</span> <span class="o">=</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> + <span class="n">td_forward</span> <span class="o">=</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> + + <span class="n">start_date</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span> <span class="o">-</span> <span class="n">td_back</span> + <span class="n">end_date</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span> <span class="o">+</span> <span class="n">td_forward</span> + <span class="n">total_data</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span> + <span class="n">event_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">total_data</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">td_back</span><span class="p">:</span><span class="n">event</span><span class="o">+</span><span class="n">td_forward</span><span class="p">]</span>\ + <span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">horizon</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>\ + <span class="p">[</span><span class="s">&#39;Adjusted Close&#39;</span><span class="p">]</span> + <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">events</span><span class="p">]</span> + <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">event_data</span><span class="p">)</span> + +<span class="c"># Generate a couple of random events</span> + +<span class="n">event_dates</span> <span class="o">=</span> <span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">27</span><span class="p">)</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mi">20</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">40</span><span class="p">)]</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">fetch_event_data</span><span class="p">(</span><span class="s">&#39;CELG&#39;</span><span class="p">,</span> <span class="n">event_dates</span><span class="p">)</span> +<span class="n">plot_study_small</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span> + + +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;Mean price for days leading up to each event&#39;</span><span class="p">,</span> + <span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="o">-.</span><span class="mi">01</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mf">4.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">025</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.05</span><span class="p">))</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="p">(</span><span class="o">-.</span><span class="mi">1</span><span class="p">,</span> <span class="o">.</span><span class="mi">005</span><span class="p">),</span> <span class="p">(</span><span class="o">-.</span><span class="mi">5</span><span class="p">,</span> <span class="o">.</span><span class="mi">02</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">})</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;$\pm$ 1 std. dev. each day&#39;</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="o">.</span><span class="mi">055</span><span class="p">),</span> <span class="p">(</span><span class="mf">2.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">085</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">})</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;Min/Max each day&#39;</span><span class="p">,</span> <span class="p">(</span><span class="o">.</span><span class="mi">9</span><span class="p">,</span> <span class="o">-.</span><span class="mi">07</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-.</span><span class="mi">1</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">});</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtEAAAFwCAYAAAB+YSfRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VPW9//HXdyaTSTLZSICwb+pFRAIJsi8GUNyxqIj7 +Ulu1anvb/qoUr1VwudfeVlzaWltrrVqvooiIRSkoxn1BURaFgGjCGkhCyL7MZL6/PyYZs5OYwGR5 +Px+P85g53/mecz4zo+Gdb77nHGOtRUREREREWs4R6gJERERERDobhWgRERERkVZSiBYRERERaSWF +aBERERGRVlKIFhERERFpJYVoEREREZFWapcQbYw50xizzRiz3RizoJHXhxtjPjDGlBtjflnvtUxj +zEZjzOfGmE/aox4RERERkaMprK07MMY4gD8Cs4B9wHpjzCvW2m21uuUBPwV+0Mgu/ECatTa/rbWI +iIiIiBwL7TESPR7YYa3NstZ6geeB82t3sNbmWms/A3yNbG/aqQ4RERERkWOiPcJrf2B3rfU91W0t +ZYG1xpj1xpgft0M9IiIiIiJHVZunc7SDKdba/caYXgTC9FZr7XuhLkpEREREpCntEaL3AoNqrQ+o +bmsRa+3+6sccY8zLBKaHNAjRxhjbxjpFRERERFrEWmuae709pnOsB443xgw2xoQDlwArm+kfLMgY +E2WMia5+7gFmA1ua2tBaq6WTLnfddVfIa9Ci7647Lvr+Ou+i765zL/r+OvfSEm0eibbWVhljbgHW +EAjlT1hrtxpjbgi8bP9qjEkCPgViAL8x5j+Bk4BewMvVo8xhwLPW2jVtrUlERERE5GhqlznR1trV +wPB6bX+p9fwAMLCRTYuBMe1Rg4iIiIjIsaJLy8kxkZaWFuoS5HvSd9e56fvrvPTddW76/ro+09J5 +H6FmjLGdpVYRERER6byMMdhjcGKhiIiIiEi3ohAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIi +IiIiraQQLSIiIiLSSgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQ +LSIiIiLSSgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLS +SgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLSSgrRIiIi +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 +OTn4GdTv39Tn7PV6ufPOO3nhhRdITU3lxRdfbLQG6Th8Ph+FhYVkZ2fzzTffsGXLFj755BPeeiud +5ctf4+9/X8aDDz7NokWP8YtfPMCPf3wvN974AP/v/z3FnXeu4v77P+bhh3fy178W8NxzLt54oy+b +NiWzf/8sKivnExNzMwMH3sHgwQsYOPCnDBx4HQMHXsqgQecDMGDARHr1GkFMTD/Cw3U3PpGORCPR +3ZgxhksuuYTFixdzzjnnsGnTJq677jreffddAO677z5mzZrFE088QUFBAePHj+e0004jKSmJN954 +g/DwcL7++msuvfRS1q9fDwRG2b766iv69OnDlClT+OCDD5g8eXKDY5eVlfH555/z7rvvcu2117J5 +82YAtm7dyvvvv094eDhvv/128B+Me+65h/j4+GAwrbkd7L333subb75JZGQk//u//8sDDzzAb37z +m+BxzjrrLG688UZiYmL45S9/yYYNG3jqqadYv349VVVVTJgwgbS0NOLj4/n666955plnGDduXJ1a +KyoquP7660lPT2fYsGHMnz8/+NqIESN47733cDgcvPnmmyxcuJBly5bxox/9iCeffJIHH3yQ7du3 +U1FRwahRo5gzZw6PPvookyZNorS0lIiIiCa/n7Vr17Jjxw4++eQTrLXMmTOH9957j6lTp/Lkk08S +Hx9PeXk548aN48ILL6SiooJFixbx+eefExsbS1paGqmpqY3uu6qqio8//pjXX3+dRYsWsXbtWh59 +9FESEhLYsmULX375JSkpKU3+d9PU+ubNm/n4448pKioiJSWFc889lz59+gRfv//++/nyyy+D4Xz5 +8uVs2rSJzZs3c/DgQcaNG8epp55KUlJScJtt27axdOlSPvjgA5xOJzfffDPPPvssV1xxBf/93/9N +fHw8fr+fWbNmceGFFzJ8+HAuueQSXnzxRVJTUykuLg5+zhs3buSLL77A5XIxfPhwfvazn9G/f//g +sXw+Hz/96U9ZuXIliYmJvPDCC9x+++088cQTeL1esrKyGDx4MEuXLuWSSy7B5/Pxs5/9rNH+TX3O +d999d3CajRxbfr+f8vLy4MhwSUlJ9WNgRDg/PzBSXFAQWC8qKqWszIvDEYUxHmpGif3+wEhxWFgi +LtdAXK4oXK4o3O4ooqOjcDpdoX6rInIMKER3cyeffDKZmZk899xznHPOOcERPoA1a9bw6quv8rvf +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 +FJdEUlxSwOISqY6aTnEnIiIiUiVKlqU+0bLfIiIiIiI+0ki0iIiIyHWgcpUbS41m5/CnymbniIuL +K7dMrdQ9sbGxZGVlBToMERERuQ40O0c9GInOzs6udElaqTsqWsRBREREJFipJlpERERExEdKokVE +REREfKQkWkRERETER0qiRURERER8pCT6BpWSksLMmTMDHYaIiIhIUFISXQctWrSIbt260ahRI8aN +GxfocERERETkCkE/xV1FZs58lWPHvqu188fEfI8XXvgvn4+bN28ekydPvma/6OhoZsyYwbp167hw +4UJ1QhQRERGRWlQvk+hjx74jLm52rZ0/K6t6587Pz69Sv6FDhwKwfft2jh8/ftW+8+bNY8GCBZw5 +c4bo6Ghee+017r777nL9du3axfjx4/nb3/7GwIEDNW+ziIiISA2onMOPrveiMF999RWLFi1i586d +nDlzhnXr1hEXF1eu38WLFxk2bBhjx47l1KlTDB8+nD/96U/XNRYRERGRG0m9HImuKw4fPsy77757 +aelItmzZwksvvYRzDjOjR48eJCYmVvv8oaGhFBQUsG/fPqKiooiJiamw39atWyksLGTChAkAPPLI +I3Tr1q3a1xURERG50SmJrkU/+MEPytRA5+fnM2nSpOt6/ldffZXZs2ezf/9+7r//fl5++WVatWpV +pl9OTg7R0dFl9sXGxl63OERERERuNCrnCHLJycl88sknZGdnAzBlypRyfVq1alWutvrYsWN+iU9E +RESkPlIS7UdVrYkuKioiLy+PoqIiCgsLyc/Pp6ioqFy/r776ik2bNlFQUEB4eDgRERGEhJS/pT17 +9qRBgwYsWLCAwsJCMjIy2LZtW43fj4iIiMiNSuUctejgwYOsWLHCWxO9efNmXnjhBW9NdM+ePRkw +YEC54+bMmUNqaqp3Bo2lS5cya9ascouj5OfnM2XKFA4cOEBYWBi9evXijTfeAGDQoEH069ePKVOm +EBYWRkZGBuPHj+f5559n0KBBPPLII2XOdXl/EREREbk6u94zRtQWM3MVxXopQb1cXZ0n+kZW0X0S +ERGR4GSphptVfz/XS/OWq84HXC+TaKl7dJ9ERETqDyXRqokWEREREfGZkmgRERERER+pnEP8QvdJ +REQkuHmyPHiyPN7XSXFJACTFJXlf1xeqiZY6Q/dJREREgoVqokVEREREaoGSaBERERERHymJFhER +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>And as a quick textual explanation as well:</p> +<ul> +<li><p>The blue line represents the mean price for each day, represented as a percentage of the price on the '0-day'. For example, if we defined an 'event' as whenever the stock price dropped for three days, we would see a decreasing blue line to the left of the 0-day.</p> +</li> +<li><p>The blue shaded area represents one standard deviation above and below the mean price for each day following an event. This is intended to give us an idea of what the stock price does in general following an event.</p> +</li> +<li><p>The green bars are the minimum and maximum price for each day following an event. This instructs us as to how much it's possible for the stock to move.</p> +</li> +</ul> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Type-1:-Trending-down-over-the-past-N-days">Event Type 1: Trending down over the past N days<a class="anchor-link" href="#Event-Type-1:-Trending-down-over-the-past-N-days">&#182;</a></h1><p>The first type of event I want to study is how stocks perform when they've been trending down over the past couple of days prior to a release. However, we need to clarify what exactly is meant by "trending down." To do so, we'll use the following metric: <strong>the midpoint between each day's opening and closing price goes down over a period of N days</strong>.</p> +<p>It's probably helpful to have an example:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[6]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> +<span class="n">f</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + +<span class="n">FB_plot</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">):],</span> <span class="n">FB_plot</span><span class="p">)</span> + +<span class="n">FB_truncated</span> <span class="o">=</span> <span class="n">FB</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">):</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">)]</span> +<span class="n">midpoint</span> <span class="o">=</span> <span class="n">FB_truncated</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">FB_truncated</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">FB_truncated</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">midpoint</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Midpoint&#39;</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;FB Midpoint Plot&#39;</span><span class="p">)</span> + +<span class="n">AAPL_plot</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10</span><span class="p">):],</span> <span class="n">AAPL_plot</span><span class="p">)</span> +<span class="n">AAPL_truncated</span> <span class="o">=</span> <span class="n">AAPL</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">)]</span> +<span class="n">midpoint</span> <span class="o">=</span> <span class="n">AAPL_truncated</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">AAPL_truncated</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">AAPL_truncated</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">midpoint</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Midpoint&#39;</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;AAPL Midpoint Plot&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +eeSRR5g2bRp///vfl+lz0003MXr0aGbPns2gQYP4wQ9+AMDcuXPZe++9OfHEE5k9ezYnnXQSe+21 +F3Pnzq1xrKeffpqBAwcye/ZsTj311MpLF8477zx23nlnrrzySubPn8/ll1+ep3dCkiRJktSamERY +SUtmIzz88MMMHDiQXr161XiZwu23386oUaMYOHAga665JiUlJcv02Wuvvdhxxx1p164d559/Pk89 +9RQzZ87kvvvuY8CAAYwYMYI2bdpwyCGHsMkmm3DPPffUGFPfvn056qijiAiOPPJIPvjgAz788MN8 +v3RJkiRJUivVLAsr5qkuIatSmuCwww5jl1124Z133uGII47IxbVsYLNmzWLrrbeufNy3b99lkg19 ++vSpvL/WWmvRpUsXZs2axaxZs+jbt+9Sffv27cvMmTNrjKmoqKjy/pprrgnAJ598Qvfu3Vfw1UmS +JEmStKxmORMhpfzcVsV6661H//79eeCBB/je975Xa7+ePXvy3nvvVT5+9913l0k2VN3+ySefMHfu +XHr16kWvXr0oKytbqu+MGTNYd911VzjefK0IIUmSJElqvZplEqGpGD9+PP/4xz8qz/rXdDnD8OHD +mTBhAlOnTmXhwoX86le/WqbP/fffz5QpU/j8888555xzGDJkCOuuuy577rkn06ZN45ZbbmHRokXc +euutTJ06lX322WeFY+3Rowdvv/32ir9ISZIkSZJyTCKsoKpn9Pv3789WW21V47Yl9thjD0488UR2 +3XVXBgwYwLBhw5bpM2LECEpKSujWrRv//ve/ueGGGwDo2rUr9957L2PGjGGdddZhzJgx3HfffXTp +0qXW8WqL9YQTTuD222+nW7dunHjiiSv2oiVJkiRJAqKms+eNMnBEqmnsiKjxjH5LNWrUKPr06VPj +DAWtutb2eWoOojRIo/03kZYn9/8ur0NrBLUdj0iSWjePWWs/HnEmgiRJkiRJqheTCAVmwUOpHiZM +KHQEkiRJkmimSzy2JOPHjy90CFLTV22VEkmSJEmF4UwESZIkSZJULyYRJEmSJElSvZhEkCRJkiRJ +9WISQZIkSZIk1YtJBEmSJEmSVC8mEZqwyZMnM3DgwEKHsUKGDh3qihOSJEmS1EKZRFhB/fr1o337 +9nTs2JEOHTrQsWNHjj/++AYZa6eddmLq1KkNsu/aXHfddbRt25aOHTvSuXNnBg8ezH333deoMUiS +JEmSmqY6kwgRMS4iKiLipSptF0fE1Ih4ISL+EhEdq2w7MyKm5bbv1lCBF0pEcN999zF//nwWLFjA +/Pnzufzyy1d4P4sWLWqA6PJjhx12YP78+cybN4/jjjuOQw45hPnz5xc6LEmSJElSgdVnJsK1wO7V +2h4CNkspbQlMA84EiIhNgeHAQOC7wNiIiPyF2zSklGpsf/vttxk2bBjrrLMO3bt357DDDlvqx3f/ +/v25+OKLGTRoEGuvvTaLFi2if//+/Pa3v2XQoEF06dKFQw89lM8//xyAxx57jD59+iz1/Nr6Alx8 +8cX06tWL3r17M27cONq0acPbb78NwP33389mm21Gx44d6dOnD5deemm9Xuvhhx/Op59+yrRp0yrb +nnrqKXbccUe6dOnC4MGDeeyxx2p9/vjx49l0003p1q0b3/3ud5kxY0blthNPPJH11luPTp06sc02 +2zB58uTKbc888wzbbLMNnTp1omfPnpxyyikrNb4kSZIkKX/qTCKklCYDc6u1/T2ltDj38Cmgd+7+ +vsAtKaUvU0plZAmGbfMXbtOWUuKss86ivLycqVOn8v7771NSUrJUn1tuuYUHHniAefPmsdpqqwFw +++2389BDD/HOO+/w4osvMmHChMr+1XMwtfWdOHEil112Gf/4xz+YPn06kyZNWuq5Rx99NNdccw3z +58/nlVdeYdddd63z9SxatIjx48ez+uqr07dvXwBmzZrF3nvvzbnnnsvcuXMZM2YMBx54ILNnz17m ++XfffTcXXnghd911Fx999BE777wzhx56aOX2bbfdlpdeeom5c+cyYsQIDj744MqkyAknnMCJJ57I +xx9/zFtvvcXw4cNXeHxJkiRJUn7loybCUcD9ufvrAu9V2TYz19ai7L///nTt2pUuXbrQtWtXxo0b +B8AGG2zAsGHDaNu2Ld26deOkk05a5iz5CSecQK9evVhjjTWWauvRowedO3dmn3324YUXXqh17Nr6 +3n777YwaNYpNNtmEr33ta5SUlCw1Y2L11Vfn1VdfZcGCBXTq1Iktt9yy1jGefPJJunbtypprrslp +p53GDTfcwDrrrAPADTfcwF577cXuu2eTU4YNG8bWW2/N/fffv8x+rrrqKs4880wGDBhAmzZtOOOM +M3jhhRd4773sIzJixAg6d+5MmzZtOOmkk/jss8944403KuOdPn06s2fPpn379my77bYrPL4kSWoY +VU94SJJal1VKIkTEL4EvUko35yme+o1bGnm5ray7776bOXPmMHfuXObMmcMPf/hDAD788EMOPfRQ +evfuTefOnTnssMP4z3/+s9Rze/fuvcz+evToUXm/ffv2fPLJJ7WOXVvfWbNmLXXpQ9X7AH/5y1+4 +77776Nu3L0OHDuWpp56qdYztt9+eOXPmMG/ePPbdd1/++c9/Vm579913ue222+jatWtlIuWJJ56g +vLx8mf28++67nHDCCZV9u3XrRkQwc+ZMAMaMGcOmm25Kly5d6NKlC/Pnz698v8aNG8cbb7zBJpts +wnbbbVdZ3LG28T/44INaX48kSa1JY/zALysra/AxMFEhSU1S25V9YkSMBPYEqs6LnwlU/fXaO9dW +o6pT/YuLiykuLq7X2Gl0zTUJGkttNRHOOuss2rRpw6uvvkqnTp24++67+fnPf75Un4YqEdGzZ0/e +f//9ysczZsxYaqxvfvOb3HXXXSxatIgrrriC4cOHL1WfoCbt27dn7NixrL/++vzwhz9k0KBB9OnT +hyOOOIKrrrqqzpj69OnD2WefvdQlDEtMnjyZSy65hEcffZRNN90UgK5du1a+txtssAE33XQTkCVA +DjroIObMmbNC40tSczFp0iQmTZpU6DDUQjTKD/zG0FJehyS1MPWdiRC5W/YgYg/gVGDflNJnVfr9 +DTgkIlaPiP7AhsDTte20pKSk8lbfBEJTtmDBAtZee206dOjAzJkzueSSSxpt7OHDh3Pttdfy+uuv +s3DhQs4777zKbV988QU33XQT8+fPZ7XVVqNDhw6V9Rjq0qVLF4455hhKS0sBOOyww7jnnnt46KGH +WLx4Mf/73/947LHHmDVr1jLPPfbYY7ngggt47bXXAPj444+54447gOy9ateuHd26dePzzz/nV7/6 +FQsWLKh87o033lg5K6FTp05EBG3atFmh8SWpuSguLl7qO1GSJKmpqs8SjzcBU4ABETEjIkYBVwBr +Aw9HxPMRMRYgpfQacBvwGlmdhJ+k2k7bN2P77LMPHTt2rLwdeOCBAIwePZrnnnuusl7BkvYlapqF +sCIzE5bXd4899uD4449n6NChDBgwgO233x6gsvbC9ddfT//+/encuTNXX3115Vn++jjhhBN44IEH +eOWVV+jduzd33303F1xwAV//+tfp27cvY8aMYfHixcvEuP/++3PGGWdwyCGH0LlzZ7bYYgsmTpwI +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 +kCSpOkciSJIkSZKknJhEkCRJkiRJOTGJIEmSJEmScmISQZIkSZIk5cQkgiRJkiRJyolJBEmSJNXp +0UcfpX///oUOo0GGDBnijhOS1EhMIkiSJLUwffr0oWPHjnTq1Ikdd9yRTp06cf755zdKW1/4whdY +sGBBo7x2XaZOnUr79u3p1KkTXbp0Yb/99mPmzJlNGoMkqXbtCx2AJEmSGiYimDlzJkOGDNmq11m/ +fj3t2rXLU1T59a//+q/8+c9/BuCXv/wlp556KkuXLqVTp04FjkyS2jZHIkiSJLVAKaVay998802G +Dh1K9+7d6dGjByNGjGDNmjVV5/v27cu1117LgAED2GGHHVi/fj19+/bl+uuvZ8CAARQXF3Paaafx +0UcfATB37lx69+5d4/q66gJce+219OzZk169ejFx4kSKiop48803AZg1axZ77703nTp1onfv3txw +ww05vdczzjiDf/7zn7z++utVZU8++SSHHHIIxcXF7LfffsydO7fO6ydNmsRee+1Ft27dOProo1my +ZEnVuTFjxrDrrrvSuXNnBg0axKOPPlp17umnn2bQoEF07tyZnXfemQsvvHCL2pek1sQkgiRJUiuS +UuLSSy9l+fLlLFiwgL/+9a+MGzeuRp3bb7+d2bNn8+6771aNRJg+fTr3338/b731Fi+++CJTpkyp +qh8RNa6vq+6cOXP4yU9+wkMPPcQbb7xBRUVFjWu//vWv86tf/Yo1a9Ywf/58jjjiiHrfz/r165k0 +aRIdOnSgrKwMgGXLlnHcccdx+eWXs3r1aiZMmMBXv/pVVq5cucn1M2bM4JprruHuu+/mnXfe4dBD +D+W0006rOj948GBeeuklVq9ezfDhwznllFOqkiKjR49mzJgxvPfee/zlL39h2LBhDW5fklobkwiS +JEkt0EknnUTXrl0pLi6ma9euTJw4EYDdd9+doUOH0r59e7p168YFF1ywyafko0ePpmfPnmy77bY1 +ykpKSujSpQvHH388L7zwQp1t11V3+vTpjBo1ij333JPPfOYzjBs3rsaIiQ4dOvDKK6+wdu1aOnfu +zOc///k623jiiSfo2rUr2223Hd/73ve49dZb6d69OwC33norxx57LEceeSQAQ4cO5YADDmDWrFmb +vM7NN9/MJZdcQr9+/SgqKuLiiy/mhRde4O233wZg+PDhdOnShaKiIi644ALWrVvHwoULq+J94403 +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 +TkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Given these charts, we can see that FB was trending down for the four days preceding the earnings release, and AAPL was trending down for a whopping 8 days (we don't count the peak day). This will define the methodology that we will use for the study.</p> +<p>So what are the results? For a given horizon, how well does the market actually perform?</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[7]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># Read in the events for each stock;</span> +<span class="c"># The file was created using the first code block in the Appendix</span> +<span class="kn">import</span> <span class="nn">yaml</span> +<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="k">import</span> <span class="n">parse</span> +<span class="kn">from</span> <span class="nn">progressbar</span> <span class="k">import</span> <span class="n">ProgressBar</span> + +<span class="n">data_str</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> +<span class="c"># Need to remove invalid lines</span> +<span class="n">filtered</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="s">&#39;{&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">x</span><span class="p">,</span> <span class="n">data_str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">))</span> +<span class="n">earnings_data</span> <span class="o">=</span> <span class="n">yaml</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">filtered</span><span class="p">))</span> + +<span class="c"># Convert our earnings data into a list of (ticker, date) pairs</span> +<span class="c"># to make it easy to work with.</span> +<span class="c"># This is horribly inefficient, but should get us what we need</span> +<span class="n">ticker_dates</span> <span class="o">=</span> <span class="p">[]</span> +<span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">date_list</span> <span class="ow">in</span> <span class="n">earnings_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="k">for</span> <span class="n">iso_str</span> <span class="ow">in</span> <span class="n">date_list</span><span class="p">:</span> + <span class="n">ticker_dates</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ticker</span><span class="p">,</span> <span class="n">parse</span><span class="p">(</span><span class="n">iso_str</span><span class="p">)))</span> + +<span class="k">def</span> <span class="nf">does_trend_down</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="c"># Figure out if the `event` has a downtrend for</span> + <span class="c"># the `horizon` days preceding it</span> + <span class="c"># As an interpretation note: it is assumed that</span> + <span class="c"># the closing price of day `event` is the reference</span> + <span class="c"># point, and we want `horizon` days before that.</span> + <span class="c"># The price_data.hdf was created in the second appendix code block</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="p">]</span> + <span class="n">midpoints</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> + + <span class="c"># Shift dates one forward into the future and subtract</span> + <span class="c"># Effectively: do we trend down over all days?</span> + <span class="n">elems</span> <span class="o">=</span> <span class="n">midpoints</span> <span class="o">-</span> <span class="n">midpoints</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="o">.</span><span class="n">dropna</span><span class="p">()[</span><span class="n">elems</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="c"># If the stock doesn&#39;t exist, it doesn&#39;t qualify as trending down</span> + <span class="c"># Mostly this is here to make sure the entire analysis doesn&#39;t </span> + <span class="c"># blow up if there were issues in data retrieval</span> + <span class="k">return</span> <span class="k">False</span> + +<span class="k">def</span> <span class="nf">study_trend</span><span class="p">(</span><span class="n">horizon</span><span class="p">,</span> <span class="n">trend_function</span><span class="p">):</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="n">horizon</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> + <span class="n">invalid_events</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">ticker_dates</span><span class="p">):</span> + <span class="k">if</span> <span class="n">trend_function</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">event_data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="o">+</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">)][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">five_day_events</span><span class="p">,</span> <span class="n">event_data</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> + <span class="c"># Sometimes we don&#39;t get exactly the right number of values due to calendar</span> + <span class="c"># issues. I&#39;ve fixed most everything I can, and the few issues that are left</span> + <span class="c"># I assume don&#39;t systemically bias the results (i.e. data could be missing</span> + <span class="c"># because it doesn&#39;t exist, etc.). After running through, ~1% of events get</span> + <span class="c"># discarded this way</span> + <span class="n">invalid_events</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">))</span> + + + <span class="c"># Remove our initial zero row</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">five_day_events</span><span class="p">[</span><span class="mi">1</span><span class="p">:,:]</span> + <span class="n">plot_study</span><span class="p">(</span><span class="n">five_day_events</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&#39;Action over {} days: {} events&#39;</span> + <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">horizon</span><span class="p">,</span><span class="n">five_day_events</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + +<span class="c"># Start with a 5 day study</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:21:38 Time: 0:21:38 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +NXU1G9arJ1QDUD2hesN63or/vkbedfQGXovky/dZkrqujl6PGDSopPw9SeruYnKQLu56/44ZNHQe +r0Xy5fssSV1XR69HnKNBkiRJkiSVjEGDJEmSJEkqGYMGSZIkSZJUMgYNkiRJkiSpZAwaJEmSJElS +yZTnXYAkSVJ3MH78eCK88cf2Nn78+LxLkCRto24dNJTivufd4d7pkiQpf3V1dXmXIElStxBd7T7F +b/be1aW473lXvXd6Z/vsZz/L2LFj+frXv77Vr/Xe15K6u676f0FH71utbbe5axFJknq7jl6POEdD +CUyYMIF+/fqxatWqTfZPnDiRQqHAggULSn7O+vp6zjzzTIYNG8aoUaP44he/WLI6r7rqqjcVMkiS +JEmSZNBQAhHBLrvswm9/+9sN+2bNmsVrr7223cZyXn/99cyYMYO6ujqee+45TjnllC5ZpyRJkiSp +dzFoKJGPf/zj3HDDDRu2b7jhBj7xiU9s0uaOO+7goIMOorKykvHjxzN58uQNz918883suuuurF27 +FoA777yT0aNHs3LlynbPV1FRQWVlJUOGDKF///684x3vKFmdZ599Nt/85jcBuPfeexk3bhw/+tGP +2GmnnRgzZgzXX399h84lSZIkSep9DBpK5IgjjuDll1/mqaeeorm5md/97nd87GMf22S+gkGDBvHr +X/+al156idtvv52f/exn/PnPfwbgwx/+MEcddRSf//znWbVqFZ/61Ke47rrrGD58eLvnO+igg3jw +wQeZNGlSyetsa9myZbz88sssWbKEX/ziF5x77rm89NJLW3VeSZIkSVLv0K3vOtFWTM63+39Lb4F3 +vOMd7L333uy8886bPH/00UdvWN9vv/047bTTuPfeeznppJMAuPzyy9l///2prq7m5JNP5oQTTmj3 +PKtXr+akk07i9ttv5+KLLyYiuPjiiwEYN24cd911F/vuu++brrOtPn36cNFFF1EoFDjhhBMYNGgQ +Tz31FIcddliH3hdJkiRJUu9RkqAhIo4HLiXrIXFtSumSNs8PAf4bqALKgB+mlK4vxblbK8VdJ7bF +xz72MY4++miee+45zjzzzNc9/9BDD/HVr36VWbNmUV9fT319PR/60Ic2PF9ZWcmHPvQhfvzjH3PL +Lbds9jz/8z//wz777MN73vMeDjnkEI4++mgigk984hM0NTVtMWToSJ1tDR8+nEJhY+eXAQMGbBji +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>When a stock has been trending down for 5 days, once the earnings are announced it really doesn't move on average. However, the variability is <em>incredible</em>. This implies two important things:</p> +<ol> +<li>The market is just as often wrong about an earnings announcement before it happens as it is correct</li> +<li>The incredible width of the min/max bars and standard deviation area tell us that the market reacts <em>violently</em> after the earnings are released.</li> +</ol> +<p>Let's repeat the same study, but over a time horizon of 8 days and 3 days. Presumably if a stock has been going down for 8 days at a time before the earnings, the market should be more accurate.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[8]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># 8 day study next</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:29 Time: 0:20:29 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +XlrzW/yEisVmdls9x70TSIocey7ben8ATMT/O3h5J/sXbLd/tOifzePAXDN7HjgImBp53bdFjici +IhJ3LPL3WkRERKRBIvM9fAUM1RwDIiIiAuq5ICIiIo1gZifgexU8oGBBREREaqnngoiIiIiIiIg0 +iXouiIiIiIiIiEiTKFwQERERERERkSZRuCAiIiIiIiIiTaJwQURERERERESaROGCiIiIiIiIiDSJ +wgURERERERERaRKFCyIiIiIiIiLSJAoXRERERERERKRJFC6IiIiIiIiISJMoXBARERERERGRJlG4 +ICIiIiIiIiJNonBBRERERERERJpE4YKIiIiIiIiINInCBRERERERERFpEoULIiIiIiIiItIkChdE +REREREREpEkULoiIiIiIiIhIkyhcEBEREREREZEmUbggIiIiIiIiIk0Sk3DBzE41swVmtsjMbqjn +8Uwze8vMZpvZXDO7LBbnFRERkfjTgHbHxWb2VWT5zMwGN/S5IiIismfMOde0A5iFgEXACUApMA0Y +6ZxbELXPH4BM59wfzKwrsBDo7pyrbtLJRUREJK40sN1xFDDfOVdmZqcCY51zRzXkuSIiIrJnYtFz +4QhgsXNumXOuCngJOGu7fRzQMbLeEVitYEFERET2wG7bHc65Kc65ssjdKUDvhj5XRERE9kwswoXe +wLdR979j2x/xWg8BA82sFPgKuC4G5xUREZH405B2R7QrgHf38LkiIiLSQIktdJ5TgFnOuZ+a2T7A +v8xssHNu4/Y7mlnTxmmIiIi0U845C7qGtsTMfgKMAY5r5PPUFhEREdmJnbVHYhEulAD9ou73iWyL +Nga4K1LIEjMrBA4Aptd3wKbOAyGxNXbsWMaOHRt0GRIA/e7jl373rY+ZcoWIhrQ7iEzi+DhwqnNu +bWOeC2qLtEZ6X4pf+t3HL/3uW59dtUdiMSxiGrCvmeWYWTIwEnhru32WASdGiukO7AcsjcG5RURE +JL7stt1hZv2AicAo59ySxjxXRERE9kyTey4452rM7DfA+/iw4inn3Hwzu8o/7B4H7gSeMbM5kadd +75xb09Rzi4iISHxpYLvjVqAz8Ij5r1iqnHNH7Oy5Ab0UERGRdiUmcy445yYB+2+37bGo9eX4eRek +DcrLywu6BAmIfvfxS797ac0a0O64Eriyoc+VtkHvS/FLv/v4pd9922KtbUyhmbnWVpOIiEjQzEwT +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 +AAAAKMr/B9pAH9lY/+K6AAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>However, looking only at stocks that trended down for 8 days prior to a release, the same pattern emerges: on average, the stock doesn't move, but the market reaction is often incredibly violent.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[9]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># 3 day study after that</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:26 Time: 0:26:26 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +STfmKmb+uQ4AAAAASUVORK5CYII= +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Finally, when we look at a 3-day horizon, we start getting some incredible outliers. Stocks have a potential to move over ~300% up, and the standard deviation width is again, incredible. The results for a 3-day horizon follow the same pattern we've seen in the 5- and 8-day horizons.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Type-2:-Trending-up-for-N-days">Event Type 2: Trending up for N days<a class="anchor-link" href="#Event-Type-2:-Trending-up-for-N-days">&#182;</a></h1><p>We're now going to repeat the analysis, but do it for uptrends instead. That is, instead of looking at stocks that have been trending down over the past number of days, we focus only on stocks that have been trending up.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[10]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">does_trend_up</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="c"># Figure out if the `event` has an uptrend for</span> + <span class="c"># the `horizon` days preceding it</span> + <span class="c"># As an interpretation note: it is assumed that</span> + <span class="c"># the closing price of day `event` is the reference</span> + <span class="c"># point, and we want `horizon` days before that.</span> + <span class="c"># The price_data.hdf was created in the second appendix code block</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="p">]</span> + <span class="n">midpoints</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> + + <span class="c"># Shift dates one forward into the future and subtract</span> + <span class="c"># Effectively: do we trend down over all days?</span> + <span class="n">elems</span> <span class="o">=</span> <span class="n">midpoints</span> <span class="o">-</span> <span class="n">midpoints</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="o">.</span><span class="n">dropna</span><span class="p">()[</span><span class="n">elems</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="c"># If the stock doesn&#39;t exist, it doesn&#39;t qualify as trending down</span> + <span class="c"># Mostly this is here to make sure the entire analysis doesn&#39;t </span> + <span class="c"># blow up if there were issues in data retrieval</span> + <span class="k">return</span> <span class="k">False</span> + +<span class="n">study_trend</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:22:51 Time: 0:22:51 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABBAAAAGNCAYAAACopYLKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8FfW9//H352RfIISAiEACIiBCuIAKiBai1rUtWFtv +UduqV6+9fdRrb3u7aBcBH+391S7Wtrbeayt13+pStXVBLUEWpYhsYZE17AQiCRCWLOd8f3/MSTiE +hAQ4yZzl9Xw85pEzM9+Z+ZwJy5n3+X5nzDknAAAAAACA4wn4XQAAAAAAAIh9BAgAAAAAAKBNBAgA +AAAAAKBNBAgAAAAAAKBNBAgAAAAAAKBNBAgAAAAAAKBNBAgAgLhlZteYWcjMBrej7U1mdnrE/MNm +dnbHVhg9ZhY0s4/MbLGZ/bUd7YvMbHkn1fZzM1tlZkvM7EUz6xqxboSZzTezMjNbambp4eWjzWyZ +ma0xswci2qeb2bNmttbM3jezws54Dy28p8nx9OcDAIDOQIAAAIhnUyTNkXR9O9reLKlP44xz7nbn +3OoOquuUmFlKC4sPOOdGO+dGOeeuaeeuXDTrOo6ZkoY550ZKWivpB1LT+3hC0u3OueGSSiTVh7d5 +SNKtzrnBkgab2RXh5bdK2uOcGyTpAUk/76T30Nw1kob5dGwAAGISAQIAIC6ZWY6kC+VdcF7fbN33 +w99uLzaz/zGzL0g6T9KT4W/xM81slpmNDre/Ptx+mZn9LGI/+83sJ+Fv1uebWc8W6sg3s5fD367P +N7Ph5tnY7Jv4NWbW08x6mNkLZrYgPF0QXj/VzB43s7mSHm/pLbfjnJwbrnWxpG9ELC8ys/fM7MPw +NC68/DEzmxTR7kkz+5yZnROu7aPw/gYe77jOuXecc6Hw7Ac6EtRcLmmpc64s3K7KOefCPUG6OOcW +hts9Lu+CXZImS3os/PoFSZe28l5vjKjxITMLmNnXzOznEW1uMrPfttLewsuP+R2HfyeTJP083H6A +md1pZivC7Z4+3vkAACBRESAAAOLVZElvOufWSao0s1GSZGZXSvqcpPOdc6Mk/dw596KkhZJuCH+L +f7hxJ2bWW9LP5H07PlLS+REX1TmS5oe/WZ8j6d9bqGO6pI+cc/8i6YeSnnDOOUl/lfT58DHGSCp3 +zu2W9BtJ9zvnxkr6oqRHIvY1VNIlzrkbWzhORvjif76ZTW7lnMyQ9I3w+460S9KnnXPnyeu18bvw +8kck3RKusaukCyT9XdJ/SHrAOTdaXvCyNdzm7xYxDKQV/ybp9fDrweHt3gzX/t3w8j6N+wzbqiOh +Qx9JWyTJOReUVG1m3SMPEB5a8CVJ48M1hiTdIOlFhc952JckPdtK+8ZzfMzv2Dn3vqRXJX03/Odl +o6TvSxoZbvcfbZwDAAASUqrfBQAAcJKul9fFXZKeC88vlvRpSX92ztVKknOuOtzG1PK3+OdLmuWc +2yNJZvaUpAnyLiDrnHONF8OLwvtu7iJJ14aPNcvMuptZrqTnJd0j79v0KeEaFd7H0MZvwCXlmll2 ++PWrzrm6Vt5vkXNuh5kNkPQPM1sWvrBVuO48SXnOuXnhRU9IujL8Ok3S/5nZSElBSYPC9b5nZr83 +swJ5YcaLzrmQmb0v6Ydm1lfSy+GQRs65z7RSW2MNP5RU75x7JrwoVV4vkfMkHZb0rpl9KGnf8fbT +fLctLLtU0mhJC8PnMVNShXOu0szWhwObdZKGOOfmm9k3Wmi/M7yv9vyOJWmppKfNu/9Em/egAAAg +EREgAADijpnlS7pE0nAzc5JS5I33/97J7rKV5fURr4Nq+f/N5vcZMElyzr1vZgPNrIe87vn3Rqwf +65yrP2ojL0840FqBzrkd4Z8bzaxU0ihJG1tr38y3JO10zo0w774EhyLWPS7pK/JCjpvDx3jGzD6Q +9FlJr5vZ7c650uMdwMxulnS1vN9Lo62S3nPOVYXbvC7vQv4pSf0i2vWVtC38elt43fZwrV0bw53I +w0l6zDn3wxZKeVZeb4PVkl5uR/vIwKa137EkfUZesDRJXrgyPGLYBgAASYEhDACAeHSdpMedcwOc +c2c654okbTSziyS9LekWM8uSmsIGyfvWu2sL+/qnpAnhngMp8noylJ5ALXMkfTl8rBJJu51zNeF1 +L0u6X9LKiJ4QMyV9s3FjM/uXtg5gZt3syNMLekgaL2llZBvn3F553f3Hhxd9OWJ1nqQd4ddflRe4 +NHpM0n95u/BuKmlmA5xzG51zv5P0iqQRbdR3paTvSprU2PMj7C1JxebdcyJV0kRJK5xzOyXtNbMx +4R4BXw0fR/J6ftwUfn2dpH+0cMh3JX3RwvekMO8+FI1Pa/irvOEtU+SFCa21bwwwWguP9iv85yVc +Y6Fzbraku8LLc493TgAASEQECACAePQlHfl2udFLkq53zr0l6TVJH5rZR5L+O7z+MUn/G74pXqbC +PQfCF7N3yQsNFkv60Dn3t/A27XmKwXRJ55rZUkn/oyMXv5I3jOFGHbmQlbzw4DzzbrpYJulr7TjG +0PD7WSzvYvj/tfIEiX+T9Ifw+46s/Q+Sbg5vP1gRPR2cc7skrZL054j2/2reYxcXy3sSwePSce+B +8Dt5F9Rvh8/vH8L7rpYXoHwo6SN55/bN8DbfkHcPhjWS1kYsf0RSDzNbKy/YuKv5wZxzqyT9SNLM +8HmfKen0iGOuknfB/+Fx2vdu3F0L70fyfmffNbNFks6SdwPOZfKGOfzGOXciwzAAAEgI5t3nCQAA +JKPw/ReWShrtnNvvdz0AACB20QMBAIAkZWaXyhsK8VvCAwAA0BZ6IAAAAAAAgDbRAwEAAAAAALSJ +AAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEA +AAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAA +ALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALSJAAEAAAAAALQpagGCmQXM7CMz +ezVa+wQAAMnDzK40s9VmtsbMvt/C+iFmNt/MDpvZt5utKzezpWa22Mz+2XlVAwCQPFKjuK9vSlop +qWsU9wkAAJKAmQUkPSjpUknbJS00s1ecc6sjmn0i6T8lXdPCLkKSSpxzVR1eLAAASSoqPRDMrK+k +qyX9KRr7AwAASWeMpLXOuU3OuXpJz0qaHNnAOVfpnFskqaGF7U0MzQQAoENF6z/aX0v6riQXpf0B +AIDk0kfSloj5reFl7eUkvW1mC83s36NaGQAAkBSFIQxm9hlJFc65JWZWIu8bgJbaES4AANAC51yL +/3fihFzonNthZj3lBQmrnHNzmzfi8wgAAC1rz+eRaPRAuFDSJDPbIOkZSReb2eOtFMTUzmnq1Km+ +1xBPE+eL88X5ip2J83ViE5psk1QYMd83vKxdnHM7wj93S3pZ3pCI1toytXPi7zPni/MVOxPni/PV +kVN7nXKA4Jz7gXOu0Dl3pqQpkv7hnPvqqe4XAAAklYWSzjKzIjNLl/eZ4nhPdmr6lsTMss0sN/w6 +R9Llkso6slgAAJJRNJ/CAAAAcFKcc0Ezu0PSTHlfcDzinFtlZl/zVruHzayXpA8ldZEUMrNvSjpH +Uk9JL4eHJ6RKeso5N9OfdwIAQOKKaoDgnJstaXY095msSkpK/C4hrnC+Tgzn68Rwvk4M5wsnyzn3 +pqQhzZb9X8TrCkn9Wti0RtLIjq0uOfH3+cRwvk4M5+vEcL5ODOerY9iJjHc4pQOZuc46FgAA8cLM +5LiJYqfh8wgAAMdq7+cR34cw9O/fX5s2bfK7DLShqKhI5eXlfpcBAECH4PNI5+DzBADEN997IIST +jk6pASeP3xMAdAx6IHQuPo/4i/MMALGpvZ9HovEYRwAAAAAAkOAIEAAAAAAAQJsIEAAAAAAAQJsI +EAAAAAAAQJsIEAAAAAAAQJt8f4xjS+655wFt3lzdYfsvLOyme+/9rw7bf2e45ZZb1K9fP917771+ +lwKgE5WWl6q0vLTpdUn/EklSSf+SptcAooPPI23j8wgAJJeYDBA2b65W//7TOmz/5eUdt29J+v3v +f69HH31Uy5cv1w033KAZM2Z06PEAJI/IoMCmm0pvLvW1HiCR8XkEAICjMYThBNx3333tatenTx/9 ++Mc/1q233trBFQEAgGTD5xEAgF8IEE5AbW1tu9pdc801mjRpkrp3795m2/vuu099+/ZV165dNXTo +UM2aNavFdosXL9a5556rvLw8TZkyRYcPHz6h2gEAQGLg8wgAwC8ECCfAORfV/a1Zs0a///3vtWjR +Iu3bt09vvfWW+vfvf0y7+vp6ff7zn9dNN92kPXv26LrrrtOLL74Y1VoAAEB84PMIAMAvMXkPhFix +fv16vfDCCzIzOec0b948/fznP5dzTmamsWPHauLEiSe9/5SUFNXV1amsrEwFBQUqLCxssd0HH3yg +hoYG3XnnnZKkL3zhCzr//PNP+rgAACB+8HkEABArCBCOY+DAgfr+97/fNF9bW6vvfe97Ud3/Aw88 +oGnTpmnlypW64oor9Ktf/Uq9e/c+qt327dvVp0+fo5YVFRVFrQ4Ax+JpB4mB3yMSAZ9HAACxggDB +Z1OmTNGUKVNUU1Oj22+/XXfddZcee+yxo9r07t1b27ZtO2rZ5s2bddZZZ3VmqUBS4WkHiYHfI9A+ +fB4BALQH90A4Ae0dcxgMBnX48GEFg0E1NDSotrZWwWDwmHZr1qzRrFmzVFdXp/T0dGVlZSkQOPZX +csEFFyg1NVW/+93v1NDQoJdeekn//Oc/T/n9AACA+MPnEQCAX2KyB0JhYbcOfTZyYWG3drX7+OOP +9eyzzzaNOZw9e7buvffepjGHF1xwgS677LJjtvvJT36i6dOny8wkSU899ZSmTp2qe+6556h2tbW1 +uuuuu7R69WqlpaVp/PjxevjhhyVJV199tSZMmKC77rpLaWlpeumll3TbbbfpRz/6ka6++mp94Qtf +OGpfke0BAMCp4/MIn0cAAEezaN/Jt9UDmbmWjtX4nyFiG78nJDObbnJTY+/Pf6zWFati9XyF/301 +v+tIFnwe8RfnGQBiU3s/jzCEAQAAAAAAtCkmhzAAAOILTzsAAABIfAQIAIBTxtMOAAAAEh8BAgBf +8c01AAAAEB8IEAD4im+uAQAAgPjATRQBAAAAAECb6IEAAACSXlFRkcx4mmZHKyoq8rsEAMApiMkA +IRpjohlXDQAA2qu8vNzvEgAAiHkxGSBEY0w046qP9fWvf119+/bVD3/4Q79LAQAAAICkUVtbq8rK +Su3Zs0eDBg1SZmam3yWdlJgMEGJF//79tXPnTm3fvl3du3dvWj5q1CgtXbpU5eXlKiwsjOox6+rq +dNttt+lvf/ub0tPTdf311+vXv/51VOp86KGHolorAAAAAMDjnNP+/ftVWVmpyspKbdtWqY0bd2vL +lkpVV9cqEChQbe0+/fjH6RoyZIjf5Z4UAoTjMDMNGDBAzzzzjL7xjW9IksrKynTo0KEOGyf56KOP +asmSJSovL1daWpr++c9/xmSdAAAAAJCMgsGgqqqqVFlZqV27dmvz5kpt2lSprVsrdfhwqgKBngqF +eiglpYeyswcrO7unCgu7ysy0deszfpd/SngKQxu+8pWv6LHHHmuaf+yxx3TTTTcd1eb111/X6NGj +lZeXp6KiIk2fPr1p3fPPP68zzzxTNTU1kqQ33nhDvXv31ieffNLi8dLS0pSXl6euXbsqKytLEydO +jFqdt9xyi+655x5J0uzZs9WvXz/df//96tWrl/r06aNHH320XccCAAAAgERXW1urbdu2aenSpZo5 +8109/PBz+uEPH9Ttt/8/fe97T+sXv/hIM2Yc0pw5/VVZeaW6d/8vFRV9V/363ayios+qb99x6t79 +LGVm5iXMF7v0QGjDuHHj9MQTT+jjjz/WoEGD9Nxzz2nevHlH3UcgNzdXTzzxhIYNG6aysjJddtll +GjVqlCZNmqR//dd/1WuvvaY777xTv/zlL3XbbbdpxowZKigoaPF4o0eP1u23365p06Zp2rRpUa2z +uZ07d2r//v3avn27Zs6cqS9+8Yv6/Oc/r7y8vHYfFwAAAADilXNONTU1qqys1O7du7VtW6XKy73e +BHv2HJJZgaSecq6HsrKGKzu7h/r0KVAgkJyX0nHxrm26v2lN47f7EydO1NChQ3XGGWcctX7ChAlN +r4cPH64pU6Zo9uzZmjRpkiTpwQcf1IgRI1RSUqLJkyfrqquuavE4VVVVmjRpkv7+979r6tSpMjNN +nTpVktSvXz+9+eabGjZs2EnX2Vx6erp+/OMfKxAI6KqrrlJubq4+/vhjjRkzpl3nBQAAAADiQSgU +0p49e8JBQaU2b65Ueflubd1aqdraVJn1CA876BkedtBDhYWJ03MgWuIiQHBT3Sltf6oBxJe//GVN +mDBBGzdu1Fe/+tVj1i9YsEB33323ysrKVFdXp7q6Ol133XVN6/Py8nTdddfp17/+tV566aVWj/OX +v/xF55xzji6//HKdd955mjBhgsxMN910k4LB4HHDg/bU2VxBQYECgSOjWLKzs5uGWgAAAABALAkG +g2poaGia6uvrW3zdOF9ZWaXyci8s2LmzSqFQF5n1VDDYQxkZhcrOHq3u3XsoLS3b77cWN+IiQPBb +YWGhBgwYoDfeeEMzZsw4Zv2NN96oO++8U2+99ZbS0tL0rW9966h7HCxZskQzZszQ9ddfr//8z//U +G2+80eJxGv+gS1L37t31zjvvaPz48Xr66af1ne9855TrBAAAAIBocc7pwIEDqq2tbdcFfUNDg+rq +GnT4cL1qaxsipnrV1R1ZV1/f0DRfV+etq69vUDDoFAikSUqVWarMvNfefJqc8157P9PkXF7TsIMz +zkjeYQfRxBlspxkzZqiqqkpZWVkKBoNHraupqVF+fn7TUxOefvppXXHFFZKkw4cP6ytf+Yp+9rOf +6eabb9b555+vhx56SF//+tePOcbVV1+tu+++W3/84x91yy23KCUlRePHj9czzzyj7Oz2pWLHqxMA +AAAA2ss5p8OHD6uqqkrV1dXas6dKFRXV2r69Wjt2VKmycq8aGtJllqnGC3lv8i7sj1zQH5k3S1Mg +kKlAIDU8pUW8TlVKypH5tLQ0ZWSkRqxP8fFsQCJAOK7I8S4DBgzQgAEDWlz3hz/8Qd/+9rd1xx13 +aOLEifrSl76k6upqSdIPfvADFRUV6fbbb5ckPfHEE7rkkkt0+eWXa+DAgUcdr3///nrjjTf0ve99 +T9/5znfUpUsXTZkyRbNmzdLnPvc5nXnmmbr88stPus4Teb8AAAAAEl9dXZ2qq6tVXV2tqqoq7d5d +ra1bq7RzZ7UqKqp06JCUkpIv57rJuXylpPRQVtYgZWZ2U69e3ZSSku73W0AnIkA4jg0bNrS4PCUl +5ahv96+99lpde+21Lba9//77j5ofMWKEKisrWz3m+PHjNXfu3GOW792795Tr/POf/9z0euLEidq8 +eXO79gMAAAAgPgWDQe3du7epF0FlZZW2bfN6EFRUVGvfvloFAt1klq9QqJsCgXxlZvZTZmY3de+e +r9TUTL5oRJOYDBBKy0tVWl4qSZpYNFHTSqdJkkr6l6ikf0mn7QMAAAAAYlkoFNL+/fubehDs2VOt +7durtH17tSoqqrVnT43MujQFBFK+MjMHKzMzXzk53ZSfn0tAgHaLyQAhGhf5BAUAAAAAEoFzThUV +FaqsrFRVldd7YPv2au3cWaXKyn0KhbIkeeFAKNRNGRn9lZnZTZmZ3cKPIgy0dQigXWIyQAAAAACA +ZLZv3z6tX79eS5eu16JFG1RTk61A4DQFg92Ulna6MjPPVlZWvnr3zlNKSprf5SJJECAAAAAAgM/q +6+u1adMmrVq1XgsXrteWLfslnan09IHKz79MBQV5fpcIECAAAAAAQGdrHJawdu16LVq0XitWbFUw +2FvSQHXrNlmFhb0ZeoCYQ4AAAAAAAJ2gpqZGGzZs0LJl6/Xhh+u1d2+6pIHKyRmrXr2+pNTUDL9L +BI7L9wChqKiIu37GgaKiIr9LAAAAAOJKQ0ODNm/erNWrvWEJ5eXVkgYoLW2g8vNLVFSU73eJwAnx +PUAoLy/3uwQAAAAAOGXOOVVWVmrduvVatGidli3brPr602R2lvLyPqPCwj4MS0Bc8z1AAAAAAIB4 +dfDgQW3YsEHLl3vDEvbsCci5gcrJGa2ePb+gtLQsv0sEooYAAQAAxAQzu1LSA5ICkh5xzt3XbP0Q +SX+WNFrSD5xz97d3WwCIlmAwqK1bt2r16nVauHC91q//RGb9lZIyUPn5F6mwsDtDtJGwCBAAAIDv +zOvT+6CkSyVtl7TQzF5xzq2OaPaJpP+UdM1JbAsAJ8U5pz179mjduvVavHi9liwpV11dgZwbqLy8 +y9WvXz8FAil+lwl0CgIEAAAQC8ZIWuuc2yRJZvaspMmSmkIA51ylpEoz++yJbgsAJ+Lw4cPasGGD +ysq8YQm7d4fk3EBlZxeroGCy0tKy/S4R8AUBAgAAiAV9JG2JmN8qLxjo6G0BoIlzTjNm/EXz5q2T +c4UKBAaqe/dxKizswbAEQAQIAAAgyUybNq3pdUlJiUpKSnyrBUBs2bVrl+bM2abCwu8pEOBSCYmr +tLRUpaWlJ7wdfysAAEAs2CapMGK+b3hZ1LeNDBAAINLSpStkNozwAAmveYA+ffr0dm3HQ0gBAEAs +WCjpLDMrMrN0SVMkvXqc9pF9iU90WwA4hnNOpaVlys8f5ncpQMwiWgMAAL5zzgXN7A5JM3XkUYyr +zOxr3mr3sJn1kvShpC6SQmb2TUnnOOdqWtrWp7cCIE7t3LlT27c7FRWd4XcpQMwiQAAAADHBOfem +pCHNlv1fxOsKSf3auy0AnIjFi8tkNoybJQLHwRAGAAAAAEnNOafZs1eooGC436UAMY0AAQAAAEBS +2759uyoqUpST08vvUoCYdspDGMwsQ9J7ktLD+3vBOde+WzgCAAAAgM8WLy5TIMDwBaAtp9wDwTlX +K+li59woSSMlXWVmY065MgAAAADoYN7TFxi+ALRHVIYwOOcOhl9myOuF4KKxXwAAAADoSFu2bFFl +ZYZyck7zuxQg5kUlQDCzgJktlrRT0tvOuYXR2C8AAAAAdKSPPlqhQIDeB0B7ROUxjs65kKRRZtZV +0l/N7Bzn3Mrm7aZNm9b0uqSkRCUlJdE4PAAAcaO0tFSlpaV+lwEAkBQKhfTeeyvVo8dNfpcCxIWo +BAiNnHP7zGyWpCslHTdAAAAgGTUP0KdP577DAOCXzZs3q6oqR0VFPfwuBYgLpzyEwcx6mFle+HWW +pMskrT7V/QIAAABAR/KGLwzzuwwgbkTjHgi9Jc0ysyWSFkh6yzn3ehT2CwAAAAAdIhQKafbslerR +gwABaK9THsLgnFsuaXQUagEAAACATlFeXq59+/KUn9/d71KAuBGVpzAAAAAAQDz58EOGLwAnigAB +AAAAQFIJBoOaM2eVevYkQABOBAECAAAAgKSyceNG1dR0V2ZmN79LAeIKAQIAAACApLJwYZlSUuh9 +AJwoAgQAAAAASaOhoUFz537M8AXgJBAgAAAAAEgaGzZs0MGDPZWR0dXvUoC4Q4AAAAAAIGksWFCm +1NThfpcBxCUCBAAAAABJoaGhQfPnr1HPnuf4XQoQlwgQAAAAACSFtWvX6vDh05Wenut3KUBcIkAA +AAAAkBQWLFihtDSGLwAniwABAAAAQMKrr6/X+++vVY8eQ/0uBYhbBAgAAAAAEt6aNWtUV9dX6ek5 +fpcCxC0CBAAAAAAJ74MPVig9fZjfZQBxjQABAAAAQEKrra3VggXrGb4AnCICBAAAAAAJzRu+UKi0 +tCy/SwHiGgECAAAAgIT2/vsrlJnJ8AXgVBEgAAAAAEhYhw8f1sKFG9Wjx9l+lwLEPQIEAAAAAAlr +9eqPVV/fX6mpmX6XAsQ9AgQAAAAACWv+/DJlZQ33uwwgIRAgAAAAAEhIhw4d0qJFm1VQMNjvUoCE +QIAAAAAAICGtWrVaweCZSk3N8LsUICEQIAAAAABISPPmlSk7m+ELQLQQIAAAAABIOAcOHNCSJdtU +UDDI71KAhEGAAAAAACDhrFy5SsHgWUpJSfe7FCBhECAAAAAASDhz565QTs4wv8sAEgoBAgAAAICE +UlNTo+XLd6h797P8LgVIKAQIAAAAABLKihUrFQoNVkpKmt+lAAmFAAEAAABAQpkzZ4Vycxm+AEQb +AQIAAACAhLFv3z6tXLlL3bsP9LsUIOEQIAAAAABIGGVlKxUKDVEgkOp3KUDCIUAAAAAAkDDee69M +XbowfAHoCAQIAAAAABJCdXW1Pv54j/Lzz/S7FCAhESAAAAAASAhlZSvl3NkKBFL8LgVISAQIAAAA +ABLC7Nllyssb7ncZQMIiQAAAAAAQ9/bs2aO1a/eqW7f+fpcCJCwCBAAAEBPM7EozW21ma8zs+620 ++a2ZrTWzJWY2KmJ5uZktNbPFZvbPzqsaQKxYtmyFzM6RGZc4QEfh2SYAAMB35n3if1DSpZK2S1po +Zq8451ZHtLlK0kDn3CAzGyvpIUnjwqtDkkqcc1WdXDqAGPHeeyuUl3el32UACY14DgAAxIIxktY6 +5zY55+olPStpcrM2kyU9LknOuQWS8sysV3idic81QNL65JNPtHHjAeXlFfpdCpDQ+I8WAADEgj6S +tkTMbw0vO16bbRFtnKS3zWyhmf17h1UJICYtXVomieELQEdjCAMAAEgEFzrndphZT3lBwirn3Fy/ +iwLQOWbPXqFu3T7rdxlAwiNAAAAAsWCbpMi+x33Dy5q36ddSG+fcjvDP3Wb2srwhES0GCNOmTWt6 +XVJSopKSklOrHICvdu3apU2bDquoqF/bjQFIkkpLS1VaWnrC2xEgAACAWLBQ0llmViRph6Qpkq5v +1uZVSd+Q9JyZjZNU7ZyrMLNsSQHnXI2Z5Ui6XNL01g4UGSAAiH9Ll66Q2TCZmd+lAHGjeYA+fXqr +/20ehQCb51/6AAAgAElEQVQBAAD4zjkXNLM7JM2Ud4+mR5xzq8zsa95q97Bz7nUzu9rM1kk6IOmW +8Oa9JL1sZk7eZ5unnHMz/XgfADqXc06zZ69Qfv41fpcCJAUCBAAAEBOcc29KGtJs2f81m7+jhe02 +ShrZsdUBiEUVFRXatq1BhYXN77kKoCNwm1IAAAAAcWnJkhWSGL4AdBYCBAAAAABxxzmn0tIyde8+ +3O9SgKRBgAAAAAAg7uzYsUM7d5pyc0/3uxQgaRAgAAAAAIg7ixfz9AWgsxEgAAAAAIgrjU9fKChg ++ALQmQgQAAAAAMSVbdu2adeuVOXknOZ3KUBSIUAAAAAAEFc++qhMgcBwhi8AnYwAAQAAAEDc8IYv +rFRBwTC/SwGSDgECAAAAgLixZcsW7dmTpZycnn6XAiQdAgQAAAAAcWPRojKZ0fsA8AMBAgAAAIC4 +EAqFNHv2SvXoQYAA+IEAAQAAAEBc2LRpk/bu7aLs7AK/SwGSEgECAAAAgLiwaNEKBQL0PgD8QoAA +AAAAIOaFQiHNmbOK4QuAj045QDCzvmb2DzNbYWbLzezOaBQGAAAAAI02btyoffu6KSsr3+9SgKSV +GoV9NEj6tnNuiZnlSlpkZjOdc6ujsG8AAAAA0IcfMnwB8Nsp90Bwzu10zi0Jv66RtEpSn1PdLwAA +AABIUjAY1Ny5q9WzJwEC4Keo3gPBzPpLGilpQTT3CwAAACB5bdiwQTU1BcrMzPO7FCCpRWMIgyQp +PHzhBUnfDPdEOMa0adOaXpeUlKikpCRahwcAIC6UlpaqtLTU7zIAIK4sXLhCKSnD/S4DSHpRCRDM +LFVeePCEc+6V1tpFBggAACSj5gH69OnT/SsGAOJAQ0OD5s37WD17Xup3KUDSi9YQhhmSVjrnfhOl +/QEAAACA1q9fr4MHT1NGRhe/SwGSXjQe43ihpBslXWJmi83sIzO78tRLAwAAAJDsFiwoU2oqwxeA +WHDKQxicc/MkpUShFgAAAABoUl9fr/nz16pnzyv8LgWAovwUBgAAAACIlrVr16q29gylp+f6XQoA +ESAAAAAAiFELFqxQWtowv8sAEEaAAAAAACDm1NXV6YMP1qlnz6F+lwIgjAABAAAAQMxZs2aN6ur6 +KS0t2+9SAIQRIAAAAACIOe+/v0Lp6QxfAGIJAQIAAACAmFJbW6uFCzeoR4+z/S4FQAQCBAAAAAAx +5eOPP1Z9fZHS0rL8LgVABAIEAAAAADFl/vwVyswc7ncZAJohQAAAAAAQMw4fPqxFi8pVUDDE71IA +NEOAAAAAACBmrFq1WvX1A5SamuF3KQCaIUAAAAAAEDPmzStTdjbDF4BYRIAAAAAAICYcPHhQixdv +UUHBYL9LAdACAgQAAAAAMWHVqtUKhc5SSkq636UAaAEBAgAAAICYMHdumbKzh/ldBoBWECAAAAAA +8N2BAwe0bNl2de8+yO9SALSCAAEAAACA71asWKlgcJBSUtL8LgVAKwgQAAAAAPhu7twVys1l+AIQ +ywgQAAAAAPhq//79KiurUPfuZ/ldCoDjIEAAAAAA4KsVK1bKucEKBFL9LgXAcfA3FAAAAICv5sxZ +odzci/wuA2iVc1JDg1Rbe/RUV3fsspaWN85nZ1+q7363yu+3c9IIEAAAAAD4Zu/evVq5crf69Rvo +dylIQMFg+y74m69rqV1KipSRIaWnez8jp8hlubmtt6usnC1phN+n5aQRIAAAAADwTVnZSjl3tgKB +FL9LQQdxTgqFvG/w2zPV17e/7fH2UVvrHbulC/nmF/h5ea23a2ybEoU/ovv2NZz6TnxEgAAAAADA +N3PmrFDXrhf7XUbCaOxqHwweO0VrefM27ZnMpNTUk58yMqScnGOXp6Udf5vUVO/YiA4CBAAAAAC+ +qK6u1po1VerXb4DfpXSKYPBI1/jIn60ti5yvr2/fxb5z3jflKSnexXPj68jpeMsDgWPbZGQcf9vj +XcQ3TgFu358QCBAAAEBMMLMrJT0g7ylRjzjn7muhzW8lXSXpgKSbnXNL2rstgNizfPkKOTdUZrF5 +dXkqF/wttQmFju46n55+7OvG+ZycY5e3JwQIBPjGHR2HAAEAAPjOvKuHByVdKmm7pIVm9opzbnVE +m6skDXTODTKzsZL+V9K49mwLIDbNnl2mrl0v79BjhELSoUPedPDgkdctzR86JB0+fOSCv3H8fORF +fksX++npR1/wtxQONH6Lz8U94hkBAgAAiAVjJK11zm2SJDN7VtJkSZEhwGRJj0uSc26BmeWZWS9J +A9qxLYAYs2fPHq1fv1+FhUXtah8KeRf3bQUAzZfX1UlZWUem7Oyj57t2PXp5ZiYX/EBrCBAAAEAs +6CNpS8T8VnmhQltt+rRzWwAxpL5eevPN9dq9+wLV1wfaFQjU1noX9c0DgMapR4+Wg4KMDEIAIFoI +EAAAQLw6qUuCadOmNb0uKSlRSUlJlMoBcDwbNkhvveVNpaWS2dlKT09Xbu7RoUB+vnTGGccGBZmZ +3IgPiJbS0lKVlpae8HYECAAAIBZsk1QYMd83vKx5m34ttElvx7ZNIgMEAB2npkaaNetIaLB/v3T5 +5dJ110kPPyw9/fRLWrt2jHr2HOp3qUDSaR6gT58+vV3bESAAAIBYsFDSWWZWJGmHpCmSrm/W5lVJ +35D0nJmNk1TtnKsws8p2bAugg4VC0tKlRwKDDz+Uzj9fuuIK6S9/kUaMOLoHwac+VawlS5YRIABx +hAABAAD4zjkXNLM7JM3UkUcxrjKzr3mr3cPOudfN7GozWyfvMY63HG9bn94KkFR27ZJmzvQCg5kz +pW7dvF4G//3fUkmJlJvb+rbDhp2jtLS3VF9/SGlpWZ1WM4CTR4AAAABignPuTUlDmi37v2bzd7R3 +WwDRV1cnzZ9/pJfBhg3SJZd4vQzuvVcaMKD9+8rMzNQFFwzUggWr1Lv36I4rGkDUECAAAAAAaNW6 +dUcCg9mzpSFDvMDgt7+Vxo6V0tJOft8XXFCsOXMWSCJAAOIBAQIAAACAJvv2HX3zw0OHvMDghhuk +GTO8xyVGy6BBg5Sd/aoOH96rzMy86O0YQIcgQAAAAACSWCgkffTRkcBg8WJp3DgvNPjrX6XhwyU7 +qYemti01NVUTJgzV22+XqW/fCzvmIACihgABAAAASDI7dhy5+eHbb3u9Cq64Qrr7bmniRCk7u/Nq +GTt2hN544w1JBAhArCNAAAAAABJcba00d+6RXgabN0uXXuqFBj/7mVRY6F9tRUVF6tnzsGpqKpSb +28u/QgC0iQABAAAASEB79kgvvCC98oo0Z440bJj3iMWHHpLGjJFSY+RKwMx08cXD9Ze/LCdAAGJc +wO8CAAAAAETHwYPSc89Jkyd7j1R85x3pppuk8nLp/fel6dOl8eNjJzxodO65I+Tccjnn/C4FwHHE +2D8dAAAAAE5EQ4P07rvSU09Jr73m9S644QbpiSekrl39rq59evXqpQEDMlVVtVnduhX5XQ6AVtAD +AQAAAIgzzkkffCDdeafUt690zz3SeedJq1Z59zi46ab4CQ8alZQUq7p6md9lADgOeiAAAAAAcWL1 +aq+nwdNPe8MQbrzRuzniWWf5XdmpGzmyWGb/q1DoKgUCXKYAsYi/mQAAAEAM27ZNevZZLzTYsUO6 +/nrp+eel0aMlM7+ri568vDwVF/fShg3r1KPH2X6XA6AFBAgAAABAjKmull580ettsGSJ9PnPS7/4 +hTRxopSS4nd1HWfChGItX76MAAGIUQQIAAAAQAw4fFj629+8ngbvvitddpl0xx3S1VdLmZl+V9c5 +hg07R6mpM9XQcFipqUnypoE4QoAAAAAA+CQYlGbN8noavPKKNyzhxhulGTOkbt38rq7zZWVlaezY +M7Vw4Sr17j3K73IANEOAAAAAAHQi56QPP/R6Gjz7rPcUhRtukH76U+mMM/yuzn/jxxdr3ryFkggQ +gFhDgAAAAAB0grVrjzxBwTmvp0FpqTRkiN+VxZbBgwcrO/s11dbuU0ZGnD2LEkhwAb8LAAAAABLV +jh3SAw9I558vfepT3s0Rn3xSWrNGmjaN8KAlqampmjBhqHbtKvO7FADNECAAAAAAUbR3r/TnP3s3 +QTznHO8pCv/zP9LWrV6YMGZMYj1+sSOMGVOsUGiZ32UAaIYhDAAAAMApqq2VXn/dG6Lw9tvSJZdI +t98uvfqqlJXld3Xxp3///iooOKgDB3YpJ+c0v8sBEEYPBAAAAOAkHDok/fWv0pe/LJ1+uvTb30pX +XimVl0svvyxddx3hwckyM5WUDNcnnyz3uxQAEQgQAAAAgHY6eFB68UXp+uul3r290ODCC6VVq7zH +Md52m5Sf73eVieG880bIueVyzvldCoAwhjAAAAAAx1FT4w1PeOEF6a23vHsYXHed9JvfSKfRu77D +9OrVS4WF6dq3b4vy8gr9LgeA6IEAAAAAHGP/fumZZ6Rrr5X69JFmzJCuuEJav967x8HttxMedDQz +08UXF6u6mpspArGCAAEAAACQ9/SEJ5+UJk/2QoMnn5QmTZI2bpTefFO69VapRw+/q0wuI0cWS1qp +UCjodykAxBAGAAAAJLGqKumVV7zhCe+9J118sfTFL0qPPSZ16+Z3dejWrZuGD++pjRvXqUePIX6X +AyS9qPRAMLNHzKzCzOhfBAAAgJj2ySfSI49IV10l9e/vPWrxhhukrVu9MOErXyE8iCUTJhTrwAEu +M4BYEK0eCH+W9DtJj0dpfwAAAEDU7N7tPVrxhRekBQukyy+Xbr5Zev55qUsXv6vD8QwfPkwpKW+r +oaFWqakZfpcDJLWoBAjOublmVhSNfQEAAADRsHPnkdBg0SLpyiu9mx++/LKUk+N3dWivrKwsjR07 +QIsWrdLpp4/0uxwgqXEPBAAAACSM7dull17yQoMlS6TPfEa64w4vPMjK8rs6nKzx44s1f/4iSQQI +gJ86NUCYNm1a0+uSkhKVlJR05uEBAPBdaWmpSktL/S4DSChbthwJDVaskD77Wenb3/aGKWRm+l0d +omHw4MHKzHxNtbX7lZHBmBPAL74FCAAAJKPmAfr06dP9KwaIY5s2SS++KP3lL9KaNd7jFu++W7r0 +UimDYfIJJy0tTRMnDtU775Spb98L/C4HSFrRDBAsPAEAAABR5Zy0erX3xIQXX5Q2bJCuuUaaNs17 +9GJ6ut8VoqONGVOst956WxIBAuCXqAQIZva0pBJJBWa2WdJU59yfo7FvAAAAJKeGBmnePC80ePVV +6fBhr6fBT38qlZRIaWl+V4jO1L9/f+Xn1+jAgd3KyenpdzlAUorWUxhuiMZ+AAAAkNz27ZPeessL +DF5/Xerf3wsNnn9eGjlSMvq7Jq1AIKBLLinWSy8tV07OJX6XAySlgN8FAAAAILlt3iz9/vfSFVdI +ffpIM2ZI48d7T1FYtEiaOlUaNYrwANK55xYrFFom55zfpQBJicc4AgAAoFM5Jy1eLL3yitfTYMsW +73GLt9/uPUmhCzfZRytOP/10FRamad++LcrLK/S7HCDpECAAAACgw9XWSrNmHbmfQXa2NHmy9Nvf +ShdcIKXyqRTtYGa6+OJiPf74cgIEwAf8Uw0AAIAOUVnp3cfg1Veld96Riou9+xm8+640ZIjf1SFe +jRxZrMcf/6NCoSsVCKT4XQ6QVAgQAAAAEDVr1hzpZbB0qfTpT3uhwUMPST25cT6iID8/X+ec00Ob +N69XQcFgv8sBkgoBAgAAAE5aMCi9//6R0GD/fulzn5Puvlu6+GIpM9PvCpGIJk4s1h/+sIwAAehk +BAgAAAA4ITU10syZXmDw9797T06YNEl68klp9GgpwHO+0MGGDx+m1NR31dBQq9TUDL/LAZIGAQIA +AADatG2b9NprXmgwd640bpwXGkyfLhUV+V0dkk12drbOP79Iixev1umn/4vf5QBJgwABAAAAx3DO +u4dB49CEjRulq66Sbr5ZeuYZKS/P7wqR7C68sFgffLBYEgEC0FkIEAAAANBk+3bp0UelGTO8EGHy +ZOmXv5QuvFBKS/O7OuCIIUOGKDPzb6qrq1F6eq7f5QBJgRFqAAAASa6+XnrlFe/mh8OGSeXl0tNP +S+vWSfffL5WUEB4g9qSlpelTnzpbu3aV+V0KkDTogQAAAJCk1q6VHnlEeuwxaeBA6dZbveEJuXyZ +izgxdmyx3n77XUnj/C4FSAoECAAAAEnk4EHphRe84GD1aumrX5X+8Q9p6FC/KwNO3IABA9St2z4d +PFip7OwefpcDJDyGMAAAAF+ZWb6ZzTSzj83sLTNr8fZ8Znalma02szVm9v2I5VPNbKuZfRSeruy8 +6uODc9KiRdLXvy717Ss9+6z0zW9KW7ZIv/gF4QHiVyAQ0CWXFKuycrnfpQBJgQABAAD47S5J7zjn +hkj6h6S7mzcws4CkByVdIWmYpOvN7OyIJvc750aHpzc7o+h4UFUlPfigNGqU9MUvSmec4T1Z4fXX +pWuvldLT/a4QOHXnnlusUGiZnHN+lwIkPAIEAADgt8mSHgu/fkzSNS20GSNprXNuk3OuXtKz4e0a +WceWGD9CIW9Iwo03SgMGSPPmeU9RWL9e+vGPpX79/K4QiK7evXurX78U7du31e9SgIRHgAAAAPx2 +mnOuQpKcczslndZCmz6StkTMbw0va3SHmS0xsz+1NgQi0W3bJv30p9KgQdJ//Zc0dqwXGjzzjPTp +T0sBPvUhQZmZLr64WFVVDGMAOho3UQQAAB3OzN6W1CtykSQn6UctND/Rfsh/kHSvc86Z2U8k3S/p +1tYaT5s2rel1SUmJSkpKTvBwsaO+Xvr736U//UmaP1+67jrv/gbnnScZfTKQREaNGqEnnviTQqEr +FAik+F0OEPNKS0tVWlp6wtsRIAAAgA7nnLustXVmVmFmvZxzFWZ2uqRdLTTbJqkwYr5veJmcc7sj +lv9R0mvHqyUyQIhXa9YcefzioEHe4xefe07KyfG7MsAf+fn5Gjq0u7ZsWa+CgsF+lwPEvOYB+vTp +09u1HZ3ZAACA316VdHP49U2SXmmhzUJJZ5lZkZmlS5oS3k7h0KHRtZLKOq5U/xw44AUGEyZ4k3NS +aak0Z450882EB8DEicXav59hDEBHogcCAADw232Snjezf5O0SdK/SpKZ9Zb0R+fcZ51zQTO7Q9JM +eV+APOKcWxXe/udmNlJSSFK5pK919hvoKI2PX/zTn6Tnn5cuuED61rekz35WSkvzuzogtgwfPkyp +qf9QMFinlBQeMQJ0BAIEAADgK+fcHkmfbmH5DkmfjZh/U9KQFtp9tUML9MGePdKTT3rDFPbvl/7t +36Rly6S+ff2uDIhdOTk5OvfcQi1btlq9eo3wuxwgITGEAQAAIAaEQtK770o33CCdeab0wQfS/fdL +69ZJP/oR4QHQHhddVKxDh5b5XQaQsOiBAAAA4KOtW6VHH5VmzJC6dJFuu0168EGpe3e/KwPiz5Ah +Q5SZ+XfV1dUoPT3X73KAhEOAAAAA4KNf/Uo6dMi7x8G55/L4ReBUpKen66KLhmj27BXq02es3+UA +CYcAAQAAwEe//rXfFQCJZdy4Yr377ixJBAhAtHEPBAAAAAAJ48wzz1Re3l4dPPiJ36UACYcAAQAA +AEDCCAQCuuSS4aqsXO53KUDCIUAAAAAAkFDOPbdYodAyOef8LgVIKAQIAAAAABLKGWecoT59TPv3 +b/O7FCChECAAAAAASChmpksvHaGqKoYxANFEgAAAAAAg4YwcWSznyhQKBf0uBUgYBAgAAAAAEk73 +7t119tn5qqra4HcpQMIgQAAAAACQkEpKirV/P8MYgGghQAAAAACQkIqLhyslZY2CwTq/SwESAgEC +AAAAgISUk5Ojc8/tp8rK1X6XAiQEAgQAAAAACeuii4p16BDDGIBoIEAAAAAAkLDOPvtsZWZuUV3d +Ab9LAeIeAQIAAACAhJWenq4LLxys3btX+F0KEPcIEAAAAAAktHHjitXQsMzvMoC4R4AAAAAAIKEN +HDhQXbtW6dChPX6XAsQ1AgQAAAAACS0QCOjii4dr925upgicCgIEAAAAAAnvvPOKFQotk3PO71KA +uEWAAAAAACDh9enTR2ec4bR//3a/SwHiFgECAAAAgIRnZrr00hGqqmIYA3CyCBAAAAAAJIWRI4sl +lcm5kN+lAHGJAAEAAABAUigoKNDgwXmqqtrgdylAXCJAAAAAAJA0Jk4s1r59DGMATgYBAgAAAICk +MWLEcKWkfKxgsM7vUoC4Q4AAAAAAIGnk5uZq1Ki+qqz82O9SgLhDgAAAAAAgqVx0UbEOHWIYA3Ci +CBAAAAAAJJVzzhmqjIzNqqs74HcpQFwhQAAAAACQVNLT03XhhYO0e/cKv0sB4kqq3wUAAJKbc67F +KRQKHXf+RNtIUm1trTIyMnx+xwCAWDBuXLFmzZojaYzfpQBxgwABQFxovBBsbQoGg8ddf7LtgsGQ +JGnmzHfDNXhT5OvI+dbaHG/9yf6UpKlTH2o6R43LIs9ZpFNd3+72edK3vvWrplqDwVDExbyL+F0e +uciX7KjJLNCuZVJAZkfmnWupXXi+UFq8eLHGjRsnAAAGDhyorl1f0aFDVcrKyve7HCAuECAA8EUo +FFJVVZUqKiq0Y8curV9fIUn65jd/2XTh7k1BBYPexaZ3YRiQWUBmKfIuDL155wJN671lR9ZHTs5F +zqe0uNy5xvnw+gHSM8+kN12oxspPdf0PHTjw+fAZtaPOr9fmqCUnvP7oJkfPm5lSUlrb/r+Vmfnv +arzoP7b+lpY1r6cj3KpQKNQJxwEAxIOUlBRNnDhMf/vbchUWTvC7HCAuECAA6HAHDhxQRUWFKip2 +qby8QuvWVWjLlt1qaMiR1Euh0GnKzh4m9ZKys7+mQCAlfJF5ZOq8i8yWFRV9yrdjH09u7ul+l9Ci +jIyufpcAAECbzj+/WK+++oqc+5SvnzOAeEGAACBq6uvrtXv3blVUVGjbtl1au7ZC5eUV2rs3qECg +l5zrpbS0PsrJGa3TTjtNqanHjkXPyOjiQ+UAACAZ9e3bV6efHlRNzQ516XKG3+UAMS8qAYKZXSnp +AXn9fx9xzt0Xjf0CiE3OuabhBzt3esMP1q+vUEXFXkkFknpJOk05ORcoN7eXunXrQqoPAABijpnp +0ktH6OmnlxMgAO1wygGCeX2LH5R0qaTtkhaa2SvOudWnum8A/jt48GA4KKjQ5s27tG5dhTZv3q36 ++ixJveTcacrMHKrc3BL17VugQCClzX0CAADEilGjivXUU/+/vTsPkuMs7zj+e+baS5a0knZWQgq2 +iG0ZyzLGFQ5zxOsQFRQhmBxFYVIVrn+SQCAJRXGZkrZCVTBFDhL+SYwxkAoBQg4wFQimYF2FU6QA +IyyD41jS6iztzmolraxdaY+ZJ390z+zsMdvTu7PTs9rvp6qru99+u/vd1mr2eZ/p7vfzct8fPjYJ +oJZG3IHwUknPuvsJSTKzL0u6VxIJBGANmZmZmfP4wZEjwxocHNbFi9OVxw8ymR3asOEO9fTklcm0 +J91khEqV0RE8Yr2eOvWtS7OjLnhYNjtKwyaN+uiccrfyaAs+51juLq+azx6vXM/nnKdSP6wz27b5 +2xYeX6mblrqMAIB1atu2bbrppo0aHh7Uli2/nHRzgJbWiATCTkmnqtZPi8FUsc65S8WiND0tzczM +zsvTaq7XU3dyckYTExO6cmVSzz03qfHxSV29OiP3nKS83H9J6XSb0uk2pVIZuVvl54qaL7fO9LYn +pNfcqI/bXqmqc+jmc9ZVY93Ng6Lydqvu8M5bt7mdzEX3sapzaKP6talquzT3/HWUzSlfQdmcY0v9 +ZnMHQPBw3cuF89cXK1vGenk2v0647TN+U7Ds1eVVIy6U9ysvl0eWmHMOk8lm65TrV+pZ5by24Biz +9SvbiiS9AACLu+ee2/Xgg4dJIAARmvoSxYMHD1aW+/r61NfX18zTY40pd8Cnp6WpqdnlpaZyver6 +88uaVSeVkrLZYMpkgqnWciPXOzqi6z/55FM6fPioisWiUilp69bt2rBhpzo6NqmtbaPS6eCjwar6 +bNXLteYrqTOT2qOHXPod/0rQbax0BqVUeai/cL28vbIedjDDkqCuV62FncjKexjcKsdU+chedczy +PmEH9W/tev2JTs6eq6K6fRFl0rzyZZb5bNmfW0oHNDehMP+UNddXUb+ZDniNdiWov0XewzEwMKCB +gYGkmwEAqHL77bfJbEDF4rTS6WzSzQFaViMSCGckPb9qfVdYtkB1AgGN5T7biS1/y7xay/V24lc6 +SbMd8GxWyuXmrs+fqreXl2vNy8vt7dF16jnOYvNUCz9C99a33qFS6XZduHBBIyMjGhoq6PjxQxoc +LOjMmVGVStdJyqtUyqujo0ddXXl1dm5TKrWaOccuyY7ohX7bKp5jmeySNvmmpFuxkEm18gdoXfMT +6P39/ck1BgAgSdqwYYNe/OKdevrpZ5TPt2AsArSIRvQGfiTpRjO7XtJZSW+RdF8DjpuI8q3nU1PN +m8qd7sXK6+3Ql0pzv2Wu/ua7upNda1vc5Y4OaePG+jrzy53SvItvVaVSKW3dulVbt27VLbfcUikv +lUo6f/68CoWChodHdOzYMzpx4gc6c+a83DdJ6glfnFhOLGxd5cQCAADA6nvVq/bpJz85LIkEAlDL +iqN+dy+a2XskfUezwzg+veKWNcFf/qX0qU8t7MinUkEHuNFTZ+ds5zpqitvpT6dnbwUHViKVSmnb +tm3atm2bbr1VuueeoLxYLFYSC0NDIxocfFqDg4/pzJmLct+scmKhoyOvrq4edXQwIgMAAFg7br31 +hcrlvqXp6Qlls51JNwdoSQ352tDdvy1pTyOO1Uzvepd0330LO+588w0slE6n1dPTo56eHu3dO1s+ +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>The patterns here are very similar. With the exception of noting that stocks can go to nearly 400% after an earnings announcement (most likely this included a takeover announcement, etc.), we still see large min/max bars and wide standard deviation of returns.</p> +<p>We'll repeat the pattern for stocks going up for both 8 and 3 days straight, but at this point, the results should be very predictable:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[11]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">study_trend</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:51 Time: 0:20:51 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +hBL7fpfO3h/g3V2i+3gNye1Xd2ufLPm9uRt418weBE4A3ki87h8m9iciIpJ2zBs/SkRERKRvEuM9 +vAPM1BgDIiIiAuq5ICIiIofBzM7BG9zwZwoWREREpJ16LoiIiIiIiIhIv6jngoiIiIiIiIj0i8IF +EREREREREekXhQsiIiIiIiIi0i8KF0RERERERESkXxQuiIiIiIiIiEi/KFwQERERERERkX5RuCAi +IiIiIiIi/aJwQURERERERET6ReGCiIiIiIiIiPSLwgURERERERER6ReFCyIiIiIiIiLSLwoXRERE +RERERKRfFC6IiIiIiIiISL8oXBARERERERGRflG4ICIiIiIiIiL9onBBRERERERERPpF4YKIiIiI +iIiI9IvCBRERERERERHpF4ULIiIiIiIiItIvKQkXzOwCM1trZuvN7NaDtJtlZhEz+2wqjisiIiLp +51DnHWZ2jJm9amatZvbtw3muiIiIHBlzzvVvB2YBYD1wDrAdWA7Mdc6t7aHd80ALsMg592S/Diwi +IiJppy/nHWY2ASgFLgP2Oud+2tfnioiIyJFJRc+Fk4ENzrktzrkI8AhwaQ/tvgE8DuxMwTFFREQk +PR3yvMM5t8s5twKIHu5zRURE5MikIlwoBrYmLdck1nUws8nAZc65XwGWgmOKiIhIejrkeccAPVdE +REQOImOQjnMnkHxdY68Bg5n17zoNERGREco5p4B+EOhcREREpHe9nY+kIlzYBpQkLU9JrEt2EvCI +mRkwAbjQzCLOuad6KTYFZUmqLFiwgAULFvhdhvhAn3360mc/9Hj/hAp9O+/o93N1LjL06O+l9KXP +Pn3psx96DnY+kopwYTlwtJmVAjuAucDVyQ2cc9OSirkX+EtvwYKIiIjIQRzyvKOb5LOgw32uiIiI +9FG/wwXnXMzMbgKewxvD4R7n3Boz+7q32d3d/Sn9PaaIiIikp76cd5hZIfAmMAqIm9k/Acc55xp7 +eq5PL0VERGREScmYC865JcAx3db9ppe2/5CKY8rgmTNnjt8liE/02acvffYylB3qvMM5VwdM7etz +ZXjQ30vpS599+tJnP7zYULum0MzcUKtJRETEb2amAR0Hic5FREREenaw85HBultEv5WVlbFlyxa/ +y5BDKC0tpaqqyu8yREREUk7nIoND5xIiIsPTsOm5kEhIfKhIDoc+JxGRgaGeC4NH5yL+0vssIjJ0 +Hex8JDDYxYiIiIiIiIjIyKJwQURERERERET6ReGCiIiIiIiIiPSLwgURERERERER6ReFCyIiIiIi +IiLSL8PmVpTd/fCHd1JdvW/A9l9SMoYf/eibA7b/wTJv3jymTp3Kj370I79LERERGXF0PtI3Oh8R +ERn5hm24UF29j7KyBQO2/6qqgdt3u1/+8pfcd999vPvuu3zhC19g0aJFA35MERERSR2dj4iIyEBw +zhGNRgmHw7S2thIOhw+Yb2lppakpzP79rTQ2hjnppI9w4okzfKt52IYLQ9kdd9zBrbfeesh2xcXF +/OAHP+DZZ5+lpaVlECoTERGRdKHzERER/0UiET744AOampq6hAMtLWEaGrxwoLHRe2xqCtPc3Epz +s7c9GjUCgSwgC7NsIAvIxrmsxJRNMDiKjIyJNDRsIy9vs8KFkSYcDvep3WWXXQbA8uXL2bZt20Hb +3nHHHfz85z+noaGB4uJi7rrrLs4666wD2r399ttcf/31bNy4kQsvvBAzO/wXICIiIsOezkdERAaP +c47GxkZqa2upra1j48ZaKivr2L59LzAOGIWZFwzE415QkJExjoyMbILBLDIyssnIyCIYzGLUqGzG +js0iEDjcr+tbU//CDoPChQHgnEvp/tavX88vf/lLVqxYQWFhIdXV1cRisQPaRSIRLr/8cr797W9z +44038qc//Ymrr76a+fPnp7QeERERGfp0PiIiMjBisRi7du2itraWmpo61q+vpaqqjoYGh1khzhWR +lXU0+fmfZMqUCUcQEgxP6fEqB1hlZSWPP/44ZoZzjr///e/85Cc/wTmHmXHKKadw5plnHvH+g8Eg +bW1trF69mvHjx1NSUtJju2XLlhGNRrn55psBuOKKK5g1a9YRH1dERHpXUVVBRVVFx/ycsjkAzCmb +0zEvMph0PiIiknotLS3U1tayY0ctmzd7PRJqanYTixUAhUAReXmnkp9fxJgxo9K6p5bChRSYPn16 +l2saw+Ewt9xyS0r3f+edd7JgwQLef/99zj//fP7zP/+TSZMmdWm3fft2iouLu6wrLS1NWR0iIsPB +YH3pT96fLTQqrqtI2b5FjoTOR0REjlw8Hmfv3r3U1taybVstGzbUsWlTLXv2hBO9EQoJhaaSnz+L +oqKjCAZDfpc85ChcGCbmzp3L3LlzaWxs5Gtf+xrz58/n/vvv79Jm0qRJB1wrWV1dzdFHHz2YpYqI ++Epf+kUGjs5HRGQkqaur45VX3mTduh1s2bKTSCQXKMK5InJzTyQ/v4iSkjFp3RvhcAT8LmAk6us1 +jrFYjNbWVmKxWMdtRnq6dnH9+vW8+OKLtLW1kZmZSU5ODoHAgR/daaedRkZGBj//+c+JRqM8+eST +vPHGG/1+PSIiIjL86HxERKRnu3fv5oEHHmf+/Ad55pnR7Nz5aSZO/DYlJd+kpGQupaVzmDjxWHJy +xipYOAzDtudCScmYAb33c0nJmD63XbduHY888kjHNY5Lly7lRz/6Ucc1jqeddhqf/vSnD3jej3/8 +YxYuXNjxB/b3v/89t99+Oz/84Q+7tAuHw8yfP5+1a9cSCoU4/fTTufvuuwG46KKLmD17NvPnzycU +CvHkk09y/fXX8/3vf5+LLrqIK664osu+ktuLiIhI/+h8ROcjIjJ87Nu3jyVLlvLcc+swO40pUz5D +MJjpd1kjhqV6JOH+MjPXU03t/1DK0KbPSUSGEltouNsH/u+kwThO4u9X/XwyCHQu4i+9zyKSavv3 +7+eFF17m6affJR6fxeTJp5ORke13WSm1Y8dbnHnmVr7whUsH9DgHOx8Ztj0XRERERERERHrT3NzM +iy/+naeeeou2to8zadJNZGbm+V3WiKVwQUREREREREaMcDjMyy+/xh//+AbNzcdRVHQDWVmj/S5r +xFO4ICIiIiIiIsNeJBLhtdfe4PHHX6Wh4WgKC7/KxIlj/S4rbShcEBGRQVNRVUFFVUXHfPstI5Nv +HykiIiJyOKLRKG+++RaPPfYyu3dP5aijrqOsbKLfZaUdhQsiIjJokkMEW2hUXFfhaz0iIiIyfMXj +cVaufIfHHlvKjh0TmTDhC5SXT/K7rLSlcEFEBp1+vT48g/V+6XMRERGR4cA5x+rV7/GHP1SwZUs+ +48Z9lvLyEr/LSnsKF0Rk0OnX68MzWO+XPheRgystLcVMdwMdaKWlpX6XICJDlHOO9evX84c/vMiG +DUEKCi6krGya/m4eIoZ1uJCKX9n0S52IiIj0RVVVld8liIikrU2bNvHEE39j9eoIo0adTVnZhxUq +DDHDOlxIxa9s+qXuQDfccANTpkzhe9/7nt+liIiIiIhIGtu6dSt//OPfWLGigdzcOZSVHa9QYYgK ++F3ASFBWVkZ2djZ79uzpsv7EE08kEAhQXV2d8mO2tbXx5S9/mXHjxlFUVMS3vvWtlNX5q1/9SsGC +iIiIiIj4IhaLsXnzZn7zm4f4/vcf5733TqCs7EYKC09QsDCEDeueC0OFmVFeXs7DDz/MjTfeCMDq +1atpaWkZsD/89913HytXrqSqqopQKMQbb7wxJOsUERERERE5lObmZjZs2MBbb61n+fJKWlvHEwx+ +jNLSzxMI6GvrcKCeCylyzTXXcP/993cs33///Vx77bVd2jzzzDPMnDmTgoICSktLWbhwYce2xx57 +jGnTptHY2AjA4sWLmTRpErt37+7xeKFQiIKCAkaPHk1OTg5nnnlmyuqcN28eP/zhDwFYunQpU6dO +5ac//SmFhYUUFxdz33339elYIiIiIiIiPXHOUVdXR0XFy9xxxz184xs/484717Js2dGMGXMTJSVf +pbj4ZAULw4jChRQ59dRT2b9/P+vWrSMej/Poo4/ypS99CedcR5v8/HwefPBB6uvrefrpp/n1r3/N +U089BcDnP/95zjjjDG6++Wb27NnD9ddfz6JFixg/fnyPx5s5cybLli1jwYIFKa+zu9raWvbv38/2 +7dv5n//5H2688Ubq6+sP67giIiIiIpLeotEoGzZs4Mknn+aWW+5k/vxHuP/+RrZtm0Nx8XcoLb2K +SZNOJDMz3+9S5QiMqBjIFvrbtb+9V8CZZ57Jsccey+TJk7tsnz17dsf88ccfz9y5c1m6dCmf+cxn +APjFL37BjBkzmDNnDpdeeikXXnhhj8fZu3cvn/nMZ3j66ae5/fbbMTNuv/12AKZOncqSJUv46Ec/ +esR1dpeZmckPfvADAoEAF154Ifn5+axbt46TTz65T++LiIiIiIikJ++HzfW8+eZ63n67ikikCLMP +M27clygpmaDLs0eQERUuuNt7//W9L/obTnzpS19i9uzZbN68mS9/+csHbH/99de57bbbWL16NW1t +bbS1tXHllVd2bC8oKODKK6/kv/7rv3jyySd7Pc4f/vAHjjvuOM477zxOOukkZs+ejZlx7bXXEovF +Dhos9KXO7saPH08g0NnJJTc3t+PyDZGhbDBuNavb2YqIiIh0cs6xfft21qxZz2uvrWfTpn3A0WRn +H8+ECZcRCuX4XaIMkBEVLvitpKSE8vJyFi9ezKJFiw7Y/sUvfpGbb76ZZ599llAoxLe+9a0uYyqs +XLmSRYsWcfXVV/ONb3yDxYsX93icaDRKJBIBYNy4cbzwwgucfvrpPPTQQ3znO9/pd50iI8Vg3GpW +t7MVERGRdBcOh9m0aRPvvLOeZcs20NCQg3MfpqDgAkpKpmKmq/HTgcKFFFu0aBF79+4lJyeHWCzW +ZVtjYyNjx47tuLvDQw89xPnnnw9Aa2sr11xzDf/xH//Bddddx6xZs/jVr37FDTfccMAxLrroIm67 +7TZ++9vfMm/ePILBIKeffjoPP/wwubm5/a5TRERERETkYPbu3cu6det54431vPtuDbHYFAKBDzN+ +/GxKSsb6XZ74QOFCCiRfJ1ReXk55eXmP2+666y6+/e1vc9NNN3HmmWdy1VVXsW/fPgC++93vUlpa +yte+9jUAHnzwQc4++2zOO+88pk+f3uV4ZWVlLF68mFtuuYXvfOc7jBo1irlz5/Liiy9yySWXMG3a +NM4777wjrvNwXq+IiIiIiIx8zjk++OADVq16j5dfXsOWLU3Ah8nLO4nCws+TkZHld4niM4ULKbBp +06Ye1weDwS69Aj772c/y2c9+tse2P/3pT7ssz5gxg127dvV6zNNPP51XXnnlgPUHu4tDX+u89957 +O+bPPPNMqqur+7QfEREREREZOZxz7Ny5k3feeY+XXnqfmpoIZscxZswllJZO0Y+O0sWwDheSB1I7 +s/RMFlQsAA5vILVU7ENERERERGQkcM5RV1fXEShs3x4DjmPs2MspLZ2sQEF6NazDhVQEAAoRRERE +REQknTnnqK2tZeVKL1CorXXAcYwbdwUlJZMUKEifDOtwQURERERERA5f+y0j33nnfV566X3q6gwv +ULiSkpIiBQpy2BQuiIiIiIiIpAHnHNu2bWPlSi9Q+OCDIHAc48dfRUlJoQIF6ReFCyIiIiIiIiOU +c46ampqOQGHXrhBmxzFu3NWUlBylQEFSRuGCiIiIiIjICOKcY+vWrR2Bwu7dWcBxTJjwRUpKJipQ +kAExbMKF0tJS/UcwDJSWlvpdgoiIiIhIWtq5cyevvrqCl156nz17cggEjmP8+GsoLZ3od2mSBoZN +uFBVVeV3CSIiIiIiIkOKc47NmzezZMmrLF9eC3yCCRO+TFmZAgUZXMMmXBARERERERFPLBZj9er3 ++MtfXmXDhhjZ2acxdepcAgF9xRN/pORPnpldANwJBIB7nHN3dNv+BeDWxOJ+4Abn3LupOLaIiIiI +iEi6aG1t5Y03VvDUU6/zwQfjGT36HMrKjtYl5OK7focLZhYAfgGcA2wHlpvZn51za5OabQJmO+fq +E0HEb4FT+3tsERERERGRdLBv3z5efvl1nnlmJS0tH2L8+KspL5/kd1kiHVLRc+FkYINzbguAmT0C +XAp0hAvOuWVJ7ZcBxSk4roiIiIiIyIi2fft2nn/+VZYurcS5Eyks/EcKCwv8LkvkAKkIF4qBrUnL +NXiBQ2+uBxan4LgiIiIiIiIjjnOO9evX8/TTr7Jq1T5CoVOZPPkSMjKy/C5NpFeDOtqHmZ0FzAM+ +ebB2CxYs6JifM2cOc+bMGdC6REREhpqKigoqKir8LkNERAZRJBLhnXdW8ec/v0Z1dYjc3NMpKTmO +QCDod2kih5SKcGEbUJK0PCWxrgszmwHcDVzgnNt7sB0mhwsiIiLpqHu4vnDhQv+KERGRAdXU1MRr +ry3nL39ZTn19MWPGXExZWakGaZRhJRXhwnLgaDMrBXYAc4GrkxuYWQnwBHCNc64yBccUEREREREZ +1nbt2kVFxTKee241bW0fZeLE6ygrm+h3WSJHpN/hgnMuZmY3Ac/ReSvKNWb2dW+zuxv4ATAOuMu8 ++C3inDvYuAwiIiIiIiIjjnOO6upqnn32VV57rQazkygquonMzHy/SxPpl5SMueCcWwIc023db5Lm +vwp8NRXHEhERERERGW7i8Tjvvfc+f/3rq6xbFyYz8zSmTPkcwWDI79JEUmJQB3QUERERERFJJ845 +1q5dx0MPPU91dR6jRs2mtPQYjacgI47CBRERERERkQGwY8cOHnvsWVasaKKg4ALKyo5WqCAjlsIF +ERERERGRFGpoaOCvf/1fnn++klBoDuXlMzEL+F2WyIBSuCAiIiIiIpIC4XCYioq/8+STy4lETqK4 ++BtkZGT5XZbIoFC4ICIiIiIi0g/xeJwVK97m4Ycr2LOnnKKifyQ7u8DvskQGlcIFERERERGRI1RZ +Wcnvf/8sGzfmMGHCXMrKiv0uScQXChdEREREREQO086dO3n88edYtmwPo0Z9mvLyj2iwRklrChdE +RERERET6qLGxkcWLX2Tx4rUEg5+irGwWgUDQ77JEfKdwQURERERE5BAikQivvPIajz32Gq2tH2fy +5JsIhXL8LktkyFC4ICIiIiIi0gvnHKtWvcvvf/+/1NUVU1T0VQoLx/ldlsiQo3BBRERERESkB1u2 +bOHhh5/l/feNceM+S3l5qd8liQxZChdERERERESS7N69mz/+8XlefnkHubnnUl5+vAZrFDkEhQsi +IiIiIiJAc3Mzzz23lL/+9V3gdEpKriAYDPldlsiwoHBBRERERETSWjQaZdmy5TzyyMs0NX2USZNu +JDMzz++yRIYVhQsiIiIiIpK2nHP85Ce/Ze3a0RQWzmPChIl+lyQyLClcEBERERGRtFVXV8eGDVGm +Tfui36WIDGsBvwsQERERERHxy/r1G3Fuut9liAx7ChdERERERCRtrVhRSX6+wgWR/lK4ICIiIsOK +mV1gZmvNbL2Z3dpLm5+Z2QYzW2lmJyatrzKzd8zsbTN7Y/CqFpGhqK2tjfff38aYMWV+lyIy7GnM +BRERERk2zCwA/AI4B9gOLDezPzvn1ia1uRCY7pz7kJmdAvwKODWxOQ7Mcc7tHeTSRWQI2rJlC7HY +ZDIysvwuRWTYU88FERERGU5OBjY457Y45yLAI8Cl3dpcCjwA4Jx7HSgws8LENkPnPyKSsGZNJWa6 +JEIkFfSPq4iIiAwnxcDWpOWaxLqDtdmW1MYBz5vZcjP76oBVKSLDwhtvbGTMGIULIqmgyyJEREQk +nZzhnNthZhPxQoY1zrlX/C5KRAZffX0927Y1U1Iyye9SREYEhQsiIiIynGwDSpKWpyTWdW8ztac2 +zrkdiccPzOyPeJdZHBAuLFiwoGN+zpw5zJkzp/+Vi8iQsnFjJc5Nw8z8LkVkyKqoqKCioqJPbRUu +iIiIyHCyHDjazEqBHcBc4OpubZ4CbgQeNbNTgX3OuTozywUCzrlGM8sDzgMW9nSQ5HBBREamd96p +JDv7Q36XITKkdQ/YFy7s8Z9NQOGCiIgMAc454vE40WiUaDRKLBbrmO/rFInEaGuLEg5HOx4BfvOb +R4nF4oljOJxzxGLxjvl43PW4PXk5uU37cjzeuQ/G+/wGphHnXMzMbgKewxs76h7n3Boz+7q32d3t +nHvGzC4ys41AEzAv8fRC4I9m5vDOgX7vnHvOj9chIv6Kx+O89dYmxo493+9SREYMhQsiIpJS0WiU +pqamLtP+/Y3U1zexZ4837dvXBAY33ngHkUiUSCSKc4ZZRsfk/ROVAQST5r3JuZ4fA4FcAoGMxBSE +SbBq1YxEl1fDzPDuZGiHWBfosj15nZkRDHY+Z//+bcAtg/wupzfn3BLgmG7rftNt+aYenrcZ+PjA +Viciw8H27dtpbh7FhAmj/S5FZMRQuCAiIgflnKOlpeWAwKChobEjLNi71wsMGhqaaGmJEgjk4fU6 +z8O5POLxPILBUYRCRWRm5hEK5cHoGxgz5hsdYYD3ZT31Jk48dkD2266lJWdA9y8iIqm3fn0lzuku +ESKppHAqw5IWAAAgAElEQVRBRGQEi8VihMNh2traaGtr63W+uTlMc3Mbzc1tNDWFAbj99l+xb18T ++/c341wWgYAXFoAXFjiXT2bmJEKhvI7AYPz4PILBrD4PjhUK5Q7cixcREenFihWVjBo12+8yREYU +hQsiIkOIc45IJEI4HO5xAli69CVaW9toavKCgObmNlpavICgpaWN1lZvPhxuIxp1mGVhlolZJpAF +ZOKcN+9cJs5524NBLxgIBjOhEJqaLic3N4+CglzvEgMREZERoLW1lbVra5k8udTvUkRGFIULIiIp +4JwDoKGhoddgoLU1TFOTNzU2hhPBQPu6VlpawrS2thGPBwkEsjDLwgsDvMm5LCiFe++NYJZFMDiK +jAwvDPCmzvkxY7x5s+AR32IrP78oZe+PiIjIUFFVVYVzUwkGQ36XIjKiKFwQEekmHo/T2tpKc3Mz +LS0tNDc3d8zv399MfX0Le/c2U1/fzP79LTQ0NNPY2AIl8M1v/rbHUMC5LOLxLDIy8gkGxydCgayO +x1Aoi+xsLxA4VC+BsrJzBuNtEBERGZHee28jZhpvQSTVFC6IyIgWj8dpbm4GvF8q2oOC5mYvFKiv +b2Hfvq5BQXNzGMgiEMgFcoBc4nHvEXIJhcYQCuUSCuWSkZFDbm4uBQU5wA8pKfln316riIiIHNry +5ZWMHTvL7zJERhyFCyIy7DjnaG1tpampicbGxo6pvr6RXbsa2b27kb17vamhoRnIgVL4l395EcjF +uRzi8dzEZQVHJYKCHEKhXMaMyWXChOwBu3OBiIiI+GfPnj3U1UUpKTnK71JERhyFCyIyZEQikS5h +QWNjIw0NXliwe3cje/Z4gUF9fRPRaJBAIB/wpnjce8zMHE9mZj6Zmfnk5OQzenT7YIS3MHXqPH9f +oIiIiPhq48ZKYPoRj0ckIr1TuCAivtm1axcA8+f/jPr6JlpaYgQC+Zh1BgZdb3fohQZFRfkahElE +REQO29tvV5Kd/VG/yxAZkRQuiMiga2tr429/e5nHH18BUyEe/wLjx+cTDGbplwQREREZELFYjJUr +qxg79hK/SxEZkRQuiMigcc6xdu067r9/CbW1U5k06QbgVnJzJ/hdmoiIiIxwNTU1hMNjyczM87sU +kRFJ4YKIDIq9e/fy2GOL+fvf9zB27KWUlZX7XZKIiIikkfXrK3FOt6AUGSgKF0RkQEWjUZYu/TuP +Pvo68fjplJVdlRhgUURERGTwLF9eSUHBp/0uQ2TEUrggIgNm48aN3HvvM9TUFDJp0tfJzi7wuyQR +ERFJQ83NzWzcuIspU6b4XYrIiKVwQURSrr6+nscfX8LSpbUUFFxEefmH/C5JRERE0timTZuAUgIB +ff0RGSj6r0tEUiYWi/HKK8t4+OG/E4mcTGnpZ3XLSBEREfHd6tWVBAIab0FkIClcEJGUqKqq4r77 +nmbTpjFMmnQ9OTnj/C5JREREBOccb75ZybhxZ/hdisiIpnBBRPpl//79/OlPz/HCC9Xk519AeflH +MDO/yxIREREBYNeuXezZE2Dq1PF+lyIyoilcEJEjEo/Hee21N3jooZdoaZlJScmNBIOZfpclIiIi +0sXGjd4tKPXjh8jASkm4YGYXAHcCAeAe59wdPbT5GXAh0ARc55xbmYpji8jg27p1Kw888DTr1uVQ +WDiPiRMn+l2SiIiISI9WrNhIbu5Mv8sQGfH6HS6YWQD4BXAOsB1YbmZ/ds6tTWpzITDdOfchMzsF ++DVwan+PLSKDq7m5maeeep4lSzaSk3Me5eXH61eAYSbu4rTFIrTFwrTF2rzHeJhI3JuPxNuIuDbg +BJbzSuJZlvj/zs+6fb7r53947bCP8I5bkVjnutTpXOey676t23Lyc5Of5x3jo7zFMowAhmEWIEAA +MyNgAcASywECZt6SJbXtcV3i+Yl9NoYbIBZERESGnmg0yqpV1UyceIXfpYiMeKnouXAysME5twXA +zB4BLgXWJrW5FHgAwDn3upkVmFmhc64uBccXkQHmDYT0Fg888DcaG09gypSbyMjI8rusISvuHNF4 +hLZYG+Fo55f3cCxMpP2LfNybj7o2b53z5qMuTJTEPGFihInhzcctDHyKn9s8YtZG3MLErY14IIxL +PMYDYVygDZd4JBjGBb1Hgm0QjEA8EywTLAsLZGIuCywTC2QRcFkYIXDwAvPB2r+sJ39pd4n/T1p3 +kHad27oHA46/2tc6d5EUSmCA6yGQ6G25va112w+whG+CxcHi3vEtDsRx5oB4or44zuJezYm24Hpf +l7y+wMHOjyIiIkNPdXU10ehRhEI5fpciMuKlIlwoBrYmLdfgBQ4Ha7MtsU7hgsgQt337dn73u6dZ +vTrIUUddw/jxRYN6/LhztEZbaGproiXWREu0iZZoM61xbzkc96Y2mmlzTbTRRIQmItZE1JqIBZqJ +BZrBZnIH5ya+YMZ7eIwlfWmM9zAf6/Kc5MklthEYxcJgtvcl3oJgWZD85d2yElMmAcsiYFkYiXmy +CJBJEO8LfjAx3z5lMZoMl0WdraSET5Hhssggk5BlkeEyCeE9ZrosQi6TUOIxy2WRGc8iZJlkB7LI +iIcIBA0O8UP7QjNu694LIMUWmvG9QTjGdwf4GPv2beG/J5UN6DFEROTIrF3rjbcgIgNPAzqKpBnn +oKEB6uo6p9raA5d37nQ0NIRpbc0nELiWUCiEmWEGgQCYdU7Jy73N97StdcxK+Mip/L/AJcQCTcSC +TcSDTbiMJuIZTRBq9ibLgkAeFs8jYLkEAnkEXB5B86YMyyPD5ZJBHpnkkUchWeSRSS5ZLo9Ml8tL +9kM+yXzMJbq19/RIkED7MgECLtDRjT7gAgQDwaS2nf9rb/tLm8atbh+ZLpNAIOCNQhNK7ee30L7J +pe6l1O5URERkhFq+vJIxY/6P32WIpIVUhAvbgJKk5SmJdd3bTD1Emw4LFizomJ8zZw5z5szpb40i +I1r3wKCnsCB5ORiEoiIoLOyciopg5szO5XHjovz+90+yejVMmHAeOTkTcM47VjzOYc33tq05OJFK +Z8x0XyXL5ZHj8sh2eeTE88h1ud5jPJeMjGC//7Z6yS7mDHduat7w3th+sl32wB5D0kZFRQUVFRV+ +lyEiMmw1NjZSVbWPkpJiv0sRSQupCBeWA0ebWSmwA5gLXN2tzVPAjcCjZnYqsO9g4y0khwsi6S4W +g23bYMsWb6qqgurqAwODjIwDw4LCws7AIDlMyMvry5FDLFw4l+XLV/DAA4tobPwExcWzCQZT+VN8 +MYvtNc52n0nhPkVGhu7h+sKFC/0rRkRkGKqsrATK8cafF5GB1u9wwTkXM7ObgOfovBXlGjP7urfZ +3e2ce8bMLjKzjXi3opzX3+OKjBRtbbB1a2dwkBwibNkC27fDhAlQWupNZWVw4okwaVLXMKFvgcHh +CQQCnHLKLI477iM88cQS/va3XzF27MWMHTst9QcTERERSaFVqyoJhTTegshgScmYC865JcAx3db9 +ptvyTak4lshw09zs9TToKTjYsgV27oTJk73QoD1AmD0brrnGm586FbJ8vjHDqFGjuO66KznttPXc +e+9TbN5cQnHx+WRmDkCiISIiItJPzjlWrKhk7Niz/C5FJG1oQEeRfmhshB07uk7btnWGB1VV3lgI +JSWdvQ5KS+HCCzvnJ0/2LmkYDo455sP86EdlPPdcBU8+eReh0DkUFZ2IWffbBIqIiIj4p66ujvr6 +bEpLx/pdikjaGCZfaUQGj3Owd++BoUFPUyzmXZ6QPBUXw0kndfZCKCz07owwUmRmZnLxxedx0kkz +eOCBv7B69TsUFl5MXt5Ev0sTERERAWDDBt2CUmSwKVyQtBGLwQcfHDowqK2F7OwDQ4MpU2DWrK7r +Ro/2bquYjoqKivjOd77CsmXL+d3v7mXPnlkUF3+KQEB/rYiIiIi/3nxzI/n5p/pdhkha0bcAGRGa +m73LEZKnmpquy3V1UFBwYGhwzDFw1lmdy0VFkJvr9ysaHgKBAKeffgrHH38sf/jDYpYubR/wsdzv +0kRERCRNtbW18f772ygsLPO7FJG0onBBhjTnYNeuQwcHzc3e2AXFxV4Pg+JiKC+HT36yc92kSZCZ +6fcrGplGjx7NV75yFaefvpZ77/0TVVXlFBefRyiklEZEREQG15YtW4jFJpGR4fOI2CJpRuGC+CYc +9m6zuH1776HB9u1eL4Li4q7BwSmndF03fnz6Xp4wlBx77Ef4l38p59lnK/jTn+4iM/NcCgs/pgEf +RUREZNCsWVOJ2dF+lyGSdhQuSMrF497YBu3hQHJQkPzY0OD1Jpg82Zvag4OZMztDg8mTdYnCcJOV +lcVnPnM+J510Avff/xfWrHmHoqKLyc0d73dpIiIikgaWL69kzJjL/S5DJO0oXJDDsn9/72FB+2Nt +rTe2QXFx56UKkyfDySd3XTdhwsi6i4J0NXnyZG699au89tob/O5397B79ykUF5+hAR9FRERkwNTX +11NT00RJySS/SxFJOzrLF8Ab22DfPti69cCppqYzOIjHOy9HaA8Kpk+HT32qc3nSJMjSJW6CN+Dj +GWecyvHHH8tjjz3Dyy//mnHjLmHMmFK/SxMREZERaOPGSmCaLskU8YHChTTR1NRzcNA+VVd7vQhK +SmDq1M7p7LM7L1eYPDm9b70oR66goIDrr5/LGWesZdGiJ6iqOpri4k8TCuX4XZqIiIiMIKtWVZKZ +qfEWRPygcGEECIe9XgU9BQbt8y0tXkgwdWpngHDyyXDFFZ1BQkGB369ERjIz47jjjuVf/3Uaixf/ +jT//+ZdkZ58HRX5XJiIiIiNBPB5nxYpNjBt3vt+liKQlhQtDnHOwZ48XFGzZ4k3t89XV3rRnj3cp +QnKPg+OOg/PP71yeMEE9DmRoyMrK4rLLLmTWrBncd99fIAqbN7+Y6L5omBlmgY75Qz32tS0ToaGh +hoyMbILBLDIysgkEMtRtUkREZITYsWMHzc2jmDBhtN+liKQlhQs+i0a98Qx6Cg/a5zMyvN4GpaXe +VFLi9TooKfGmoiIIBv1+JSKHp7i4mNtu+xrf/5cbmDfPiMcd8XiceNzhnEsse/PRaNf13bcnz8di +8QO2OedgF4wd+wzNzWGam1tpbg4TicQxy8YsC7NsIAvIxrksnMsmHs/qEkZkZBy4HAiEFFCIiIgM +AevWbcS56X6XIZK2FC4MsKamzh4GPYUHO3bAxImdoUFpKZxwAlx8cec6Xa4gI1UgcbuQOXPmDPix +blr4RX7wg691WReNRgmHw7S2thIOh7vMt7a20toaprFxP42Nu9i/v5WmpjCNjV4w0dTUSktLmLa2 +WGc4UQpbt/4aSA4brMujmeFcz9v61L4Etm59oLO14YUnSctw4LrDbUMJVFc/Tjyeh1k+mZl5ZGbm +Ewp5j5mZebrzh4iIDCkrVlQyatRsv8sQSVs6M+ynSMQLCzZtOnDassULF6ZO7RoenHtu5/yUKZCZ +6ferEElPGRkZZGRkkJeXd8T7iMViHWHEvT//Jj/+8aVdvqS3zx9s3eG0X/Q7+O53z+jY1r3XRE+9 +KI6kzaJ74VvfOobGxkYaGprYtWs3e/Y0sXdvI/v2NbFrVxOxWIhAIA/IB/KIx/NxrjN8SA4jgsHQ +AccUERFJldbWVtaurWXyZN2RSsQvChf6YO/erqFBZWXn/LZt3ngH06Z50/Tp8LnPQXm5Fx4cdZTG +OhAZyYLBILm5ueTm5gIwadLA31d7+vTB6fJ5wgkn9LrNOUdrayuNjY00NTV1PNbXN7Jnzzb27Gli +z55G6uubqK1tJBoNYJaPmRdGxON5UAbV1a9gFiQQyEhMnfN9Xe+NuyEiIumsqqoK56YqzBbxkcIF +vHEPtm49MDhoX45GvdBg+nQvQDjxRO8uC9OmeQGCeh6ISLoxM3JycsjJyWHixIkHbeuco62t7YAg +4r5n4KqrWgmHo4TDUSKRGG1t3nw06s23tXnrIxFvvn19JOLNRyJRnDMgiFkGZhkd85ABJVBTcy/O +BYDgAZNzAZxrn/cmMy+w8IKL4AGP3bc1Ne2EsQP7fouIyMG9/34lZhpvQcRPaRcuvP46LF3aNUio +qfEGRWzvfTBtGlx+eWeYMH68eh+IiBwpMyMrK4usrCzGjx/fueEZOP/8c/u1b2/QzjixWIxoNEo0 +Gu0yv+juG/jBD84mFot1mdqf09P6SCRGNBpJhB0xotF4IsiIdTxGIjFisXjHOtr6+SaJiEi/vPHG +RsaOnet3GSJpLe3ChY0boa4OZsyAyy7r7H2QleV3ZSIicrjMjGAwSDAYJLOXbmSlpQN//e13F14/ +4McQEZGe7dmzh7q6CCUlR/ldikhaS7tw4Ytf9CYRERERERn+Nm6sBKbr1tAiPtMoWCIiIiIiMmy9 +/XYl2dlH+12GSNpTuCAiIiIiIsNSLBZj5coqxo6d5ncpImlP4YKIiIiIiAxLNTU1hMNjyczM87sU +kbSncEFERERERIal9esrcU63oBQZChQuiIiIiIjIsLR8eSWjRytcEBkKFC6IiIiIiMiw09zczMaN +uygomOp3KSKCwgURERERERmGNm/eDJQSCGT4XYqIoHBBRERERESGoXff3UggoEsiRIYKhQsiIiIi +IjKsOOd4881Kxo1TuCAyVChcEBERERGRYWXXrl3s3m3k5Iz3uxQRSVC4ICIiIiIiw8rGjZXA0ZiZ +36WISILCBRERERERGVbeequS3FxdEiEylChcEBERERGRYSMajbJqVTVjxpT7XYqIJFG4ICIiIiIi +w0Z1dTWRyERCoRy/SxGRJAoXRERERERk2Fi7thLndEmEyFCjcEFERERERIaNN9+sZMyYo/0uQ0S6 +yfC7ABERERERkb5obGxk8+Z9lJQU+12KDCDnoKnJezTrnAKBgy8PBc51PrZPybWOZAoXRERERERk +WKisrATKMVMH7JGgrQ127/amXbu6PoZC3hfy9i/o8XjXL+zdl+HwgojkL/vd95O8fLjb2iUfq71N +KORNGRmd8z2tO9T2nta1tGQQjw/O59YbhQsiIiIiIjIsrFpVSSik8RaGE+egoaEzOEgOEZqbYdw4 +mDABxo+HD30ITj3VW87KOvzj9DWISF6Grj0fkkOB7r0i+rqtJ/E4RCKdUzTadbm39U1NXdf19Lxo +FMLhYzn55B2H/wGlkMIFEREREREZ8pxzrFixibFjz/K7FOnBwXohZGV1BggTJnghwoQJUFDg9SBI +heQv9sFgavaZSoGA9z4cbmjSVzt2vMu4ca0Ds/M+UrggIiIiIiJDXl1dHQ0NWZSUjPW7lLTlHOzf +39kDoS+9EMaPh+xsvyuXwaBwQUREREREhrwNG3QLysESicCePQcGCLt2eb+8t/dAGKheCDI8KVwQ +EREREZEhb8WKSvLyTvG7jBGj/Y4M3cODXbu83gljx3YGCNOnwymnqBeCHJzCBRERERERGdLa2tp4 +770aCguv8ruUYScWg717e+6FYNZ1LISyMu9x7Fj1QpDDp3BBRERERESGtC1bthCLTSIjY4BGwxuG +nPMGUWyfwmFv2reva4iwb593yUJ7gDB1Kpx4ojefm+v3q5CRROGCiIiIiIgMaWvWVGJ2tN9l9Itz +3lgG4XDXQKCnx77MRyKQkeGNgZCZ6U1ZWZ1BwowZXoAwbpzXTmSg6Y+ZiIiIiIgMacuXVzJmzOV+ +l3FYIhGoroaqKm/avt27RWJ7CJAcCHSfz8vzQoHetmdlQSikSxdkaOlXuGBmY4FHgVKgCvi8c66+ +W5spwANAIRAHfuuc+1l/jisiIiLpy8wuAO4EAsA9zrk7emjzM+BCoAm4zjm3sq/PFZGhpb6+npqa +JkpKivwu5aCiUaipgc2bvTBhxw4oKvLGMTjrLO9yhFDI7ypFBk5/ey7MB15wzv3EzG4FbkusSxYF +vu2cW2lm+cAKM3vOObe2n8cWERGRNGNmAeAXwDnAdmC5mf05+bzCzC4EpjvnPmRmpwC/Bk7ty3NF +ZOiprKwEpuH9Jzx0xGKwbVtnmLBtGxx1lBcmfOpTUFLi9TIQSRf9DRcuBc5MzN8PVNAtXHDO1QK1 +iflGM1sDFAP6h1xEREQO18nABufcFgAzewTvfCT5vOJSvF6TOOdeN7MCMysEyvvwXBEZYt55p5LM +TP/HW4jHvUsb2sOEmhpvbIOyMjjtNCgt9S5XEElX/Q0XjnLO1YEXIpjZUQdrbGZlwMeB1/t5XBER +EUlPxcDWpOUavMDhUG2K+/hcERlCGhrivPZaDePGnT/ox47Hoba2M0zYuhXGjPHChFmz4HOfg5yc +QS9LZMg6ZLhgZs/jjZfQsQpwwPd7aO4Osp984HHgn5xzjQc75oIFCzrm58yZw5w5cw5VpoiIyIhS +UVFBRUWF32WMFHa4T9C5iIi/6uvhJz+BX/wCWlpuJBrNJCsLsrM7p+Tl7tt6Wn+owQ+dg7q6zjCh +uhpGjfLChBNPhMsv160bJf0czvnIIcMF59yne9tmZnVmVuicqzOzImBnL+0y8IKFB51zfz7UMZP/ +QRcREUlH3b/QLly40L9ihpZtQEnS8pTEuu5tpvbQJrMPzwV0LiLil7Y2+PWv4V//FS66CF56aR93 +3nk/U6Z8k7Y2o7WVLlM43DlfXw87d3JAm/Z2GRm9BxBNTV6gkJvrhQknnACXXAL5+X6/IyL+Opzz +kf5eFvEUcB1wB3At0FtwsAh43zn33/08noiIiKS35cDRZlYK7ADmAld3a/MUcCPwqJmdCuxL/BCy +qw/PFREfOAePPQbf/S4ccww8/zzMmAHOjWXcOEdb215ycsYd8WUIznnBRfdAon2aOhUuuABGj07t +6xJJJ/0NF+4AHjOzfwC2AJ8HMLNJeLecvNjMzgC+CLxrZm/jXTrxXefckn4eW0RERNKMcy5mZjcB +z9F5O8k1ZvZ1b7O72zn3jJldZGYb8W5FOe9gz/XppYhIQkUF3HKLN8bBb38LZ5/duc3M+MQnplFR +sYmcnHFHfAwzr4eCBlwUGTj9Checc3uAc3tYvwO4ODH/dyDYn+OIiIiItEv8QHFMt3W/6bZ8U1+f +KyL+WL0a5s+H99/3LoO46qqex0U4/vhpPP/8GuCkQa9RRPpuaN0sVkRERERERrSaGvjKV+Ccc+Dc +c2HNGrj66t4HXCwvLweqcC4+qHWKyOFRuCAiIiIiIgOuvt4bU+FjH4OjjoJ16+Cb3zz0pQqjRo1i +6tRR7N+/Y3AKFZEjonBBREREREQGTDgM//3f8OEPQ20tvPMO/Pu/w5gxfd/HSSdNY9++TQNXpIj0 +m8IFERERERFJuXgcHnkEjj0WnnsOXngBFi2CKVMOf18f+cg0QOGCyFDW37tFiIiIiIiIdPG3v3l3 +gDCDe+6Bs87q3/5KS0sxe5xYLEIwGEpNkSKSUuq5ICIiIiIiKfHuu3DRRfDVr8L//b/w+uv9DxYA +srKyOOaYIurrq/u/MxEZEAoXRERERESkX7ZuhXnzvLs/XHCBdweI3m4teaQ+8Ylp7N+vSyNEhiqF +CyIiIiIickT27YP58+HjH4dJk2D9erj5ZsjMTP2xPvShaZgpXBAZqhQuiIiIiIjIYYlE4L/+y7sD +xAcfeHeA+Ld/g4KCgTtmcXExWVl7iESaB+4gInLENKCjiIiIiIj02ZYtcPXVkJvrDdx4/PGDc9xg +MMiMGaW8++5mjjrqo4NzUBHpM/VcEBERERGRPnniCZg1Cy6/3Lu95GAFC+0+/vFptLTo0giRoUg9 +F0RERERE5KBaWuCf/xmWLIG//AVOOcWfOqZPn4bZ6/4cXEQOSj0XRERERESkV2vWeGHC7t3w9tv+ +BQsAEydOpKAgQkvLXv+KEJEeKVwQEREREZEDOAeLFsHs2d4dIB55ZGAHbOwLM2PmzGns3atLI0SG +Gl0WISIiIiIiXTQ0wD/+I6xaBRUV8NEhNH7iCSdM48UXNwCf8LsUEUmingsi8v+3d+/xUZUH/sc/ +zySEcBMSJFykXAa8AEaB0JZaW7IWXddLbbu/9WVtvba2Vmtbu9XVX7srurv2uv7WbVf7a3Wr3W0r +Vavipd4q8V4FFQEVtCD3S1QCKJAEMs/+MYFGGq5DcjIzn/frldecOXOG802nhCdfn/McSZKkHWbP +hokT4aCD4Pnnu1axAJBOp4nxTWKMSUeR1IblgiRJkiQyGbjuOjjpJPjud+GnP83ebrKrOeiggxg6 +tBfvvbcm6SiS2vCyCEmSJKnIvfUWnHtudtHG556DkSOTTrR7NTVp7r13MX36DE46iqRWzlyQJEmS +itjMmTBhAlRXw5NPdv1iAWDMmDQxLko6hqQ2nLkgSZIkFaFt2+Caa+Cmm+CWW+CEE5JOtPeGDx9O +CHfS0rKVkpJuSceRhOWCJEmSVHSWL4czz4QePeDFF2HQoKQT7Zvy8nIOPXQgq1cvp6IinXQcSXhZ +hCRJklRU7rkHJk2Ck0+GBx/Mv2Jhu0mT0mzcuDjpGJJaOXNBUqerW1JH3ZI6AKYMn8K0umkA1I6o +pXZEbWK5JEkqZI2NcPnlcO+9cPfd8JGPJJ0oN4cemiaEh5KOIamV5YKkTmeJIElS51q4EM44A0aN +gpdegn79kk6Uu6FDh1JW9g5bt26hW7ceSceRip6XRUiSJEkF7Je/hGOPhQsvhNtvL4xiAaCkpITq +6mGsX/9m0lEk4cwFSZIkqSC9+y5cfDHMng2PPZa91WShmTAhzezZi4GxSUeRip4zFyRJkqQC8+KL +UFMD3bvDrFmFWSwAjBqVBlzUUeoKLBckSZKkAtHUBN/7Hpx4IlxzDfz859CrV9KpOk5VVRV9+zbT +2Lg+6ShS0bNckCRJkgrAAw9kZyg88ww891x2AcdCF0JgwoSRNDQ4e0FKmuWCJEmSlMf+9Cc45RS4 +9FK4/nqYMQNGjkw6Vec56qg0W7daLkhJs1yQJEmS8tB778GVV8LkyTBlCsybB3/zN0mn6nzpdJoY +F/xkO/QAABznSURBVBNjTDqKVNQsFyRJkqQ8EiP86ldwxBGwalW2VLjsMigrSzpZMvr27cuQIT3Y +tGlt0lGkouatKCVJkqQ88dJLcMkl0NgIt98OH/lI0om6hpqaNPffv5jevQclHUUqWs5ckCRJkrq4 +t9+GCy/MXvZw3nnw/PMWC22NGZO9NEJScpy5IEkCoG5JHXVL6gCYMnwK0+qmAVA7opbaEbWJ5ZKk +YrZtG/z0p9nbSp55JixYAP36JZ2q6xkxYgRwF5nMNlIpf8WRkuDfPEkSYIkgSV3NzJnwta9BVVV2 +e9y4pBN1XT169GD06AHU16+gX78RSceRipLlgiR1cc4okKTismwZfOtb2UsfrrsOPv1pCCHpVF1f +TU2a6dMXWy5ICbFckKQcdMYv/pYIklQctmyBH/0Irr8+O2Ph1luhR4+kU+WPww8fBTwCHJd0FKko +WS5IUg78xV+SlKsY4e674ZvfhEmT4IUXYPjwpFPln6FDh1Ja+hZbt26hWzdbGamzWS5IkiRJCXn1 +Vfj612H1arj5ZjjO/+i+30pLS6muHsaCBUsYMGBM0nGkomO5IKlguVaBJKmr2rABpk2D//kf+Kd/ +gq98BUodmedswoQ0L764GLBckDqbP8IkFSxLBElSV5PJwC23wLe/Daeemp25MGBA0qkKx+jRaeD2 +pGNIRclyQZIkSeoEL78MF1yQnaFw331QU5N0osIzcOBA+vTZQmPjBsrL+yYdRyoqqaQDSJIkSYVs +yxa44go44QS48EJ4+mmLhY4SQmDixDQNDYuTjiIVHcsFSZIkqYM89hhUV8OSJTB3Lpx/PoSQdKrC +Vl2dprnZckHqbF4WIUmSJB1g69bBt74Ff/gD3HADnHxy0omKx6hRaWL8AzFGgk2O1GmcuSBJkiQd +IDHCbbfBuHHQpw/Mn2+x0Nn69evH4MHd2bSpPukoUlHJaeZCCKECmA4MB5YAp8cYN+zi2BQwG1gR +Y/xkLueVJEmSupply+Cii2DpUrjrLpg8OelExaumJs3vf7+Y3r0HJh1FKhq5zly4Ang0xng48Bhw +5W6O/Trwao7nkyRJkrqUlhb4j//ILtI4eTK88ILFQtLGjk0To+suSJ0p13LhNODW1u1bgU+1d1AI +YShwEnBTjueTJEmSuox58+CjH4U774SnnoLvfAfKypJOpZEjRwLLyGRako4iFY1cy4WqGONagBjj +GqBqF8f9P+AyIOZ4PkmSJClxjY3ZIuG44+ALX4CZM+Hww5NOpe169OjBqFH92bhxRdJRpKKxxzUX +QgiPAG0vVgpkS4LvtHP4X5QHIYSTgbUxxjkhhNrW9+/WtGnTdmzX1tZSW1u7p7dIklRQ6urqqKur +SzqGpHY8/jh86UvZW0zOnQuDByedSO2pqUkzffpi+vUbnnQUqSjssVyIMR6/q9dCCGtDCANjjGtD +CIOA9pZk/SjwyRDCSUAPoE8I4ZcxxrN39ee2LRckSSpGO5frV199dXJhJAGwfj1cfjn8/vfwk5/A +aaclnUi7c9hhaUKYCfxV0lGkopDrZREzgHNbt88B7tn5gBjj/40xDosxpoEzgMd2VyxIkiRJXUmM +cMcd2dtLlpZmby9psdD1DRs2jNLStWzb1ph0FKko5HQrSuD7wG9DCOcDS4HTAUIIg4GfxxhPyfHP +lyRJkhKzciVcfDG8/jr89rfZxRuVH0pLSxk3bihvvLGUgw92QQypo+U0cyHGuC7GODXGeHiM8YQY +4/rW/avbKxZijI/HGD+ZyzklSZKkjpbJwA03wPjxMGECvPSSxUI+mjAhzaZN3pJS6gy5zlyQJEmS +Csqrr8IFF2S3H38cxo5NNo/23+jRaeB3SceQikKuay5IkiRJBaGpCaZNgylT4POfhyeftFjId4MG +DaJXr000NW1MOopU8CwXJEmSVPSeeip7+cOcOdlLIL7yFUg5Us57qVSKiRPTNDR4aYTU0fyRKUmS +pKL1zjvwxS/CGWfAP/8z3HUXDB2adCodSEcdlaapyXJB6miWC5IkSSo6McIvf5m9vWTPntl1Fv72 +byGEpJPpQBs1Kg0sJsaYdBSpoLmgoyRJkorKwoVw0UWwfj3cdx9MmpR0InWkiooKqqq6sXnzW/Tq +VZV0HKlgOXNBkiRJRaGxMbtg40c/CqeeCs89Z7FQLGpqXHdB6miWC5IkSSp4M2fC0UfD3LnZRRu/ +8Q0odQ5v0Rg3Lk0mY7kgdSR/pEqSJKlgvfUW/P3fw+OPw49/DJ/8ZNKJlISRI0cS4wwymRZSqZKk +40gFyZkLkiRJKjiZDNx8c3bBxqoqeOUVi4Vi1rNnT9LpSt59d2XSUaSC5cwFSZIkFZRXX4Uvfxma +m+Hhh2H8+KQTqSuoqUlzxx2L6dt3WNJRpILkzAVJkiQVhC1b4NvfhilT4LOfhWeesVjQnx1+ePaW +lJI6huWCJEmS8t5DD8GRR8Kf/pRdtPGii6DES+vVxrBhwygpWcO2bU1JR5EKkpdFSJIkKW+tWQOX +Xpq9reQNN8CJJyadSF1Vt27dGDPmEN58cyn9+x+WdByp4DhzQZIkSXknk4Ebb4TqahgxAubPt1jQ +ntXUpHnvPS+NkDqCMxckSZKUV+bOzS7YWFICM2dmL4eQ9sbo0WlCuCfpGFJBcuaCJEmS8sKmTXD5 +5TB1Kpx/PjzxhMWC9s3gwYPp2fNdmpreTTqKVHAsFyRJktTl3XcfjBsHq1dnL4G44AJIOZLVPkql +Uhx99AjWr38z6ShSwfGyCEmSJHVZb7+dvfPDSy/BTTdlZy1IuTj66DTPPLMIOCrpKFJBse+VJEl5 +IYRQEUJ4OISwMITwUAih7y6OOzGEsCCE8HoI4R/a7L8qhLAihPBi65fL/3VxM2bAUUfB8OEwb57F +gg6MUaPSwGJijElHkQqK5YIkScoXVwCPxhgPBx4Drtz5gBBCCvgJ8NfAOOCzIYQj2hxyXYxxYuvX +g50RWvtuwwY477zsLSanT4cf/hDKy5NOpUJRWVnJwQen2Lz57aSjSAXFckGSJOWL04BbW7dvBT7V +zjEfAt6IMS6NMW4Fbmt933ahYyMqV3/4Q3a2Qnk5vPwyfOxjSSdSoQkhUFOTpqHBW1JKB5LlgiRJ +yhdVMca1ADHGNUBVO8ccAixv83xF677tvhpCmBNCuGlXl1UoGZs3wyWXwLnnws9+BjfeCL17J51K +hWrcuDSZjOWCdCC5oKMkSeoyQgiPAAPb7gIi8J12Dt/XC6ZvAK6JMcYQwr8A1wFfaO/AadOm7diu +ra2ltrZ2H0+lffHss3DOOfDhD8PcuVBRkXQiFbp0Og3cT4wZsldTSWpPXV0ddXV1e3Ws5YIkSeoy +YozH7+q1EMLaEMLAGOPaEMIgoL6dw1YCw9o8H9q6jxjjW232/xy4d1fnalsuqOM0NcG0afCLX8AN +N8BnPpN0IhWLXr16MXx4P9avX0nfvh9IOo7UZe1csF999dW7PNaaTpIk5YsZwLmt2+cA97RzzCxg +dAhheAihDDij9X20FhLbfQaY33FRtSdz5sAHPwgLFmRnK1gsqLPV1KTZsMFLI6QDxXJBkiTli+8D +x4cQFgKfAL4HEEIYHEK4DyDG2AJ8FXgYeAW4Lcb4Wuv7fxBCmBtCmANMAS7t7G9AsG0b/Ou/wgkn +wGWXwe9+B1XtrZ4hdbAjjsjeklLSgeFlEZIkKS/EGNcBU9vZvxo4pc3zB4HD2znu7A4NqD1auBDO +Phv69oUXXoAPOBtdCRo2bBip1GpaWpopKSlLOo6U95y5IEmSpA6VycD118Oxx2YXbnzoIYsFJa+s +rIwxY4awfv3SpKNIBcGZC5IkSeowS5bAeedBc3P2rhCjRyedSPqziRPTzJ+/mP79D006ipT3nLkg +SZKkAy5GuPnm7KKNJ50ETzxhsaCu59BD04TgugvSgeDMBUmSJB1Qq1fDBRfAqlUwcyYceWTSiaT2 +DRkyhPLyDTQ3v0dZWe+k40h5zZkLkiRJOmCmT4fx42HiRPjjHy0W1LWlUimOPnoEDQ1vJh1FynvO +XJAkSVLO3nkHLroI5s6F++7LXg4h5YPx49M8++xioDrpKFJec+aCJEmScnL//XDUUTB0KLz4osWC +8suoUWlgERs3rmTz5rdpatrItm1NxBiTjiblFWcuSJIkab+89x584xvw2GPw61/DlClJJ5L2Xf/+ +/Zk6dSSLF9/Hli3NbNnSxJYtzTQ1bSWEboTQnRDKgO5A9jHG7sRYRozZfaWl3SkpKaOkJPuYfd52 +u4xUyl+9VNj8f7gkSZL22axZcOaZ8PGPw8svQ58+SSeS9k8Igc9//tN/sT+TybB161aamppobm5+ +32Pb7S1bmtm0qYHNm5vZtKmJzZub2by5aUdRsWFDM42NTWzbBiEMpqSkmqqqcS4gqYJjuSBJkqS9 +lsnAD38I//Zv8J//CX/3d0knkjpGKpWie/fudO/e/YD8edu2bWPJkiU899x8nnpqJo2Nh1BWdiQD +BoyhtLT8gJxDSpLlgiRJkvbKypVw9tmwbRvMng3DhiWdSMofpaWljB49mtGjR3P66Vt54403ePrp +eTz//INs3ZqmV69qKisPpaSkW9JRpf1iuSBJkqQ9uvtu+PKX4WtfgyuugJKSpBNJ+atbt26MHTuW +sWPHctZZjbz66ms8+eRsXn55BjEeQZ8+1VRUjCQE199X/rBckCRJ0i5t3gzf/CY88gjccw9Mnpx0 +IqmwlJeXM3HiBCZOnMC7777LvHmv8Pjjj/H66xuAcVRUVNOnzyGEEJKOKu2W5YIkSZLaNWcOfPaz +MGkSvPQSHHRQ0omkwtanTx+OOWYyxxwzmXXr1jFnzjxmzrybZctagCM5+OBqevWqSjqm1C7LBUmS +JL1PJgPXXw/XXgv//u/wuc8lnUgqPpWVlRx33BT+6q8+zpo1a3jhhXnU1f0PS5b0oKSkmgEDjqS8 +vF/SMaUdLBckSZK0w5o1cO65sGEDPPccpNNJJ5KKWwiBwYMHc8opgzn55ONZtmwZs2bN4/HHf8ba +tQdTWlrNgAFjKSvrlXRUFTnLBUmSJAHwwAPwhS/ABRfAP/4jdHPReqlLCSEwfPhwhg8fzqc//Tcs +WrSIP/5xHk8//ShNTR+gvLya/v0PpaSkjBBSLgipTmW5IEmSVOQaG+Hyy7MLNk6fDh//eNKJJO1J +SUkJhx12GIcddhhnnNHMwoULeeqpecyd+wBbt26jpSVDjAApQigBUjttl+x4HuP7H9u+Dtn925/H +uH0/QAaIhBDftx3j9u3sY/arvdf/vL399bbbLS2DGTiwlh49Kjr6f04dAJYLkiRJReyVV7KLNh5x +RHYBxwrH8FLeKSsro7q6murq6vftz2QyZDIZWlpa9ulxb44BSKVShBB2PO5qe0+v7+rYefNe4847 +f0Z9/dEMHvwxL/3o4nIqF0IIFcB0YDiwBDg9xrihneP6AjcBR5Ktoc6PMT6Xy7klSZK0/2KEG2+E +q66CH/wgu86Cd7qTCksqlSKVSlFamp//TXngwIFMnjyJhx9+ggce+E9inMyQIZMpKSlLOpraketF +OFcAj8YYDwceA67cxXHXAw/EGMcARwOv5XheSZIk7ae334bTToP/+i94+mk47zyLBUldU+/evfnM +Z07iBz/4IlOmvMWKFT9m1apZZDItSUfTTnItF04Dbm3dvhX41M4HhBAOAj4WY/wFQIxxW4xxY47n +lSRJ0n549FEYPx7GjIFnnoHDDks6kSTtWWVlJWef/bdce+2ZHHXUApYuvYH6+leI2YUl1AXkOj+m +Ksa4FiDGuCaEUNXOMSOBt0MIvyA7a2E28PUY45Yczy1JkqS91NwM3/42/OY3cMstMHVq0okkad8N +HjyYr371LBYtWsT06Y+yYMEzVFRMpaJiZNLRit4ey4UQwiPAwLa7yC7h+Z12Dm+vNioFJgIXxxhn +hxD+nezlFFft6pzTpk3bsV1bW0ttbe2eYkqSVFDq6uqoq6tLOoYKxMKFcOaZMHRodtHGgw9OOpEk +5WbUqFFceWWa+fNf4Te/mcGbb/ZnwICp9O49KOloRSvkMo0khPAaUBtjXBtCGATMbF1Xoe0xA4Fn +Y4zp1ufHAv8QYzx1F39mdGqLJBW+cHUgXtWxP+874xyddZ4QAjFGr4rvBIU0Fokxu67CFVfANdfA +hRe6toKkwtPS0sKsWS9w221PsH59mkGDjqO8vF/SsTrV6tUvMmXKcs4887QOPc/uxiO5XhYxAzgX ++D5wDnDPzge0Fg/LQwiHxRhfBz4BvJrjeSVJkrQbDQ3wpS/B669DXR2MG5d0IknqGCUlJUye/CEm +TDiaJ598ljvu+P80NR3NkCEfp1u3nknHKxq5Luj4feD4EMJCsqXB9wBCCINDCPe1Oe5rwK9CCHPI +rrtwbY7nlSRJ0i7Mnw8f+hAMGgTPPWexIKk4dO/enalTa/nRjy7m1FMzrF37E5Yvf4KWluakoxWF +nGYuxBjXAX+xHFCMcTVwSpvnLwMfzOVckiRJ2rM778xe/nDddXDWWUmnkaTOt/32lbW1k7n33seY +OfPHlJVNYdCgCaRSJUnHK1i5XhYhSZKkLqClBa66Cv77v+HBB6GmJulEkpSsyspKzjnn/3D88au4 +885HmT37WXr3/gQHHzyG4AI0B5zlgiRJUp5bvx4+9znYtAlmzYKq9m4OLklFasiQIVxyydltbl/5 +NJWVx9Ov34ikoxWUXNdckCRJUoJefTW7vsKoUfDIIxYLkrQr2dtXfonLLvsIPXvew+LFv2LjxpXE +mEk6WkFw5oIkSVKeuuuu7B0hfvQjOOecpNNIUtcXQqC6+kjGjh3DrFkvMGPG71i2bAOp1MHEWAVU +0atXFT17DqC8vJ+XT+wDywVJkqQ8k8nAtGlwyy3wwAPwQZfNlqR9sv32lZMnf4jm5mbefvtt6uvr +WbmynkWLnmfp0nqWLWskhAHEWEUqlS0devWqoqyst6VDOywXJEmS8siGDfD5z2cfZ82CgQOTTiRJ ++a2srIwhQ4YwZMgQxo//8/7Gxkbq6+upr69n+fJ6Fi1ayNKl9bz3XiSEKmKsorR0e+kwgG7deib3 +TXQBlguSJEl54rXX4FOfguOPz95qsqws6USSVLjKy8sZNmwYw4YNY9KkP+/ftGkT9fX1rF1bz7Jl +a1i8eC5Ll9bT2NiNEKrIZKro3v3Pl1eUlnZP7pvoRJYLkiRJeeCee+CCC+D734fzzks6jSQVr169 +ejFy5EhGjhzJ5MnZfTFGNm7cuKN0WLJkKW++OZvly99i27ZeQCUxVhBCJT16VFBeXkGPHhWUlpYn ++r0cSJYLkiRJXVgmA9dcAzffDPfeCx/+cNKJJEk7CyHQt29f+vbty6GHHsqxx2b3ZzIZ1q9fz7p1 +62hoaKC+voEVK1awenUDa9c20NiYIpWqACrIZCro1q1iR/nQvftBpFIliX5f+8JyQZIkqYvauBHO +OgveeSe7vsKgQUknkiTti1QqRWVlJZWVlX/xWoyRLVu20NDQQENDA+vWNbBq1UpWrpzPmjUNrFjx +LnAQIVQQY7aA2D7jobw8O+uhKy0sabkgSZLUBS1YkF1f4bjj4PbbXV9BkgpNCIGePXvSs2dPDjnk +kL94vaWlhQ0bNuwoH+rrG1i5chWrVjWwZs06GhvDjlkP69c3An07/Xtoy3JBkiSpi7n3Xjj/fPju +d+GLX0w6jSQpCSUlJbud9dDY2Pi+WQ/tFRSdyXJBkiSpi8hk4F/+BX72s2zBsH2hMEmS2goh0KNH +D3r06MGQIUOSjgNYLkiSJHUJGzfCOedAfX12fYXBg5NOJEnS3kslHUCSJKnYvf569i4QAwfCzJkW +C5Kk/GO5IEmSlKD774djj4VLL4Wf/tSFGyVJ+cnLIiRJkhKQycC118KNN8Ldd8MxxySdSJKk/We5 +IEnSfqhbUkfdkjoApgyfwrS6aQDUjqildkRtYrmUH959F849F1atyq6v0EXW4pIkab+FGGPSGd4n +hBC7WiZJ0oHR9hfyuiV1O34J76hfyMPVgXhVYfybEkIgxhiSzlEMOmMscvrp0Lcv/OQn0L17h55K +kqQDZnfjEcsFSVLBslzQ/uiMsciGDdlyQZKkfLK78YgLOkqSJHUyiwVJUqGxXJAkSZIkSTmxXJAk +SZIkSTlxzQVJUkHp7EUjO4trLnQexyKSJLXPBR0lScpzlgudx7GIJEntc0FHSZIkSZLUYSwXJEmS +JElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElS +TiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwX +JEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmS +JElSTiwXJEmSJElSTnIqF0IIFSGEh0MIC0MID4UQ+u7iuEtDCPNDCHNDCL8KIZTlcl51rrq6uqQj +KCF+9sXLz15d0T6MO24OIawNIczdn/era/LnUvHysy9efvb5JdeZC1cAj8YYDwceA67c+YAQwhDg +EmBijPEooBQ4I8fzqhP5l7p4+dkXLz97dVF7HHe0+gXw1zm8X12QP5eKl5998fKzzy+5lgunAbe2 +bt8KfGoXx5UAvUIIpUBPYFWO55UkScVnr8YdMcangIb9fb8kSdp3uZYLVTHGtQAxxjVA1c4HxBhX +Af8GLANWAutjjI/meF5JklR89jju6OD3S5KkXQgxxt0fEMIjwMC2u4AIfAe4JcZY2ebYd2KM/Xd6 +fz/gTuDvgA3AHcDtMcZf7+J8uw8kSVKRijGGpDN0tFzHHW1eGw7c23pJ5vZ96/bm/Y5FJEnatV2N +R0r34o3H7+q11sWSBsYY14YQBgH17Rw2FVgcY1zX+p7fAccA7ZYLxTBwkiRJ7TsA447d2av3OxaR +JGnf5XpZxAzg3Nbtc4B72jlmGTA5hFAeQgjAJ4DXcjyvJEkqPnsz7tgutH7t7/slSdI+2ONlEbt9 +cwiVwG+BDwBLgdNjjOtDCIOBn8cYT2k97iqyd4jYCrwEfDHGuDXX8JIkqXjsw7jj10At0B9YC1wV +Y/zFrt7f+d+JJEmFJ6dyQZIkSZIkKdfLIlQkQghXhRBWhBBebP06MelM6jghhBNDCAtCCK+HEP4h +6TzqPCGEJSGEl0MIL4UQnk86jyS15XikuDgeKV6OR/KTMxe0V1ovbXk3xnhd0lnUsUIIKeB1suuj +rAJmAWfEGBckGkydIoSwGKiJMTYknUWSduZ4pHg4HilujkfykzMXtC9cPbs4fAh4I8a4tHVtlNuA +0xLOpM4T8N8GSV2b45Hi4HikuDkeyUN+YNoXXw0hzAkh3BRC6Jt0GHWYQ4DlbZ6vaN2n4hCBR0II +s0IIFyQdRpLa4XikODgeKW6OR/KQ5YJ2CCE8EkKY2+ZrXuvjqcANQDrGOB5YAzgdUSpMH40xTgRO +Ai4OIRybdCBJxcXxiCQcj+Sl0qQDqOuIMR6/l4f+HLi3I7MoUSuBYW2eD23dpyIQY1zd+vhWCOEu +stNSn0o2laRi4nhErRyPFDHHI/nJmQvaKyGEQW2efgaYn1QWdbhZwOgQwvAQQhlwBjAj4UzqBCGE +niGE3q3bvYAT8O+6pC7E8UhRcTxSpByP5C9nLmhv/SCEMB7IAEuALycbRx0lxtgSQvgq8DDZAvLm +GONrCcdS5xgI3BVCiGT/ffhVjPHhhDNJUluOR4qE45Gi5ngkT3krSkmSJEmSlBMvi5AkSZIkSTmx +XJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTn5XwGz +SIQHpzdOAAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[12]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">study_trend</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:56 Time: 0:26:56 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Conclusion-and-Summary">Conclusion and Summary<a class="anchor-link" href="#Conclusion-and-Summary">&#182;</a></h1><p>I guess the most important thing to summarize with is this: <strong>looking at the entire market, stock performance prior to an earnings release has no bearing on the stock's performance.</strong> Honestly: given the huge variability of returns after an earnings release, even when the stock has been trending for a long time, you're best off divesting before an earnings release and letting the market sort itself out.</p> +<p><em>However</em>, there is a big caveat. These results are taken when we look at the entire market. So while we can say that the market as a whole knows nothing and just reacts violently, I want to take a closer look into this data. Does the market typically perform poorly on large-cap/high liquidity stocks? Do smaller companies have investors that know them better and can thus predict performance better? Are specific market sectors better at prediction? Presumably technology stocks are more volatile than the industrials.</p> +<p>So there are some more interesting questions I still want to ask with this data. Knowing that the hard work of data processing is largely already done, it should be fairly simple to continue this analysis and get much more refined with it. Until next time.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Appendix">Appendix<a class="anchor-link" href="#Appendix">&#182;</a></h1><p>Export event data for Russell 3000 companies:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">html.parser</span> <span class="kn">import</span> <span class="n">HTMLParser</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> +<span class="kn">import</span> <span class="nn">requests</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">from</span> <span class="nn">dateutil</span> <span class="kn">import</span> <span class="n">parser</span> +<span class="kn">import</span> <span class="nn">progressbar</span> +<span class="kn">from</span> <span class="nn">concurrent</span> <span class="kn">import</span> <span class="n">futures</span> +<span class="kn">import</span> <span class="nn">yaml</span> + +<span class="k">class</span> <span class="nc">EarningsParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> + <span class="n">store_dates</span> <span class="o">=</span> <span class="bp">False</span> + <span class="n">earnings_offset</span> <span class="o">=</span> <span class="bp">None</span> + <span class="n">dates</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> + <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dates</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;table&#39;</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span> <span class="o">=</span> <span class="bp">True</span> + + <span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span><span class="p">:</span> + <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r&#39;\d+/\d+/\d+&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> + <span class="k">if</span> <span class="n">match</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span> + + <span class="c"># If a company reports before the bell, record the earnings date</span> + <span class="c"># being at midnight the day before. Ex: WMT reports 5/19/2016,</span> + <span class="c"># but we want the reference point to be the closing price on 5/18/2016</span> + <span class="k">if</span> <span class="s">&#39;After Close&#39;</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="k">elif</span> <span class="s">&#39;Before Open&#39;</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">def</span> <span class="nf">handle_endtag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;table&#39;</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span> <span class="o">=</span> <span class="bp">False</span> + +<span class="k">def</span> <span class="nf">earnings_releases</span><span class="p">(</span><span class="n">ticker</span><span class="p">):</span> + <span class="c">#print(&quot;Looking up ticker {}&quot;.format(ticker))</span> + <span class="n">user_agent</span> <span class="o">=</span> <span class="s">&#39;Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) &#39;</span>\ + <span class="s">&#39;Gecko/20100101 Firefox/46.0&#39;</span> + <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;user-agent&#39;</span><span class="p">:</span> <span class="n">user_agent</span><span class="p">}</span> + <span class="n">base_url</span> <span class="o">=</span> <span class="s">&#39;http://www.streetinsider.com/ec_earnings.php?q={}&#39;</span>\ + <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + <span class="n">e</span> <span class="o">=</span> <span class="n">EarningsParser</span><span class="p">()</span> + <span class="n">s</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span> + <span class="n">a</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">adapters</span><span class="o">.</span><span class="n">HTTPAdapter</span><span class="p">(</span><span class="n">max_retries</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">s</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="s">&#39;http://&#39;</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> + <span class="n">e</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span><span class="o">.</span><span class="n">content</span><span class="p">))</span> + + <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> + <span class="n">dates</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">e</span><span class="o">.</span><span class="n">earnings_offset</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">dates</span><span class="p">)</span> + <span class="n">past</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span> <span class="n">dates</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">d</span><span class="p">:</span> <span class="n">d</span><span class="o">.</span><span class="n">isoformat</span><span class="p">(),</span> <span class="n">past</span><span class="p">))</span> + +<span class="c"># Use a Russell-3000 ETF tracker (ticker IWV) to get a list of holdings</span> +<span class="n">r3000</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;https://www.ishares.com/us/products/239714/&#39;</span> + <span class="s">&#39;ishares-russell-3000-etf/1449138789749.ajax?&#39;</span> + <span class="s">&#39;fileType=csv&amp;fileName=IWV_holdings&amp;dataType=fund&#39;</span><span class="p">,</span> + <span class="n">header</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> +<span class="n">r3000_equities</span> <span class="o">=</span> <span class="n">r3000</span><span class="p">[(</span><span class="n">r3000</span><span class="p">[</span><span class="s">&#39;Exchange&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;NASDAQ&#39;</span><span class="p">)</span> <span class="o">|</span> + <span class="p">(</span><span class="n">r3000</span><span class="p">[</span><span class="s">&#39;Exchange&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;New York Stock Exchange Inc.&#39;</span><span class="p">)]</span> + +<span class="n">dates_file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> + +<span class="k">with</span> <span class="n">futures</span><span class="o">.</span><span class="n">ThreadPoolExecutor</span><span class="p">(</span><span class="n">max_workers</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span> <span class="k">as</span> <span class="n">pool</span><span class="p">:</span> + <span class="n">fs</span> <span class="o">=</span> <span class="p">{</span><span class="n">pool</span><span class="o">.</span><span class="n">submit</span><span class="p">(</span><span class="n">earnings_releases</span><span class="p">,</span> <span class="n">r3000_equities</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="s">&#39;Ticker&#39;</span><span class="p">]):</span> <span class="n">t</span> + <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">r3000_equities</span><span class="o">.</span><span class="n">index</span><span class="p">}</span> + <span class="n">pbar</span> <span class="o">=</span> <span class="n">progressbar</span><span class="o">.</span><span class="n">ProgressBar</span><span class="p">(</span><span class="n">term_width</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> + <span class="n">max_value</span><span class="o">=</span><span class="n">r3000_equities</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">max</span><span class="p">())</span> + + <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">fs</span><span class="p">):</span> + <span class="n">i</span> <span class="o">=</span> <span class="n">fs</span><span class="p">[</span><span class="n">future</span><span class="p">]</span> + <span class="n">pbar</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> + <span class="n">dates_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">yaml</span><span class="o">.</span><span class="n">dump</span><span class="p">({</span><span class="n">r3000_equities</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Ticker&#39;</span><span class="p">]:</span> + <span class="n">future</span><span class="o">.</span><span class="n">result</span><span class="p">()}))</span> +</pre></div> +<p>Downloading stock price data needed for the event studies:</p> +<div class="highlight"><pre><span class="kn">from</span> <span class="nn">secrets</span> <span class="kn">import</span> <span class="n">QUANDL_KEY</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<span class="kn">import</span> <span class="nn">yaml</span> +<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="kn">import</span> <span class="n">parse</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span> +<span class="kn">import</span> <span class="nn">quandl</span> +<span class="kn">from</span> <span class="nn">progressbar</span> <span class="kn">import</span> <span class="n">ProgressBar</span> + +<span class="k">def</span> <span class="nf">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span> + <span class="c"># Quandl is currently giving me issues with returning</span> + <span class="c"># the entire dataset and not slicing server-side.</span> + <span class="c"># So instead, we&#39;ll do it client-side!</span> + <span class="n">q_format</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/&#39;</span> <span class="o">+</span> <span class="n">ticker</span><span class="p">,</span> + <span class="n">start_date</span><span class="o">=</span><span class="n">start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">end_date</span><span class="o">=</span><span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">authtoken</span><span class="o">=</span><span class="n">QUANDL_KEY</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ticker_data</span> + +<span class="n">data_str</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> +<span class="c"># Need to remove invalid lines</span> +<span class="n">filtered</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="s">&#39;{&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">x</span><span class="p">,</span> <span class="n">data_str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">))</span> +<span class="n">earnings_data</span> <span class="o">=</span> <span class="n">yaml</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">filtered</span><span class="p">))</span> + +<span class="c"># Get the first 1500 keys - split up into two statements</span> +<span class="c"># because of Quandl rate limits</span> +<span class="n">tickers</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">earnings_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + +<span class="n">price_dict</span> <span class="o">=</span> <span class="p">{}</span> +<span class="n">invalid_tickers</span> <span class="o">=</span> <span class="p">[]</span> +<span class="k">for</span> <span class="n">ticker</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">tickers</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">1500</span><span class="p">]):</span> + <span class="k">try</span><span class="p">:</span> + <span class="c"># Replace &#39;.&#39; with &#39;-&#39; in name for some tickers</span> + <span class="n">fixed</span> <span class="o">=</span> <span class="n">ticker</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> + <span class="n">event_strs</span> <span class="o">=</span> <span class="n">earnings_data</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> + <span class="n">events</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse</span><span class="p">(</span><span class="n">event</span><span class="p">)</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">event_strs</span><span class="p">]</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> + <span class="n">price_dict</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">fixed</span><span class="p">,</span> + <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">-</span><span class="n">td</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">+</span><span class="n">td</span><span class="p">)</span> + <span class="k">except</span> <span class="n">quandl</span><span class="o">.</span><span class="n">NotFoundError</span><span class="p">:</span> + <span class="n">invalid_tickers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + +<span class="c"># Execute this after 10 minutes have passed</span> +<span class="k">for</span> <span class="n">ticker</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">tickers</span><span class="p">[</span><span class="mi">1500</span><span class="p">:]):</span> + <span class="k">try</span><span class="p">:</span> + <span class="c"># Replace &#39;.&#39; with &#39;-&#39; in name for some tickers</span> + <span class="n">fixed</span> <span class="o">=</span> <span class="n">ticker</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> + <span class="n">event_strs</span> <span class="o">=</span> <span class="n">earnings_data</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> + <span class="n">events</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse</span><span class="p">(</span><span class="n">event</span><span class="p">)</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">event_strs</span><span class="p">]</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> + <span class="n">price_dict</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">fixed</span><span class="p">,</span> + <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">-</span><span class="n">td</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">+</span><span class="n">td</span><span class="p">)</span> + <span class="k">except</span> <span class="n">quandl</span><span class="o">.</span><span class="n">NotFoundError</span><span class="p">:</span> + <span class="n">invalid_tickers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + +<span class="n">prices_store</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">HDFStore</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">)</span> +<span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">prices</span> <span class="ow">in</span> <span class="n">price_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="n">prices_store</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">prices</span> +</pre></div> + +</div> +</div> +</div></p> +<script type="text/x-mathjax-config"> +//MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); +MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); +</script> + +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -19,7 +5255,7 @@ <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline @@ -27,8 +5263,8 @@ <span class="n">fair_1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">fair_2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Fair Distribution&#39;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Fair Distribution&#39;</span><span class="p">);</span> </pre></div> </div> @@ -229,7 +5465,7 @@ D_2 = \left\{ <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">nonzero</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> @@ -239,8 +5475,8 @@ D_2 = \left\{ <span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> </pre></div> </div> @@ -432,14 +5668,14 @@ D_2 = \left\{ <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> <span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> <span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> </pre></div> </div> @@ -655,22 +5891,22 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="k">import</span> <span class="n">polynomial</span> <span class="k">def</span> <span class="nf">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># Calculating the probabilities of each outcome was taken</span> - <span class="c1"># from this author: http://math.stackexchange.com/a/1710392/320784</span> + <span class="c"># Calculating the probabilities of each outcome was taken</span> + <span class="c"># from this author: http://math.stackexchange.com/a/1710392/320784</span> <span class="n">d1_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d1_density</span><span class="p">)</span> <span class="n">d2_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d2_density</span><span class="p">)</span> <span class="n">coefs</span> <span class="o">=</span> <span class="p">(</span><span class="n">d1_p</span> <span class="o">*</span> <span class="n">d2_p</span><span class="p">)</span><span class="o">.</span><span class="n">coef</span> <span class="k">return</span> <span class="n">coefs</span> <span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># We&#39;ve now got the probabilities of each event, but we need</span> - <span class="c1"># to shift the array a bit so we can use the x values to actually</span> - <span class="c1"># index into it. This will allow us to do all the calculations</span> - <span class="c1"># incredibly quickly</span> + <span class="c"># We&#39;ve now got the probabilities of each event, but we need</span> + <span class="c"># to shift the array a bit so we can use the x values to actually</span> + <span class="c"># index into it. This will allow us to do all the calculations</span> + <span class="c"># incredibly quickly</span> <span class="n">coefs</span> <span class="o">=</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">)</span> <span class="n">coefs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">coefs</span><span class="p">))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">coefs</span><span class="p">[</span><span class="n">x</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> @@ -696,24 +5932,24 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># To ensure we have legitimate densities, we will randomly</span> - <span class="c1"># increase one die face probability by `change`,</span> - <span class="c1"># and decrease one by `change`.</span> - <span class="c1"># This means there are something less than (1/`change`)^12 possibilities</span> - <span class="c1"># we are trying to search over.</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c"># To ensure we have legitimate densities, we will randomly</span> + <span class="c"># increase one die face probability by `change`,</span> + <span class="c"># and decrease one by `change`.</span> + <span class="c"># This means there are something less than (1/`change`)^12 possibilities</span> + <span class="c"># we are trying to search over.</span> <span class="n">change</span> <span class="o">=</span> <span class="o">.</span><span class="mi">01</span> <span class="n">d1_index1</span><span class="p">,</span> <span class="n">d1_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">d2_index1</span><span class="p">,</span> <span class="n">d2_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> - <span class="c1"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> - <span class="c1"># in the past that made everything blow up.</span> + <span class="c"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> + <span class="c"># in the past that made everything blow up.</span> <span class="n">new_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d1_density</span><span class="p">))</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d2_density</span><span class="p">))</span> - <span class="c1"># While this doesn&#39;t account for the possibility that some</span> - <span class="c1"># values go negative, in practice this never happens</span> + <span class="c"># While this doesn&#39;t account for the possibility that some</span> + <span class="c"># values go negative, in practice this never happens</span> <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> @@ -742,28 +5978,28 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">iter_count</span> <span class="o">=</span> <span class="mi">0</span> - <span class="c1"># Start with guessing fair dice</span> + <span class="c"># Start with guessing fair dice</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> - <span class="c1"># Keep track of our best guesses - may not be</span> - <span class="c1"># what we end with</span> + <span class="c"># Keep track of our best guesses - may not be</span> + <span class="c"># what we end with</span> <span class="n">max_score</span> <span class="o">=</span> <span class="n">cur_score</span> <span class="n">max_d1</span> <span class="o">=</span> <span class="n">cur_d1</span> <span class="n">max_d2</span> <span class="o">=</span> <span class="n">cur_d2</span> - <span class="c1"># Optimization stops when we have failed to switch `conv_count`</span> - <span class="c1"># times (presumably because we have a great guess), or we reach</span> - <span class="c1"># the maximum number of iterations.</span> + <span class="c"># Optimization stops when we have failed to switch `conv_count`</span> + <span class="c"># times (presumably because we have a great guess), or we reach</span> + <span class="c"># the maximum number of iterations.</span> <span class="k">while</span> <span class="n">switch_failures</span> <span class="o">&lt;</span> <span class="n">conv_count</span> <span class="ow">and</span> <span class="n">iter_count</span> <span class="o">&lt;</span> <span class="n">max_iter</span><span class="p">:</span> <span class="n">iter_count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">iter_count</span> <span class="o">%</span> <span class="p">(</span><span class="n">max_iter</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> - <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Iteration: </span><span class="si">{}</span><span class="s1">; Current score (higher is better): </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="nb">print</span><span class="p">(</span><span class="s">&#39;Iteration: {}; Current score (higher is better): {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">iter_count</span><span class="p">,</span> <span class="n">cur_score</span><span class="p">))</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">permute</span><span class="p">(</span><span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> @@ -775,19 +6011,19 @@ and continue the next iteration.</li> <span class="n">max_d2</span> <span class="o">=</span> <span class="n">new_d2</span> <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">cur_score</span><span class="p">:</span> - <span class="c1"># If the new permutation beats the old one,</span> - <span class="c1"># automatically select it.</span> + <span class="c"># If the new permutation beats the old one,</span> + <span class="c"># automatically select it.</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> - <span class="c1"># We didn&#39;t beat the current score, but allow</span> - <span class="c1"># for possibly switching anyways.</span> + <span class="c"># We didn&#39;t beat the current score, but allow</span> + <span class="c"># for possibly switching anyways.</span> <span class="n">accept_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">new_score</span> <span class="o">-</span> <span class="n">cur_score</span><span class="p">)</span> <span class="n">coin_toss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">()</span> <span class="k">if</span> <span class="n">coin_toss</span> <span class="o">&lt;</span> <span class="n">accept_prob</span><span class="p">:</span> - <span class="c1"># We randomly switch to the new distribution</span> + <span class="c"># We randomly switch to the new distribution</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> @@ -795,7 +6031,7 @@ and continue the next iteration.</li> <span class="k">else</span><span class="p">:</span> <span class="n">switch_failures</span> <span class="o">+=</span> <span class="mi">1</span> - <span class="c1"># Return both our best guess, and the ending guess</span> + <span class="c"># Return both our best guess, and the ending guess</span> <span class="k">return</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span> </pre></div> @@ -821,7 +6057,7 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">time</span> <span class="k">def</span> <span class="nf">simulate_casino</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10000</span><span class="p">):</span> <span class="n">d1_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">d2_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> @@ -829,20 +6065,20 @@ and continue the next iteration.</li> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">final_d1</span><span class="p">,</span> <span class="n">final_d2</span> <span class="o">=</span> <span class="n">optimize</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">)</span> <span class="n">end</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> - <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Simulated Annealing time: </span><span class="si">{:.02f}</span><span class="s2">s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> + <span class="nb">print</span><span class="p">(</span><span class="s">&quot;Simulated Annealing time: {:.02f}s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> <span class="n">coef_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">13</span><span class="p">)</span> <span class="o">-</span> <span class="o">.</span><span class="mi">5</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">221</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;True Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;True Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">222</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Empirical Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Empirical Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">223</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Recovered Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Recovered Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> @@ -1223,7 +6459,7 @@ m+QFBkHwS1PQ018D5wD/PHxt/03H/cxXeHtR0jLn4qiSJEkNdH17UZIkaUUwdEmSJDVg6JIkSWrA <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">])</span> </pre></div> @@ -1551,7 +6787,7 @@ jAU+qF/bLxXO081keTEiTnJpjhoRERHRgNLLixEREREjQoquiIiIiAak6IqIiIhoQIquiIiIiAak <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">])</span> </pre></div> @@ -1925,7 +7161,7 @@ RK5CYII= <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> </pre></div> </div> @@ -2316,7 +7552,7 @@ hoSz1PA0AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> <span class="n">n</span><span class="o">=</span><span class="mi">250</span><span class="p">)</span> </pre></div> @@ -2727,7 +7963,7 @@ JDVg6JIkSWrA0CVJktSAoUuSJKkBQ5ckSVIDhi5JkqQG/gdFMjKH5D5DewAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -2746,7 +7982,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">total_heartbeats</span> <span class="o">=</span> <span class="mi">2500000000</span> +<div class=" highlight hl-ipython3"><pre><span class="n">total_heartbeats</span> <span class="o">=</span> <span class="mi">2500000000</span> </pre></div> </div> @@ -2778,7 +8014,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Import all the OAuth secret information from a local file</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># Import all the OAuth secret information from a local file</span> <span class="kn">from</span> <span class="nn">secrets</span> <span class="k">import</span> <span class="n">CLIENT_SECRET</span><span class="p">,</span> <span class="n">CLIENT_ID</span><span class="p">,</span> <span class="n">CALLBACK_URL</span> </pre></div> @@ -2817,19 +8053,19 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">urllib</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">urllib</span> -<span class="n">FITBIT_URI</span> <span class="o">=</span> <span class="s1">&#39;https://www.fitbit.com/oauth2/authorize&#39;</span> +<span class="n">FITBIT_URI</span> <span class="o">=</span> <span class="s">&#39;https://www.fitbit.com/oauth2/authorize&#39;</span> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span> - <span class="c1"># If we need more than one scope, must be a CSV string</span> - <span class="s1">&#39;scope&#39;</span><span class="p">:</span> <span class="s1">&#39;heartrate&#39;</span><span class="p">,</span> - <span class="s1">&#39;response_type&#39;</span><span class="p">:</span> <span class="s1">&#39;token&#39;</span><span class="p">,</span> - <span class="s1">&#39;expires_in&#39;</span><span class="p">:</span> <span class="mi">86400</span><span class="p">,</span> <span class="c1"># 1 day</span> - <span class="s1">&#39;redirect_uri&#39;</span><span class="p">:</span> <span class="n">CALLBACK_URL</span><span class="p">,</span> - <span class="s1">&#39;client_id&#39;</span><span class="p">:</span> <span class="n">CLIENT_ID</span> + <span class="c"># If we need more than one scope, must be a CSV string</span> + <span class="s">&#39;scope&#39;</span><span class="p">:</span> <span class="s">&#39;heartrate&#39;</span><span class="p">,</span> + <span class="s">&#39;response_type&#39;</span><span class="p">:</span> <span class="s">&#39;token&#39;</span><span class="p">,</span> + <span class="s">&#39;expires_in&#39;</span><span class="p">:</span> <span class="mi">86400</span><span class="p">,</span> <span class="c"># 1 day</span> + <span class="s">&#39;redirect_uri&#39;</span><span class="p">:</span> <span class="n">CALLBACK_URL</span><span class="p">,</span> + <span class="s">&#39;client_id&#39;</span><span class="p">:</span> <span class="n">CLIENT_ID</span> <span class="p">}</span> -<span class="n">request_url</span> <span class="o">=</span> <span class="n">FITBIT_URI</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> +<span class="n">request_url</span> <span class="o">=</span> <span class="n">FITBIT_URI</span> <span class="o">+</span> <span class="s">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> </pre></div> </div> @@ -2852,10 +8088,10 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># The `response_url` variable contains the full URL that</span> -<span class="c1"># FitBit sent back to us, but most importantly,</span> -<span class="c1"># contains the token we need for authorization.</span> -<span class="n">access_token</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">response_url</span><span class="p">))[</span><span class="s1">&#39;access_token&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># The `response_url` variable contains the full URL that</span> +<span class="c"># FitBit sent back to us, but most importantly,</span> +<span class="c"># contains the token we need for authorization.</span> +<span class="n">access_token</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">response_url</span><span class="p">))[</span><span class="s">&#39;access_token&#39;</span><span class="p">]</span> </pre></div> </div> @@ -2879,46 +8115,46 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">requests_oauthlib</span> <span class="k">import</span> <span class="n">OAuth2Session</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">requests_oauthlib</span> <span class="k">import</span> <span class="n">OAuth2Session</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> <span class="n">session</span> <span class="o">=</span> <span class="n">OAuth2Session</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="p">{</span> - <span class="s1">&#39;access_token&#39;</span><span class="p">:</span> <span class="n">access_token</span><span class="p">,</span> - <span class="s1">&#39;token_type&#39;</span><span class="p">:</span> <span class="s1">&#39;Bearer&#39;</span> + <span class="s">&#39;access_token&#39;</span><span class="p">:</span> <span class="n">access_token</span><span class="p">,</span> + <span class="s">&#39;token_type&#39;</span><span class="p">:</span> <span class="s">&#39;Bearer&#39;</span> <span class="p">})</span> -<span class="n">format_str</span> <span class="o">=</span> <span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">&#39;</span> +<span class="n">format_str</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-%d&#39;</span> <span class="n">start_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">end_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">31</span><span class="p">)</span> <span class="n">dr</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span> -<span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://api.fitbit.com/1/user/-/activities/heart/date/</span><span class="si">{0}</span><span class="s1">/1d/1min.json&#39;</span> +<span class="n">url</span> <span class="o">=</span> <span class="s">&#39;https://api.fitbit.com/1/user/-/activities/heart/date/{0}/1d/1min.json&#39;</span> <span class="n">hr_responses</span> <span class="o">=</span> <span class="p">[</span><span class="n">session</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">format_str</span><span class="p">)))</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dr</span><span class="p">]</span> <span class="k">def</span> <span class="nf">record_to_df</span><span class="p">(</span><span class="n">record</span><span class="p">):</span> - <span class="k">if</span> <span class="s1">&#39;activities-heart&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">record</span><span class="p">:</span> - <span class="k">return</span> <span class="kc">None</span> - <span class="n">date_str</span> <span class="o">=</span> <span class="n">record</span><span class="p">[</span><span class="s1">&#39;activities-heart&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;dateTime&#39;</span><span class="p">]</span> - <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">record</span><span class="p">[</span><span class="s1">&#39;activities-heart-intraday&#39;</span><span class="p">][</span><span class="s1">&#39;dataset&#39;</span><span class="p">])</span> + <span class="k">if</span> <span class="s">&#39;activities-heart&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">record</span><span class="p">:</span> + <span class="k">return</span> <span class="k">None</span> + <span class="n">date_str</span> <span class="o">=</span> <span class="n">record</span><span class="p">[</span><span class="s">&#39;activities-heart&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;dateTime&#39;</span><span class="p">]</span> + <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">record</span><span class="p">[</span><span class="s">&#39;activities-heart-intraday&#39;</span><span class="p">][</span><span class="s">&#39;dataset&#39;</span><span class="p">])</span> - <span class="n">df</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span> - <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">date_str</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S&#39;</span><span class="p">))</span> + <span class="n">df</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span> + <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">date_str</span> <span class="o">+</span> <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="s">&#39;%Y-%m-%d %H:%M:%S&#39;</span><span class="p">))</span> <span class="k">return</span> <span class="n">df</span> <span class="n">hr_dataframes</span> <span class="o">=</span> <span class="p">[</span><span class="n">record_to_df</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">json</span><span class="p">())</span> <span class="k">for</span> <span class="n">record</span> <span class="ow">in</span> <span class="n">hr_responses</span><span class="p">]</span> <span class="n">hr_df_concat</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">(</span><span class="n">hr_dataframes</span><span class="p">)</span> -<span class="c1"># There are some minutes with missing data, so we need to correct that</span> +<span class="c"># There are some minutes with missing data, so we need to correct that</span> <span class="n">full_daterange</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">hr_df_concat</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;min&#39;</span><span class="p">)</span> -<span class="n">hr_df_full</span> <span class="o">=</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">reindex</span><span class="p">(</span><span class="n">full_daterange</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;nearest&#39;</span><span class="p">)</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;min&#39;</span><span class="p">)</span> +<span class="n">hr_df_full</span> <span class="o">=</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">reindex</span><span class="p">(</span><span class="n">full_daterange</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s">&#39;nearest&#39;</span><span class="p">)</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Heartbeats from </span><span class="si">{}</span><span class="s2"> to </span><span class="si">{}</span><span class="s2">: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Heartbeats from {} to {}: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> - <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()))</span> + <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()))</span> </pre></div> </div> @@ -2966,9 +8202,9 @@ hr_q \cdot n - hr_d \cdot (n-m) <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">quarterly_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">quarterly_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">leap_day_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> - <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">29</span><span class="p">)][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> + <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">29</span><span class="p">)][</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">num_quarters</span> <span class="o">=</span> <span class="mi">96</span> <span class="n">leap_days</span> <span class="o">=</span> <span class="mi">6</span> @@ -3013,17 +8249,17 @@ hr_q \cdot n - hr_d \cdot (n-m) <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">minute_mean</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> -<span class="c1"># Don&#39;t you wish you knew?</span> -<span class="c1"># birthday_minutes = ???</span> +<div class=" highlight hl-ipython3"><pre><span class="n">minute_mean</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> +<span class="c"># Don&#39;t you wish you knew?</span> +<span class="c"># birthday_minutes = ???</span> <span class="n">birthday_heartbeats</span> <span class="o">=</span> <span class="n">birthday_minutes</span> <span class="o">*</span> <span class="n">minute_mean</span> <span class="n">heartbeats_until_2016</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">birthday_heartbeats</span> <span class="o">+</span> <span class="n">jan_92_jan_16</span><span class="p">)</span> <span class="n">remaining_2016</span> <span class="o">=</span> <span class="n">total_heartbeats</span> <span class="o">-</span> <span class="n">heartbeats_until_2016</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Heartbeats so far: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">heartbeats_until_2016</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_2016</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Heartbeats so far: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">heartbeats_until_2016</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_2016</span><span class="p">))</span> </pre></div> </div> @@ -3071,7 +8307,7 @@ hr_q \cdot n - hr_d \cdot (n - m) <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">heartbeats_4year</span> <span class="o">=</span> <span class="n">quarterly_count</span> <span class="o">*</span> <span class="mi">16</span> <span class="o">-</span> <span class="n">leap_day_count</span> <span class="o">*</span> <span class="p">(</span><span class="mi">16</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">heartbeats_4year</span> <span class="o">=</span> <span class="n">quarterly_count</span> <span class="o">*</span> <span class="mi">16</span> <span class="o">-</span> <span class="n">leap_day_count</span> <span class="o">*</span> <span class="p">(</span><span class="mi">16</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="n">heartbeats_4year</span> </pre></div> @@ -3111,11 +8347,11 @@ hr_q \cdot n - hr_d \cdot (n - m) <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">four_year_periods</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">//</span> <span class="n">heartbeats_4year</span> +<div class=" highlight hl-ipython3"><pre><span class="n">four_year_periods</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">//</span> <span class="n">heartbeats_4year</span> <span class="n">remaining_4y</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">-</span> <span class="n">four_year_periods</span> <span class="o">*</span> <span class="n">heartbeats_4year</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Four year periods remaining: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">four_year_periods</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats after 4 year periods: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_4y</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Four year periods remaining: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">four_year_periods</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats after 4 year periods: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_4y</span><span class="p">))</span> </pre></div> </div> @@ -3153,15 +8389,15 @@ Remaining heartbeats after 4 year periods: 48041640 <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">remaining_leap</span> <span class="o">=</span> <span class="n">remaining_4y</span> <span class="o">-</span> <span class="n">leap_day_count</span> -<span class="c1"># Ignore leap day in the data set</span> +<div class=" highlight hl-ipython3"><pre><span class="n">remaining_leap</span> <span class="o">=</span> <span class="n">remaining_4y</span> <span class="o">-</span> <span class="n">leap_day_count</span> +<span class="c"># Ignore leap day in the data set</span> <span class="n">heartbeats_quarter</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> - <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">!=</span> <span class="mi">29</span><span class="p">)][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> + <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">!=</span> <span class="mi">29</span><span class="p">)][</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">quarters_left</span> <span class="o">=</span> <span class="n">remaining_leap</span> <span class="o">//</span> <span class="n">heartbeats_quarter</span> <span class="n">remaining_year</span> <span class="o">=</span> <span class="n">remaining_leap</span> <span class="o">-</span> <span class="n">quarters_left</span> <span class="o">*</span> <span class="n">heartbeats_quarter</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Quarters left starting 2068: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quarters_left</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats after that: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_year</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Quarters left starting 2068: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quarters_left</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats after that: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_year</span><span class="p">))</span> </pre></div> </div> @@ -3199,7 +8435,7 @@ Remaining heartbeats after that: 4760716 <div class="prompt input_prompt">In&nbsp;[13]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span> <span class="n">base</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2070</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">minutes_left</span> <span class="o">=</span> <span class="n">remaining_year</span> <span class="o">//</span> <span class="n">minute_mean</span> @@ -3247,7 +8483,7 @@ Remaining heartbeats after that: 4760716 MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -3287,13 +8523,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> -<span class="n">tweets</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;tweets.csv&#39;</span><span class="p">)</span> +<span class="n">tweets</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;tweets.csv&#39;</span><span class="p">)</span> <span class="n">text</span> <span class="o">=</span> <span class="n">tweets</span><span class="o">.</span><span class="n">text</span> -<span class="c1"># Don&#39;t include tweets in reply to or mentioning people</span> -<span class="n">replies</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> +<span class="c"># Don&#39;t include tweets in reply to or mentioning people</span> +<span class="n">replies</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s">&#39;@&#39;</span><span class="p">)</span> <span class="n">text_norep</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="o">~</span><span class="n">replies</span><span class="p">]</span> </pre></div> @@ -3317,7 +8553,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">nltk.tokenize</span> <span class="k">import</span> <span class="n">TweetTokenizer</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">nltk.tokenize</span> <span class="k">import</span> <span class="n">TweetTokenizer</span> <span class="n">tknzr</span> <span class="o">=</span> <span class="n">TweetTokenizer</span><span class="p">()</span> <span class="n">tokens</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">tknzr</span><span class="o">.</span><span class="n">tokenize</span><span class="p">)</span> @@ -3346,12 +8582,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">reduce</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">reduce</span> -<span class="c1"># Get all possible words</span> +<span class="c"># Get all possible words</span> <span class="n">all_words</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="n">tokens</span><span class="p">,</span> <span class="p">[])</span> <span class="n">unique_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_words</span><span class="p">)</span> -<span class="n">actual_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;.&#39;</span> <span class="k">else</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span><span class="p">])</span> +<span class="n">actual_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;.&#39;</span> <span class="k">else</span> <span class="k">None</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span><span class="p">])</span> <span class="n">word_dist</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="nb">iter</span><span class="p">(</span><span class="n">actual_words</span><span class="p">):</span> @@ -3380,12 +8616,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="n">hashtags</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">&#39;#&#39;</span><span class="p">)</span> +<span class="n">hashtags</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">)</span> <span class="n">bins</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> -<span class="n">hashtags</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span> +<span class="n">hashtags</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span> </pre></div> </div> @@ -3517,7 +8753,7 @@ AElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">mle</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">mle</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="n">mle</span> </pre></div> @@ -3557,12 +8793,12 @@ AElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">hashtags</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">all_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;#&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">hashtags</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">all_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">]</span> <span class="n">n_hashtags</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> -<span class="n">unique_hashtags</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;#&#39;</span><span class="p">]))</span> -<span class="n">hashtag_dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;hashtags&#39;</span><span class="p">:</span> <span class="n">unique_hashtags</span><span class="p">,</span> - <span class="s1">&#39;prob&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">all_words</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">/</span> <span class="n">n_hashtags</span> +<span class="n">unique_hashtags</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">]))</span> +<span class="n">hashtag_dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">&#39;hashtags&#39;</span><span class="p">:</span> <span class="n">unique_hashtags</span><span class="p">,</span> + <span class="s">&#39;prob&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">all_words</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">/</span> <span class="n">n_hashtags</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">unique_hashtags</span><span class="p">]})</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtag_dist</span><span class="p">)</span> </pre></div> @@ -3615,12 +8851,12 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="k">def</span> <span class="nf">multinom_sim</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">vals</span><span class="p">,</span> <span class="n">probs</span><span class="p">):</span> <span class="n">occurrences</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">probs</span><span class="p">)</span> <span class="n">results</span> <span class="o">=</span> <span class="n">occurrences</span> <span class="o">*</span> <span class="n">vals</span> - <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">results</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">])</span> + <span class="k">return</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">results</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">])</span> <span class="k">def</span> <span class="nf">sim_n_hashtags</span><span class="p">(</span><span class="n">hashtag_freq</span><span class="p">):</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">poisson</span><span class="p">(</span><span class="n">hashtag_freq</span><span class="p">)</span> @@ -3630,7 +8866,7 @@ z: .17</code></pre> <span class="k">def</span> <span class="nf">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">):</span> <span class="n">probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">first_word_dist</span><span class="o">.</span><span class="n">values</span><span class="p">)</span> - <span class="k">return</span> <span class="n">multinom_sim</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_word_dist</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()[</span><span class="s1">&#39;index&#39;</span><span class="p">],</span> <span class="n">probs</span><span class="p">)</span> + <span class="k">return</span> <span class="n">multinom_sim</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_word_dist</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()[</span><span class="s">&#39;index&#39;</span><span class="p">],</span> <span class="n">probs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">sim_next_word</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">):</span> <span class="n">dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">word_dist</span><span class="p">[</span><span class="n">current</span><span class="p">])</span> @@ -3658,14 +8894,14 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> <span class="n">second</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">third</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">second</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">fourth</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">third</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">fifth</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">fourth</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">hashtag</span> <span class="o">=</span> <span class="n">sim_hashtags</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hashtag_dist</span><span class="p">)</span> -<span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">third</span><span class="p">,</span> <span class="n">fourth</span><span class="p">,</span> <span class="n">fifth</span><span class="p">,</span> <span class="n">hashtag</span><span class="p">))</span> +<span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">third</span><span class="p">,</span> <span class="n">fourth</span><span class="p">,</span> <span class="n">fifth</span><span class="p">,</span> <span class="n">hashtag</span><span class="p">))</span> </pre></div> </div> @@ -3704,7 +8940,7 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">simulate_tweet</span><span class="p">():</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">simulate_tweet</span><span class="p">():</span> <span class="n">chars_remaining</span> <span class="o">=</span> <span class="mi">140</span> <span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> <span class="n">n_hash</span> <span class="o">=</span> <span class="n">sim_n_hashtags</span><span class="p">(</span><span class="n">mle</span><span class="p">)</span> @@ -3714,13 +8950,13 @@ z: .17</code></pre> <span class="n">tweet</span> <span class="o">=</span> <span class="n">first</span> <span class="n">current</span> <span class="o">=</span> <span class="n">first</span> - <span class="k">while</span> <span class="n">chars_remaining</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">tweet</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;.&#39;</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span> + <span class="k">while</span> <span class="n">chars_remaining</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">tweet</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;.&#39;</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;!&#39;</span><span class="p">:</span> <span class="n">current</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> - <span class="n">tweet</span> <span class="o">+=</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">current</span> + <span class="n">tweet</span> <span class="o">+=</span> <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="n">current</span> <span class="n">tweet</span> <span class="o">=</span> <span class="n">tweet</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">tweet</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> - <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">tweet</span><span class="p">,</span> <span class="n">hashtags</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> + <span class="k">return</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">tweet</span><span class="p">,</span> <span class="n">hashtags</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> </pre></div> </div> @@ -3743,7 +8979,7 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span> <span class="nb">print</span><span class="p">(</span><span class="n">simulate_tweet</span><span class="p">())</span> <span class="nb">print</span><span class="p">()</span> </pre></div> @@ -3822,7 +9058,7 @@ Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -3839,18 +9075,18 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="c1"># Record how long it takes to run the notebook - I&#39;m curious.</span> +<span class="c"># Record how long it takes to run the notebook - I&#39;m curious.</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> <span class="n">start</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> -<span class="n">dataset</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;split_train.csv&#39;</span><span class="p">)</span> +<span class="n">dataset</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;split_train.csv&#39;</span><span class="p">)</span> <span class="n">dataset</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">ID</span> -<span class="n">X</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s1">&#39;TARGET&#39;</span><span class="p">,</span> <span class="s1">&#39;ID&#39;</span><span class="p">,</span> <span class="s1">&#39;ID.1&#39;</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> +<span class="n">X</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s">&#39;TARGET&#39;</span><span class="p">,</span> <span class="s">&#39;ID&#39;</span><span class="p">,</span> <span class="s">&#39;ID.1&#39;</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">TARGET</span> </pre></div> @@ -3864,7 +9100,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">y</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">y</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span> </pre></div> </div> @@ -3893,7 +9129,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> </pre></div> </div> @@ -3935,7 +9171,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cols</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">columns</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cols</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">columns</span> <span class="n">b_class</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">cols</span><span class="p">:</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="p">[</span><span class="n">c</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">())</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> @@ -3980,13 +9216,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># First we need to `binarize` the data to 0-1; some of the labels are {0, 1},</span> -<span class="c1"># some are {0, 3}, etc.</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># First we need to `binarize` the data to 0-1; some of the labels are {0, 1},</span> +<span class="c"># some are {0, 3}, etc.</span> <span class="kn">from</span> <span class="nn">sklearn.preprocessing</span> <span class="k">import</span> <span class="n">binarize</span> <span class="n">X_bin</span> <span class="o">=</span> <span class="n">binarize</span><span class="p">(</span><span class="n">X</span><span class="p">[</span><span class="n">b_class</span><span class="p">])</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">X_bin</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b_class</span><span class="p">))]</span> -<span class="n">acc_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s2">&quot;Accuracy&quot;</span><span class="p">:</span> <span class="n">accuracy</span><span class="p">},</span> <span class="n">index</span><span class="o">=</span><span class="n">b_class</span><span class="p">)</span> +<span class="n">acc_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">&quot;Accuracy&quot;</span><span class="p">:</span> <span class="n">accuracy</span><span class="p">},</span> <span class="n">index</span><span class="o">=</span><span class="n">b_class</span><span class="p">)</span> <span class="n">acc_df</span><span class="o">.</span><span class="n">describe</span><span class="p">()</span> </pre></div> @@ -4069,10 +9305,10 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">unsat</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Satisfied customers: </span><span class="si">{}</span><span class="s2">; Unsatisfied customers: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">-</span> <span class="n">unsat</span><span class="p">,</span> <span class="n">unsat</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">unsat</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Satisfied customers: {}; Unsatisfied customers: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">-</span> <span class="n">unsat</span><span class="p">,</span> <span class="n">unsat</span><span class="p">))</span> <span class="n">naive_guess</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Naive guess accuracy: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Naive guess accuracy: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">))</span> </pre></div> </div> @@ -4119,7 +9355,7 @@ Naive guess accuracy: 0.9608561656706882 <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.naive_bayes</span> <span class="k">import</span> <span class="n">GaussianNB</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">sklearn.naive_bayes</span> <span class="k">import</span> <span class="n">GaussianNB</span> <span class="kn">from</span> <span class="nn">sklearn.decomposition</span> <span class="k">import</span> <span class="n">PCA</span> <span class="n">X_no_bin</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">b_class</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> @@ -4133,9 +9369,9 @@ Naive guess accuracy: 0.9608561656706882 <span class="k">return</span> <span class="n">gnb</span><span class="o">.</span><span class="n">score</span><span class="p">(</span><span class="n">X_xform</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="n">dim_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">21</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">();</span> </pre></div> @@ -4410,7 +9646,7 @@ rkJggg== <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">evaluate_gnb_full</span><span class="p">(</span><span class="n">dims</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">evaluate_gnb_full</span><span class="p">(</span><span class="n">dims</span><span class="p">):</span> <span class="n">pca</span> <span class="o">=</span> <span class="n">PCA</span><span class="p">(</span><span class="n">n_components</span><span class="o">=</span><span class="n">dims</span><span class="p">)</span> <span class="n">X_xform</span> <span class="o">=</span> <span class="n">pca</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> @@ -4419,9 +9655,9 @@ rkJggg== <span class="k">return</span> <span class="n">gnb</span><span class="o">.</span><span class="n">score</span><span class="p">(</span><span class="n">X_xform</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="n">dim_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">21</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">();</span> </pre></div> @@ -4696,8 +9932,8 @@ rkJggg== <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Running time: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Running time: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> </pre></div> </div> @@ -4725,15 +9961,15 @@ rkJggg== <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="Appendix">Appendix<a class="anchor-link" href="#Appendix">&#182;</a></h1><p>Code used to split the initial training data:</p> -<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.cross_validation</span> <span class="kn">import</span> <span class="n">train_test_split</span> -<span class="n">data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;train.csv&#39;</span><span class="p">)</span> +<div class="highlight"><pre><span class="kn">from</span> <span class="nn">sklearn.cross_validation</span> <span class="kn">import</span> <span class="n">train_test_split</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;train.csv&#39;</span><span class="p">)</span> <span class="n">data</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">ID</span> <span class="n">data_train</span><span class="p">,</span> <span class="n">data_validate</span> <span class="o">=</span> <span class="n">train_test_split</span><span class="p">(</span> <span class="n">data</span><span class="p">,</span> <span class="n">train_size</span><span class="o">=.</span><span class="mi">7</span><span class="p">)</span> -<span class="n">data_train</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s1">&#39;split_train.csv&#39;</span><span class="p">)</span> -<span class="n">data_validate</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s1">&#39;split_validate.csv&#39;</span><span class="p">)</span> +<span class="n">data_train</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s">&#39;split_train.csv&#39;</span><span class="p">)</span> +<span class="n">data_validate</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s">&#39;split_validate.csv&#39;</span><span class="p">)</span> </pre></div> </div> @@ -4744,7 +9980,7 @@ rkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -4776,12 +10012,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[19]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="kn">from</span> <span class="nn">Quandl</span> <span class="k">import</span> <span class="n">get</span> <span class="k">as</span> <span class="n">qget</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="n">api_key</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> +<span class="n">api_key</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="n">profitability</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">p</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="mi">1000</span><span class="o">*</span><span class="n">p</span> <span class="o">/</span> <span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="n">i</span><span class="o">*</span><span class="n">d</span><span class="p">)</span> @@ -4805,15 +10041,15 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <span class="n">expected_close</span> <span class="o">=</span> <span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">]</span> <span class="o">*</span> <span class="n">expected</span> <span class="n">todays_purchase</span> <span class="o">=</span> <span class="n">daily_investment</span><span class="p">(</span><span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">],</span> <span class="n">expected_close</span><span class="p">,</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">day</span><span class="p">])</span> <span class="n">invested</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">invested</span><span class="p">,</span> <span class="n">todays_purchase</span> <span class="o">+</span> <span class="n">bias</span><span class="p">)</span> - <span class="c1"># expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()</span> + <span class="c"># expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()</span> <span class="n">day</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">profitable</span> <span class="o">=</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span> \ <span class="ow">or</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span> <span class="n">shares</span> <span class="o">=</span> <span class="p">(</span><span class="n">invested</span> <span class="o">/</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> - <span class="c1"># Make sure we can&#39;t see into the future - we know either today&#39;s close or tomorrow&#39;s open</span> - <span class="c1"># will be profitable, but we need to check which one.</span> + <span class="c"># Make sure we can&#39;t see into the future - we know either today&#39;s close or tomorrow&#39;s open</span> + <span class="c"># will be profitable, but we need to check which one.</span> <span class="k">if</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)]):</span> <span class="n">ending_price</span> <span class="o">=</span> <span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> @@ -4826,21 +10062,21 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <span class="n">ticker_info</span> <span class="o">=</span> <span class="n">qget</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start</span><span class="p">,</span> <span class="n">api_key</span><span class="o">=</span><span class="n">api_key</span><span class="p">)</span> <span class="n">evaluation_times</span> <span class="o">=</span> <span class="n">ticker_info</span><span class="p">[:</span><span class="n">end</span><span class="p">]</span><span class="o">.</span><span class="n">index</span> - <span class="c1"># Handle Google vs. YFinance data</span> - <span class="k">if</span> <span class="s2">&quot;Adjusted Close&quot;</span> <span class="ow">in</span> <span class="n">ticker_info</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span> - <span class="n">close_column</span> <span class="o">=</span> <span class="s2">&quot;Adjusted Close&quot;</span> + <span class="c"># Handle Google vs. YFinance data</span> + <span class="k">if</span> <span class="s">&quot;Adjusted Close&quot;</span> <span class="ow">in</span> <span class="n">ticker_info</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span> + <span class="n">close_column</span> <span class="o">=</span> <span class="s">&quot;Adjusted Close&quot;</span> <span class="k">else</span><span class="p">:</span> - <span class="n">close_column</span> <span class="o">=</span> <span class="s2">&quot;Close&quot;</span> + <span class="n">close_column</span> <span class="o">=</span> <span class="s">&quot;Close&quot;</span> - <span class="n">sim</span> <span class="o">=</span> <span class="p">{</span><span class="n">d</span><span class="p">:</span> <span class="n">simulate_day</span><span class="p">(</span><span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="s2">&quot;Open&quot;</span><span class="p">],</span> <span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="n">close_column</span><span class="p">],</span> + <span class="n">sim</span> <span class="o">=</span> <span class="p">{</span><span class="n">d</span><span class="p">:</span> <span class="n">simulate_day</span><span class="p">(</span><span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="s">&quot;Open&quot;</span><span class="p">],</span> <span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="n">close_column</span><span class="p">],</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">evaluation_times</span><span class="p">}</span> <span class="n">sim_series</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">sim</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">()</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;profit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;max&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;days&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;score&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">profitability</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;investments&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;profit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;max&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;days&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;score&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">profitability</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;investments&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">return</span> <span class="n">result</span> @@ -4875,7 +10111,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s2">&quot;YAHOO/FB&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/AAPL&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&quot;YAHOO/FB&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/AAPL&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> </pre></div> </div> @@ -4888,9 +10124,9 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -5362,9 +10598,9 @@ kiSpNScYJEmSJElSa04wSJIkSZKk1pxgkCRJkiRJrf1/uiw9D8O0d6EAAAAASUVORK5CYII= <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -7001,7 +12237,7 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[13]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s2">&quot;YAHOO/X&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/CAT&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&quot;YAHOO/X&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/CAT&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> </pre></div> </div> @@ -7014,9 +12250,9 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[14]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -7502,9 +12738,9 @@ JEmSJEnSwGwwSJIkSZKkgdlgkCRJkiRJA7PBIEmSJEmSBvb/AfKAew4+oiojAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[15]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -9287,7 +14523,7 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[21]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s1">&#39;YAHOO/REGN&#39;</span><span class="p">,</span> <span class="s1">&#39;YAHOO/CELG&#39;</span><span class="p">,</span> <span class="s1">&#39;GOOG/NASDAQ_BIB&#39;</span><span class="p">,</span> <span class="s1">&#39;GOOG/NASDAQ_IBB&#39;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&#39;YAHOO/REGN&#39;</span><span class="p">,</span> <span class="s">&#39;YAHOO/CELG&#39;</span><span class="p">,</span> <span class="s">&#39;GOOG/NASDAQ_BIB&#39;</span><span class="p">,</span> <span class="s">&#39;GOOG/NASDAQ_IBB&#39;</span><span class="p">])</span> </pre></div> </div> @@ -9300,9 +14536,9 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[22]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -9853,9 +15089,9 @@ WKBTQVcCAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[23]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -11617,7 +16853,7 @@ JBKJRCJrRTQiRCKRSCQSiUQikUgkElkr/h9yZ17EmpnoFwAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -11684,7 +16920,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="k">using</span> <span class="n">Quandl</span> +<div class=" highlight hl-julia"><pre><span class="k">using</span> <span class="n">Quandl</span> <span class="n">api_key</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="n">daily_investment</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_open</span><span class="p">,</span> <span class="n">current_close</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> <span class="c"># We&#39;re not going to safeguard against divide by 0 - that&#39;s the user&#39;s responsibility</span> @@ -11714,7 +16950,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">is_profitable</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_price</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">is_profitable</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_price</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> <span class="n">shares</span> <span class="o">=</span> <span class="n">sum</span><span class="p">(</span><span class="n">purchase_history</span> <span class="o">./</span> <span class="n">open_history</span><span class="p">)</span> <span class="k">return</span> <span class="n">current_price</span><span class="o">*</span><span class="n">shares</span> <span class="o">&gt;</span> <span class="n">sum</span><span class="p">(</span><span class="n">purchase_history</span><span class="p">)</span> <span class="k">end</span> @@ -11749,8 +16985,8 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <span class="n">leverages</span> <span class="o">=</span> <span class="p">[</span><span class="n">sum</span><span class="p">(</span><span class="n">investments</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">length</span><span class="p">(</span><span class="n">investments</span><span class="p">)]</span> <span class="n">max_leverage</span> <span class="o">=</span> <span class="n">maximum</span><span class="p">(</span><span class="n">leverages</span><span class="p">)</span> <span class="o">/</span> <span class="n">investments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">println</span><span class="p">(</span><span class="s">&quot;Max leverage: </span><span class="si">$(max_leverage)</span><span class="s">&quot;</span><span class="p">)</span> - <span class="n">println</span><span class="p">(</span><span class="s">&quot;Days invested: </span><span class="si">$(length(investments))</span><span class="s">&quot;</span><span class="p">)</span> - <span class="n">println</span><span class="p">(</span><span class="s">&quot;Profit: </span><span class="si">$profit</span><span class="s">&quot;</span><span class="p">)</span> + <span class="n">println</span><span class="p">(</span><span class="s">&quot;Days invested: </span><span class="si">$</span><span class="s">(length(investments))&quot;</span><span class="p">)</span> + <span class="n">println</span><span class="p">(</span><span class="s">&quot;Profit: </span><span class="si">$</span><span class="s">profit&quot;</span><span class="p">)</span> <span class="k">end</span><span class="p">;</span> </pre></div> @@ -11777,7 +17013,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.01</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.01</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">sim_summary</span><span class="p">(</span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span><span class="p">)</span> </pre></div> @@ -11820,7 +17056,7 @@ Profit: 0.6894803101560001 <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">sim_summary</span><span class="p">(</span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span><span class="p">)</span> </pre></div> @@ -11880,13 +17116,13 @@ Profit: 0.08304813163696423 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pickle</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pickle</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">figure</span><span class="p">,</span> <span class="n">show</span> @@ -12153,7 +17389,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">))</span> <span class="n">forecasts_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">)</span> </pre></div> @@ -12167,24 +17403,24 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cities</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;binghamton&#39;</span><span class="p">,</span> <span class="s1">&#39;cary&#39;</span><span class="p">,</span> <span class="s1">&#39;nyc&#39;</span><span class="p">,</span> <span class="s1">&#39;seattle&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cities</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;binghamton&#39;</span><span class="p">,</span> <span class="s">&#39;cary&#39;</span><span class="p">,</span> <span class="s">&#39;nyc&#39;</span><span class="p">,</span> <span class="s">&#39;seattle&#39;</span><span class="p">]</span> <span class="n">city_colors</span> <span class="o">=</span> <span class="p">{</span><span class="n">cities</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">Palette</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)}</span> <span class="k">def</span> <span class="nf">safe_cover</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;cloudCover&#39;</span><span class="p">]</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;cloudCover&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> - <span class="c1"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> + <span class="c"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span> - <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s1">&#39;ignore&#39;</span><span class="p">)</span> + <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">cloud_cover_vals</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> </pre></div> @@ -12198,23 +17434,23 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> <span class="k">def</span> <span class="nf">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="n">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">month</span><span class="p">)</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="n">months</span> <span class="o">=</span> <span class="p">[</span> - <span class="p">(</span><span class="s1">&#39;July&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;August&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;September&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;October&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;November&#39;</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span> + <span class="p">(</span><span class="s">&#39;July&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;August&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;September&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;October&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;November&#39;</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span> <span class="p">]</span> <span class="k">for</span> <span class="n">month</span><span class="p">,</span> <span class="n">month_id</span> <span class="ow">in</span> <span class="n">months</span><span class="p">:</span> <span class="n">month_averages</span> <span class="o">=</span> <span class="p">{</span><span class="n">city</span><span class="p">:</span> <span class="n">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month_id</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">}</span> - <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> Average Cloud Cover&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> - <span class="n">y_axis_label</span><span class="o">=</span><span class="s1">&#39;Cloud Cover Percentage&#39;</span><span class="p">)</span> + <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&quot;{} Average Cloud Cover&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">y_axis_label</span><span class="o">=</span><span class="s">&#39;Cloud Cover Percentage&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">month_averages</span><span class="p">[</span><span class="n">city</span><span class="p">]],</span> <span class="n">legend</span><span class="o">=</span><span class="n">city</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">city_colors</span><span class="p">[</span><span class="n">city</span><span class="p">])</span> @@ -12403,21 +17639,21 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;precipProbability&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;precipProbability&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_precip</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_vals</span><span class="p">)))</span> - <span class="c1"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> + <span class="c"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span> - <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s1">&#39;ignore&#39;</span><span class="p">)</span> + <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">precip_vals</span><span class="p">),</span> <span class="n">precip_samples</span> <span class="k">def</span> <span class="nf">city_avg_precip</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> @@ -12425,9 +17661,9 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="k">for</span> <span class="n">month</span><span class="p">,</span> <span class="n">month_id</span> <span class="ow">in</span> <span class="n">months</span><span class="p">:</span> <span class="n">month_averages</span> <span class="o">=</span> <span class="p">{</span><span class="n">city</span><span class="p">:</span> <span class="n">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month_id</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">}</span> - <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> Average Precipitation Chance&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> - <span class="n">y_axis_label</span><span class="o">=</span><span class="s1">&#39;Precipitation Chance Percentage&#39;</span><span class="p">)</span> + <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&quot;{} Average Precipitation Chance&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">y_axis_label</span><span class="o">=</span><span class="s">&#39;Precipitation Chance Percentage&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">month_averages</span><span class="p">[</span><span class="n">city</span><span class="p">]],</span> <span class="n">legend</span><span class="o">=</span><span class="n">city</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">city_colors</span><span class="p">[</span><span class="n">city</span><span class="p">])</span> @@ -12616,13 +17852,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">figure</span><span class="p">,</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">show</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">figure</span><span class="p">,</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">show</span> <span class="kn">from</span> <span class="nn">bokeh.palettes</span> <span class="k">import</span> <span class="n">PuBuGn9</span> <span class="k">as</span> <span class="n">Palette</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> @@ -12882,7 +18118,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">))</span> <span class="n">forecast_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">)</span> </pre></div> @@ -12896,31 +18132,31 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cary_forecast</span> <span class="o">=</span> <span class="n">forecast_df</span><span class="p">[</span><span class="s1">&#39;cary&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cary_forecast</span> <span class="o">=</span> <span class="n">forecast_df</span><span class="p">[</span><span class="s">&#39;cary&#39;</span><span class="p">]</span> <span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> <span class="n">months</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">12</span><span class="p">)</span> -<span class="n">months_str</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;July&#39;</span><span class="p">,</span> <span class="s1">&#39;August&#39;</span><span class="p">,</span> <span class="s1">&#39;September&#39;</span><span class="p">,</span> <span class="s1">&#39;October&#39;</span><span class="p">,</span> <span class="s1">&#39;November&#39;</span><span class="p">]</span> +<span class="n">months_str</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;July&#39;</span><span class="p">,</span> <span class="s">&#39;August&#39;</span><span class="p">,</span> <span class="s">&#39;September&#39;</span><span class="p">,</span> <span class="s">&#39;October&#39;</span><span class="p">,</span> <span class="s">&#39;November&#39;</span><span class="p">]</span> <span class="k">def</span> <span class="nf">safe_cover</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;cloudCover&#39;</span><span class="p">]</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;cloudCover&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">cloud_cover_vals</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> <span class="n">monthly_cover_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Average Cloud Cover&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Average Cloud Cover&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_cover_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> @@ -12984,11 +18220,11 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">monthly_cloudy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">monthly_cloudy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> <span class="n">cloudy_days</span> <span class="o">=</span> <span class="p">[</span><span class="n">cover</span> <span class="o">&gt;</span> <span class="o">.</span><span class="mi">5</span> <span class="k">for</span> <span class="n">cover</span> <span class="ow">in</span> <span class="n">cloud_cover_vals</span><span class="p">]</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">cloudy_days</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> @@ -12996,16 +18232,16 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">monthly_days_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_cloudy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> <span class="n">monthly_cover_samples</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_cloudy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Cloudy Days&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Cloudy Days&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_days_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Cloud Cover Samples&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Cloud Cover Samples&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_cover_samples</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> @@ -13100,25 +18336,25 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;precipProbability&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;precipProbability&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_precip</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_vals</span><span class="p">)))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">precip_vals</span><span class="p">),</span> <span class="n">precip_samples</span> <span class="n">monthly_avg_precip_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_avg_precip</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Average Precipitation Chance&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Average Precipitation Chance&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_avg_precip_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> @@ -13181,11 +18417,11 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">monthly_rainy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">monthly_rainy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_prob_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_prob_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_prob_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_prob_vals</span><span class="p">)))</span> <span class="n">precip_days</span> <span class="o">=</span> <span class="p">[</span><span class="n">prob</span> <span class="o">&gt;</span> <span class="o">.</span><span class="mi">25</span> <span class="k">for</span> <span class="n">prob</span> <span class="ow">in</span> <span class="n">precip_prob_vals</span><span class="p">]</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">precip_days</span><span class="p">),</span> <span class="n">precip_prob_samples</span> @@ -13193,16 +18429,16 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">monthly_precip_days_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_rainy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> <span class="n">monthly_precip_samples</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_rainy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Rainy Days&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Rainy Days&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_precip_days_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Rainy Days Samples&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Rainy Days Samples&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_precip_samples</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> @@ -13300,69 +18536,69 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="Generating-the-Forecast-file">Generating the Forecast file<a class="anchor-link" href="#Generating-the-Forecast-file">&#182;</a></h1><p>The following code was generates the file that was used throughout the blog post. Please note that I'm retrieving data for other cities to use in a future blog post, only Cary data was used for this post.</p> -<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> <span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="nb">reduce</span> <span class="kn">import</span> <span class="nn">requests</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span> -<span class="c1"># Coordinate data from http://itouchmap.com/latlong.html</span> +<span class="c"># Coordinate data from http://itouchmap.com/latlong.html</span> <span class="n">cary_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">35.79154</span><span class="p">,</span><span class="o">-</span><span class="mf">78.781117</span><span class="p">)</span> <span class="n">nyc_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">40.78306</span><span class="p">,</span><span class="o">-</span><span class="mf">73.971249</span><span class="p">)</span> <span class="n">seattle_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">47.60621</span><span class="p">,</span><span class="o">-</span><span class="mf">122.332071</span><span class="p">)</span> <span class="n">binghamton_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">42.098687</span><span class="p">,</span><span class="o">-</span><span class="mf">75.917974</span><span class="p">)</span> <span class="n">cities</span> <span class="o">=</span> <span class="p">{</span> - <span class="s1">&#39;cary&#39;</span><span class="p">:</span> <span class="n">cary_loc</span><span class="p">,</span> - <span class="s1">&#39;nyc&#39;</span><span class="p">:</span> <span class="n">nyc_loc</span><span class="p">,</span> - <span class="s1">&#39;seattle&#39;</span><span class="p">:</span> <span class="n">seattle_loc</span><span class="p">,</span> - <span class="s1">&#39;binghamton&#39;</span><span class="p">:</span> <span class="n">binghamton_loc</span> + <span class="s">&#39;cary&#39;</span><span class="p">:</span> <span class="n">cary_loc</span><span class="p">,</span> + <span class="s">&#39;nyc&#39;</span><span class="p">:</span> <span class="n">nyc_loc</span><span class="p">,</span> + <span class="s">&#39;seattle&#39;</span><span class="p">:</span> <span class="n">seattle_loc</span><span class="p">,</span> + <span class="s">&#39;binghamton&#39;</span><span class="p">:</span> <span class="n">binghamton_loc</span> <span class="p">}</span> -<span class="n">apikey</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> <span class="c1"># My super-secret API Key</span> +<span class="n">apikey</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="c"># My super-secret API Key</span> <span class="k">def</span> <span class="nf">get_forecast</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">date</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> - <span class="n">forecast_base</span> <span class="o">=</span> <span class="s2">&quot;https://api.forecast.io/forecast/&quot;</span> + <span class="n">forecast_base</span> <span class="o">=</span> <span class="s">&quot;https://api.forecast.io/forecast/&quot;</span> <span class="k">if</span> <span class="n">date</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s1">&#39;/{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">)</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s">&#39;/{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">epoch</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s1">&#39;/{},{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">epoch</span><span class="p">)</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s">&#39;/{},{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">epoch</span><span class="p">)</span> <span class="k">return</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span><span class="mi">2016</span><span class="p">)</span> -<span class="c1"># For datetimes, the 12 is for getting the weather at noon.</span> -<span class="c1"># We&#39;re doing this over midnight because we&#39;re more concerned</span> -<span class="c1"># with what people see, and people don&#39;t typically see the weather</span> -<span class="c1"># at midnight.</span> +<span class="c"># For datetimes, the 12 is for getting the weather at noon.</span> +<span class="c"># We&#39;re doing this over midnight because we&#39;re more concerned</span> +<span class="c"># with what people see, and people don&#39;t typically see the weather</span> +<span class="c"># at midnight.</span> <span class="n">dt_indices</span> <span class="o">=</span> <span class="p">[</span><span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">12</span><span class="p">))</span> <span class="k">for</span> <span class="n">year</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="n">dt_merge</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">dt_indices</span><span class="p">)</span> -<span class="c1"># Because we have to pay a little bit to use the API, we use for loops here</span> -<span class="c1"># instead of a comprehension - if something breaks, we want to preserve the</span> -<span class="c1"># data already retrieved</span> +<span class="c"># Because we have to pay a little bit to use the API, we use for loops here</span> +<span class="c"># instead of a comprehension - if something breaks, we want to preserve the</span> +<span class="c"># data already retrieved</span> <span class="n">city_forecasts</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">city</span><span class="p">,</span> <span class="n">loc</span> <span class="ow">in</span> <span class="n">cities</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> - <span class="k">print</span><span class="p">(</span><span class="s2">&quot;Retrieving data for {} starting at {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> - <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> + <span class="k">print</span><span class="p">(</span><span class="s">&quot;Retrieving data for {} starting at {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> + <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> <span class="k">for</span> <span class="n">dt</span> <span class="ow">in</span> <span class="n">dt_merge</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">city_forecasts</span><span class="p">[(</span><span class="n">city</span><span class="p">,</span> <span class="n">dt</span><span class="p">)]</span> <span class="o">=</span> <span class="n">get_forecast</span><span class="p">(</span><span class="o">*</span><span class="n">loc</span><span class="p">,</span> <span class="n">dt</span><span class="p">)</span> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="n">city_forecasts</span><span class="p">[(</span><span class="n">city</span><span class="p">,</span> <span class="n">dt</span><span class="p">)]</span> <span class="o">=</span> <span class="bp">None</span> -<span class="k">print</span><span class="p">(</span><span class="s2">&quot;End forecast retrieval: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> +<span class="k">print</span><span class="p">(</span><span class="s">&quot;End forecast retrieval: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> <span class="kn">import</span> <span class="nn">pickle</span> -<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">))</span> +<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;wb&#39;</span><span class="p">))</span> -<span class="c1">### Output:</span> -<span class="c1"># Retrieving data for binghamton starting at 05:13:42 PM</span> -<span class="c1"># Retrieving data for seattle starting at 05:30:51 PM</span> -<span class="c1"># Retrieving data for nyc starting at 05:48:30 PM</span> -<span class="c1"># Retrieving data for cary starting at 06:08:32 PM</span> -<span class="c1"># End forecast retrieval: 06:25:21 PM</span> +<span class="c">### Output:</span> +<span class="c"># Retrieving data for binghamton starting at 05:13:42 PM</span> +<span class="c"># Retrieving data for seattle starting at 05:30:51 PM</span> +<span class="c"># Retrieving data for nyc starting at 05:48:30 PM</span> +<span class="c"># Retrieving data for cary starting at 06:08:32 PM</span> +<span class="c"># End forecast retrieval: 06:25:21 PM</span> </pre></div> </div> @@ -13372,13 +18608,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">requests</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">requests</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">dateutil</span> <span class="k">import</span> <span class="n">parser</span> <span class="k">as</span> <span class="n">dtparser</span> @@ -13413,26 +18649,26 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">ArticleListParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">class</span> <span class="nc">ArticleListParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Given a web page with articles on it, parse out the article links&quot;&quot;&quot;</span> <span class="n">articles</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> - <span class="c1">#if tag == &#39;div&#39; and (&quot;id&quot;, &quot;author_articles_wrapper&quot;) in attrs:</span> - <span class="c1"># self.fetch_links = True</span> - <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;a&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;dashboard_article_link&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> - <span class="n">href</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;href&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> + <span class="c">#if tag == &#39;div&#39; and (&quot;id&quot;, &quot;author_articles_wrapper&quot;) in attrs:</span> + <span class="c"># self.fetch_links = True</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;a&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;class&#39;</span><span class="p">,</span> <span class="s">&#39;dashboard_article_link&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> + <span class="n">href</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;href&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="bp">self</span><span class="o">.</span><span class="n">articles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">href</span><span class="p">)</span> -<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;http://seekingalpha.com/author/wall-street-breakfast/articles&quot;</span> -<span class="n">article_page_urls</span> <span class="o">=</span> <span class="p">[</span><span class="n">base_url</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">)]</span> +<span class="n">base_url</span> <span class="o">=</span> <span class="s">&quot;http://seekingalpha.com/author/wall-street-breakfast/articles&quot;</span> +<span class="n">article_page_urls</span> <span class="o">=</span> <span class="p">[</span><span class="n">base_url</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">base_url</span> <span class="o">+</span> <span class="s">&#39;/{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">)]</span> <span class="n">global_articles</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">page</span> <span class="ow">in</span> <span class="n">article_page_urls</span><span class="p">:</span> - <span class="c1"># We need to switch the user agent, as SA blocks the standard requests agent</span> + <span class="c"># We need to switch the user agent, as SA blocks the standard requests agent</span> <span class="n">articles_html</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> - <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> + <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArticleListParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">articles_html</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="n">global_articles</span> <span class="o">+=</span> <span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">articles</span><span class="p">)</span> @@ -13448,25 +18684,25 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">ArticleReturnParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> - <span class="s2">&quot;Given an article, parse out the futures returns in it&quot;</span> +<div class=" highlight hl-ipython3"><pre><span class="k">class</span> <span class="nc">ArticleReturnParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> + <span class="s">&quot;Given an article, parse out the futures returns in it&quot;</span> - <span class="n">record_font_tags</span> <span class="o">=</span> <span class="kc">False</span> - <span class="n">in_font_tag</span> <span class="o">=</span> <span class="kc">False</span> + <span class="n">record_font_tags</span> <span class="o">=</span> <span class="k">False</span> + <span class="n">in_font_tag</span> <span class="o">=</span> <span class="k">False</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span> - <span class="c1"># data = {} # See __init__</span> + <span class="c"># data = {} # See __init__</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> - <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;span&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;itemprop&#39;</span><span class="p">,</span> <span class="s1">&#39;datePublished&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> - <span class="n">date_string</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;content&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;span&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;itemprop&#39;</span><span class="p">,</span> <span class="s">&#39;datePublished&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> + <span class="n">date_string</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;content&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="n">date</span> <span class="o">=</span> <span class="n">dtparser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">date_string</span><span class="p">)</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span> - <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;font&#39;</span> + <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;font&#39;</span> <span class="k">def</span> <span class="nf">safe_float</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> @@ -13475,43 +18711,43 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span> - <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="s2">&quot;Futures at 6&quot;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="o">=</span> <span class="kc">True</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="s">&quot;Futures at 6&quot;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="o">=</span> <span class="k">True</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;DOW&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;DOW&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;S&amp;P&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;S&amp;P&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;NASDAQ&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;NASDAQ&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;Crude&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;Crude&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;Gold&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;Gold&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">handle_endtag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> - <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="kc">False</span> + <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="k">False</span> <span class="k">def</span> <span class="nf">retrieve_data</span><span class="p">(</span><span class="n">url</span><span class="p">):</span> - <span class="n">sa</span> <span class="o">=</span> <span class="s2">&quot;http://seekingalpha.com&quot;</span> + <span class="n">sa</span> <span class="o">=</span> <span class="s">&quot;http://seekingalpha.com&quot;</span> <span class="n">article_html</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sa</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span> - <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> + <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArticleReturnParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> - <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">url</span><span class="p">})</span> - <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">})</span> + <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&quot;url&quot;</span><span class="p">:</span> <span class="n">url</span><span class="p">})</span> + <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&quot;text&quot;</span><span class="p">:</span> <span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">})</span> <span class="k">return</span> <span class="n">parser</span><span class="o">.</span><span class="n">data</span> -<span class="c1"># This copy **MUST** be in place. I&#39;m not sure why,</span> -<span class="c1"># as you&#39;d think that the data being returned would already</span> -<span class="c1"># represent a different memory location. Even so, it blows up</span> -<span class="c1"># if you don&#39;t do this.</span> +<span class="c"># This copy **MUST** be in place. I&#39;m not sure why,</span> +<span class="c"># as you&#39;d think that the data being returned would already</span> +<span class="c"># represent a different memory location. Even so, it blows up</span> +<span class="c"># if you don&#39;t do this.</span> <span class="n">article_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">global_articles</span><span class="p">))</span> <span class="n">article_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="p">(</span><span class="n">retrieve_data</span><span class="p">(</span><span class="n">url</span><span class="p">))</span> <span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">article_list</span><span class="p">]</span> -<span class="c1"># If there&#39;s an issue downloading the article, drop it.</span> +<span class="c"># If there&#39;s an issue downloading the article, drop it.</span> <span class="n">article_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">article_data</span><span class="p">)</span><span class="o">.</span><span class="n">dropna</span><span class="p">()</span> </pre></div> @@ -13535,12 +18771,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># article_df is sorted by date, so we get the first row.</span> -<span class="n">start_date</span> <span class="o">=</span> <span class="n">article_df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="s1">&#39;date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;date&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> -<span class="n">SPY</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/NYSE_SPY&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">DJIA</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/AMS_DIA&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">RUSS</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/AMEX_IWM&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">NASDAQ</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/EPA_QQQ&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># article_df is sorted by date, so we get the first row.</span> +<span class="n">start_date</span> <span class="o">=</span> <span class="n">article_df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="s">&#39;date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;date&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> +<span class="n">SPY</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/NYSE_SPY&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">DJIA</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/AMS_DIA&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">RUSS</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/AMEX_IWM&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">NASDAQ</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/EPA_QQQ&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> </pre></div> </div> @@ -13564,14 +18800,14 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">calculate_opening_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="c1"># I&#39;m not a huge fan of the appending for loop,</span> - <span class="c1"># but it&#39;s a bit verbose for a comprehension</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">calculate_opening_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="c"># I&#39;m not a huge fan of the appending for loop,</span> + <span class="c"># but it&#39;s a bit verbose for a comprehension</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="p">)):</span> <span class="n">date</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> - <span class="n">prior_close</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;Close&#39;</span><span class="p">]</span> - <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Open&#39;</span><span class="p">]</span> + <span class="n">prior_close</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> + <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Open&#39;</span><span class="p">]</span> <span class="n">data</span><span class="p">[</span><span class="n">date</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">open_val</span> <span class="o">-</span> <span class="n">prior_close</span><span class="p">)</span> <span class="o">/</span> <span class="n">prior_close</span> <span class="k">return</span> <span class="n">data</span> @@ -13582,8 +18818,8 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">NASDAQ_open_ret</span> <span class="o">=</span> <span class="n">calculate_opening_ret</span><span class="p">(</span><span class="n">NASDAQ</span><span class="p">)</span> <span class="k">def</span> <span class="nf">signs_match</span><span class="p">(</span><span class="n">list_1</span><span class="p">,</span> <span class="n">list_2</span><span class="p">):</span> - <span class="c1"># This is a surprisingly difficult task - we have to match</span> - <span class="c1"># up the dates in order to check if opening returns actually match</span> + <span class="c"># This is a surprisingly difficult task - we have to match</span> + <span class="c"># up the dates in order to check if opening returns actually match</span> <span class="n">index_dict_dt</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">():</span> <span class="n">list_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">list_2</span><span class="o">.</span><span class="n">keys</span><span class="p">()}</span> <span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span> @@ -13599,26 +18835,26 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> - <span class="c1">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> + <span class="c">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> <span class="k">return</span> <span class="n">matches</span> <span class="n">prediction_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">matches_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">count_dict</span> <span class="o">=</span> <span class="p">{}</span> -<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_open_ret</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_open_ret</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_open_ret</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_open_ret</span><span class="p">}</span> -<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;SPY&quot;</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">]</span> -<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Crude&quot;</span><span class="p">,</span> <span class="s2">&quot;Gold&quot;</span><span class="p">,</span> <span class="s2">&quot;DOW&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s2">&quot;S&amp;P&quot;</span><span class="p">]</span> +<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_open_ret</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_open_ret</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_open_ret</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_open_ret</span><span class="p">}</span> +<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SPY&quot;</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">]</span> +<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Crude&quot;</span><span class="p">,</span> <span class="s">&quot;Gold&quot;</span><span class="p">,</span> <span class="s">&quot;DOW&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s">&quot;S&amp;P&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">indices</span><span class="p">:</span> - <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s1">&#39;date&#39;</span><span class="p">]],</span> + <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s">&#39;date&#39;</span><span class="p">]],</span> <span class="n">index_dict</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">count_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">prediction_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Articles Checked: &quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Articles Checked: &quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">count_dict</span><span class="p">))</span> <span class="nb">print</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">prediction_dict</span><span class="p">))</span> </pre></div> @@ -13677,14 +18913,14 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">calculate_closing_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="c1"># I&#39;m not a huge fan of the appending for loop,</span> - <span class="c1"># but it&#39;s a bit verbose for a comprehension</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">calculate_closing_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="c"># I&#39;m not a huge fan of the appending for loop,</span> + <span class="c"># but it&#39;s a bit verbose for a comprehension</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="p">)):</span> <span class="n">date</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> - <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Open&#39;</span><span class="p">]</span> - <span class="n">close_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Close&#39;</span><span class="p">]</span> + <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Open&#39;</span><span class="p">]</span> + <span class="n">close_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> <span class="n">data</span><span class="p">[</span><span class="n">date</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">close_val</span> <span class="o">-</span> <span class="n">open_val</span><span class="p">)</span> <span class="o">/</span> <span class="n">open_val</span> <span class="k">return</span> <span class="n">data</span> @@ -13695,8 +18931,8 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <span class="n">NASDAQ_close_ret</span> <span class="o">=</span> <span class="n">calculate_closing_ret</span><span class="p">(</span><span class="n">NASDAQ</span><span class="p">)</span> <span class="k">def</span> <span class="nf">signs_match</span><span class="p">(</span><span class="n">list_1</span><span class="p">,</span> <span class="n">list_2</span><span class="p">):</span> - <span class="c1"># This is a surprisingly difficult task - we have to match</span> - <span class="c1"># up the dates in order to check if opening returns actually match</span> + <span class="c"># This is a surprisingly difficult task - we have to match</span> + <span class="c"># up the dates in order to check if opening returns actually match</span> <span class="n">index_dict_dt</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">():</span> <span class="n">list_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">list_2</span><span class="o">.</span><span class="n">keys</span><span class="p">()}</span> <span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span> @@ -13712,28 +18948,28 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> - <span class="c1">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> + <span class="c">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> <span class="k">return</span> <span class="n">matches</span> <span class="n">matches_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">count_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">prediction_dict</span> <span class="o">=</span> <span class="p">{}</span> -<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_close_ret</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_close_ret</span><span class="p">,</span> - <span class="s2">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_close_ret</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_close_ret</span><span class="p">}</span> -<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;SPY&quot;</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">]</span> -<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Crude&quot;</span><span class="p">,</span> <span class="s2">&quot;Gold&quot;</span><span class="p">,</span> <span class="s2">&quot;DOW&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s2">&quot;S&amp;P&quot;</span><span class="p">]</span> +<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_close_ret</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_close_ret</span><span class="p">,</span> + <span class="s">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_close_ret</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_close_ret</span><span class="p">}</span> +<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SPY&quot;</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">]</span> +<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Crude&quot;</span><span class="p">,</span> <span class="s">&quot;Gold&quot;</span><span class="p">,</span> <span class="s">&quot;DOW&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s">&quot;S&amp;P&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">indices</span><span class="p">:</span> - <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s1">&#39;date&#39;</span><span class="p">]],</span> + <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s">&#39;date&#39;</span><span class="p">]],</span> <span class="n">index_dict</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">count_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">prediction_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Articles Checked:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Articles Checked:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">count_dict</span><span class="p">))</span> <span class="nb">print</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">prediction_dict</span><span class="p">))</span> </pre></div> @@ -13795,7 +19031,7 @@ S&amp;P 0.585821 0.608209 0.535055 0.535055 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. Because these are all very similar, we decided to demonstrate all 3 products at once.</p> <p>What follows below is a notebook demonstrating the usage of <a href="http://julialang.com">Julia</a> for Monte-Carlo simulation of some exotic products.</p> <p> @@ -13804,7 +19040,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="k">using</span> <span class="n">Gadfly</span> +<div class=" highlight hl-julia"><pre><span class="k">using</span> <span class="n">Gadfly</span> </pre></div> </div> @@ -13840,10 +19076,10 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">S0</span> <span class="o">=</span> <span class="mf">102.2</span> +<div class=" highlight hl-julia"><pre><span class="n">S0</span> <span class="o">=</span> <span class="mf">102.2</span> <span class="n">nominal</span> <span class="o">=</span> <span class="mi">100</span> <span class="n">q</span> <span class="o">=</span> <span class="mf">2.84</span> <span class="o">/</span> <span class="mi">100</span> -<span class="n">σ</span> <span class="o">=</span> <span class="mf">15.37</span> <span class="o">/</span> <span class="mi">100</span> +<span class="err">σ</span> <span class="o">=</span> <span class="mf">15.37</span> <span class="o">/</span> <span class="mi">100</span> <span class="n">term</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">.</span><span class="mi">49</span><span class="p">,</span> <span class="o">.</span><span class="mi">9</span><span class="p">,</span> <span class="mf">1.21</span><span class="p">,</span> <span class="mf">1.45</span><span class="p">,</span> <span class="mf">1.69</span><span class="p">]</span> <span class="o">/</span> <span class="mi">100</span> <span class="o">+</span> <span class="mi">1</span> <span class="c">###</span> @@ -13896,7 +19132,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">simulate_gbm</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">simulate_gbm</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="c"># Set the initial state</span> <span class="n">m</span> <span class="o">=</span> <span class="n">length</span><span class="p">(</span><span class="n">S0</span><span class="p">)</span> <span class="n">t</span> <span class="o">=</span> <span class="n">T</span> <span class="o">/</span> <span class="n">n</span> @@ -13905,7 +19141,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <span class="c"># Build out all states</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> - <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">((</span><span class="n">μ</span> <span class="o">-</span> <span class="n">σ</span><span class="o">^</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">t</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">*</span> <span class="n">σ</span> <span class="o">.*</span> <span class="n">randn</span><span class="p">(</span><span class="n">m</span><span class="p">))</span> + <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">((</span><span class="err">μ</span> <span class="o">-</span> <span class="err">σ</span><span class="o">^</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">t</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">*</span> <span class="err">σ</span> <span class="o">.*</span> <span class="n">randn</span><span class="p">(</span><span class="n">m</span><span class="p">))</span> <span class="k">end</span> <span class="k">return</span> <span class="n">motion</span> @@ -13967,9 +19203,9 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">initial</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">initial</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="c"># Using μ=0, T=.25 for now, we&#39;ll use the proper values later</span> -<span class="n">motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">initial</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span> +<span class="n">motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">initial</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span> <span class="n">display_motion</span><span class="p">(</span><span class="n">motion</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">)</span> </pre></div> @@ -15575,7 +20811,7 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">forward_term</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">yearly_term</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">forward_term</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">yearly_term</span><span class="p">)</span> <span class="c"># It is assumed that we have a yearly term structure passed in, and starts at year 0</span> <span class="c"># This implies a nominal rate above 0 for the first year!</span> <span class="n">years</span> <span class="o">=</span> <span class="n">length</span><span class="p">(</span><span class="n">term</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="c"># because we start at 0</span> @@ -15605,14 +20841,14 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="c"># Example term structure taken from:</span> +<div class=" highlight hl-julia"><pre><span class="c"># Example term structure taken from:</span> <span class="c"># http://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yield</span> <span class="c"># Linear interpolation used years in-between periods, assuming real-dollar</span> <span class="c"># interest rates</span> <span class="n">forward_yield</span> <span class="o">=</span> <span class="n">forward_term</span><span class="p">(</span><span class="n">term</span><span class="p">)</span> <span class="n">calculated_term2</span> <span class="o">=</span> <span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">forward_yield</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Actual term[2]: </span><span class="si">$(term[2])</span><span class="s">; Calculated term[2]: </span><span class="si">$(calculated_term2)</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Actual term[2]: </span><span class="si">$</span><span class="s">(term[2]); Calculated term[2]: </span><span class="si">$(calculated_term2)</span><span class="s">&quot;</span><span class="p">)</span> </pre></div> </div> @@ -15649,11 +20885,11 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">full_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">full_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="n">full_term</span> <span class="o">=</span> <span class="n">vcat</span><span class="p">(</span><span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">forward_yield</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">T</span> - <span class="n">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">full_term</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> - <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">full_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="err">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">full_term</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> + <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">full_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">full_motion</span> <span class="o">=</span> <span class="n">hcat</span><span class="p">(</span><span class="n">full_motion</span><span class="p">,</span> <span class="n">year_motion</span><span class="p">)</span> <span class="k">end</span> @@ -17210,14 +22446,14 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">full_simulation</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">full_simulation</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> <span class="n">forward</span> <span class="o">=</span> <span class="n">vcat</span><span class="p">(</span><span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">forward_term</span><span class="p">(</span><span class="n">term</span><span class="p">))</span> <span class="c"># And an S0 to kick things off.</span> <span class="n">final_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">T</span> - <span class="n">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">forward</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> - <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">final_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="err">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">forward</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> + <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">final_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">final_motion</span> <span class="o">=</span> <span class="n">hcat</span><span class="p">(</span><span class="n">final_motion</span><span class="p">,</span> <span class="n">year_motion</span><span class="p">)</span> <span class="k">end</span> <span class="k">return</span> <span class="n">final_motion</span> @@ -17226,7 +22462,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="n">tic</span><span class="p">()</span> <span class="n">full_simulation</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Time to run simulation: </span><span class="si">%.2f</span><span class="s">s&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Time to run simulation: %.2fs&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> </pre></div> </div> @@ -17271,7 +22507,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">strike</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">07</span> @@ -17285,7 +22521,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">t</span> <span class="n">price</span> <span class="o">=</span> <span class="n">year_prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> - <span class="k">if</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">call_barrier</span> + <span class="k">if</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">call_barrier</span> <span class="k">return</span> <span class="p">(</span><span class="n">nominal</span> <span class="o">+</span> <span class="n">coupon</span><span class="o">*</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">exp</span><span class="p">((</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="k">end</span><span class="p">])</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">t</span><span class="o">-</span><span class="n">i</span><span class="p">))</span> <span class="k">end</span> <span class="k">end</span> @@ -17315,13 +22551,13 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">athena</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="p">(</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Athena note: \$</span><span class="si">%.2f</span><span class="s">, notional: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">,</span> <span class="n">nominal</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Athena note: \</span><span class="si">$</span><span class="s">%.2f, notional: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">,</span> <span class="n">nominal</span><span class="p">)</span> </pre></div> </div> @@ -17382,7 +22618,7 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">coupon_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">8</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">06</span> @@ -17395,9 +22631,9 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">t</span> <span class="n">price</span> <span class="o">=</span> <span class="n">year_prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> - <span class="k">if</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">call_barrier</span> + <span class="k">if</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">call_barrier</span> <span class="k">return</span> <span class="p">(</span><span class="n">nominal</span> <span class="o">+</span> <span class="n">coupon</span> <span class="o">+</span> <span class="n">total_coupons</span><span class="p">)</span><span class="o">*</span><span class="n">exp</span><span class="p">((</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="k">end</span><span class="p">])</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">t</span><span class="o">-</span><span class="n">i</span><span class="p">))</span> - <span class="k">elseif</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">coupon_barrier</span> + <span class="k">elseif</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">coupon_barrier</span> <span class="n">total_coupons</span> <span class="o">=</span> <span class="n">total_coupons</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">coupon</span> <span class="k">else</span> <span class="n">total_coupons</span> <span class="o">*=</span> <span class="n">exp</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> @@ -17429,13 +22665,13 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">phoenix_no_memory</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix without memory note: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix without memory note: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> </pre></div> </div> @@ -17482,7 +22718,7 @@ Present value of Phoenix without memory note: $97.44</pre> <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">coupon_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">8</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">07</span> @@ -17536,14 +22772,14 @@ Present value of Phoenix without memory note: $97.44</pre> <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">phoenix_with_memory</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix with memory note: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix with memory note: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> </pre></div> </div> @@ -17574,7 +22810,7 @@ Present value of Phoenix with memory note: $100.09</pre> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University studying Financial Engineering, and want to give an overview of the projects I'm working on!</p> <p>To start things off, Columbia has been hosting a trading competition that @@ -17645,16 +22881,16 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">display</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">display</span> <span class="kn">import</span> <span class="nn">Quandl</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> -<span class="n">tickers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;XOM&#39;</span><span class="p">,</span> <span class="s1">&#39;CVX&#39;</span><span class="p">,</span> <span class="s1">&#39;CLB&#39;</span><span class="p">,</span> <span class="s1">&#39;OXY&#39;</span><span class="p">,</span> <span class="s1">&#39;SLB&#39;</span><span class="p">]</span> -<span class="n">market_ticker</span> <span class="o">=</span> <span class="s1">&#39;GOOG/NYSE_VOO&#39;</span> +<span class="n">tickers</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;XOM&#39;</span><span class="p">,</span> <span class="s">&#39;CVX&#39;</span><span class="p">,</span> <span class="s">&#39;CLB&#39;</span><span class="p">,</span> <span class="s">&#39;OXY&#39;</span><span class="p">,</span> <span class="s">&#39;SLB&#39;</span><span class="p">]</span> +<span class="n">market_ticker</span> <span class="o">=</span> <span class="s">&#39;GOOG/NYSE_VOO&#39;</span> <span class="n">lookback</span> <span class="o">=</span> <span class="mi">30</span> -<span class="n">d_col</span> <span class="o">=</span> <span class="s1">&#39;Close&#39;</span> +<span class="n">d_col</span> <span class="o">=</span> <span class="s">&#39;Close&#39;</span> -<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;YAHOO/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tick</span><span class="p">))[</span><span class="o">-</span><span class="n">lookback</span><span class="p">:]</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> +<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tick</span><span class="p">))[</span><span class="o">-</span><span class="n">lookback</span><span class="p">:]</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">market</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">market_ticker</span><span class="p">)</span> </pre></div> @@ -17678,7 +22914,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">returns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="n">tick</span><span class="p">][</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> +<div class=" highlight hl-ipython3"><pre><span class="n">returns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="n">tick</span><span class="p">][</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">display</span><span class="p">({</span><span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">})</span> </pre></div> @@ -17724,7 +22960,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">market_returns</span> <span class="o">=</span> <span class="n">market</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">market_returns</span> <span class="o">=</span> <span class="n">market</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="n">sharpe</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="p">(</span><span class="n">ret</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="o">-</span> <span class="n">market_returns</span><span class="p">[</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">())</span> <span class="o">/</span> <span class="n">ret</span><span class="o">.</span><span class="n">std</span><span class="p">()</span> <span class="n">sharpes</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">sharpe</span><span class="p">(</span><span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">])</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> @@ -17772,7 +23008,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">drawdown</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="n">ret</span><span class="o">.</span><span class="n">abs</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">drawdown</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="n">ret</span><span class="o">.</span><span class="n">abs</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="n">drawdowns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">drawdown</span><span class="p">(</span><span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">])</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">display</span><span class="p">(</span><span class="n">drawdowns</span><span class="p">)</span> @@ -17825,25 +23061,25 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">scipy.optimize</span> <span class="k">import</span> <span class="n">minimize</span> -<span class="c1">#sharpe_limit = .1</span> +<span class="c">#sharpe_limit = .1</span> <span class="n">drawdown_limit</span> <span class="o">=</span> <span class="o">.</span><span class="mi">05</span> <span class="n">leverage</span> <span class="o">=</span> <span class="mi">250</span> -<span class="c1"># Use the map so we can guarantee we maintain the correct order</span> -<span class="c1"># sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound</span> +<span class="c"># Use the map so we can guarantee we maintain the correct order</span> +<span class="c"># sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound</span> <span class="n">dd_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">drawdowns</span><span class="p">[</span><span class="n">tick</span><span class="p">],</span> <span class="n">tickers</span><span class="p">)))</span> -<span class="n">returns_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">tickers</span><span class="p">)))</span> <span class="c1"># Because minimizing</span> +<span class="n">returns_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">tickers</span><span class="p">)))</span> <span class="c"># Because minimizing</span> <span class="n">meets_sharpe</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">sharpe_a</span><span class="p">)</span> <span class="o">-</span> <span class="n">sharpe_limit</span> <span class="k">def</span> <span class="nf">meets_dd</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="n">portfolio</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">if</span> <span class="n">portfolio</span> <span class="o">&lt;</span> <span class="o">.</span><span class="mi">1</span><span class="p">:</span> - <span class="c1"># If there are no stocks in the portfolio,</span> - <span class="c1"># we can accidentally induce division by 0,</span> - <span class="c1"># or division by something small enough to cause infinity</span> + <span class="c"># If there are no stocks in the portfolio,</span> + <span class="c"># we can accidentally induce division by 0,</span> + <span class="c"># or division by something small enough to cause infinity</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">return</span> <span class="n">drawdown_limit</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">dd_a</span><span class="p">)</span> <span class="o">/</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> @@ -17853,41 +23089,41 @@ s.t.\ \ & \vec{1} \omega = 1\\ <span class="k">def</span> <span class="nf">within_leverage</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">leverage</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> -<span class="n">objective</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">returns_a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># Because we&#39;re minimizing</span> -<span class="n">bounds</span> <span class="o">=</span> <span class="p">((</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">),)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">)</span> +<span class="n">objective</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">returns_a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span> <span class="c"># Because we&#39;re minimizing</span> +<span class="n">bounds</span> <span class="o">=</span> <span class="p">((</span><span class="k">None</span><span class="p">,</span> <span class="k">None</span><span class="p">),)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">)</span> <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">))</span> <span class="n">constraints</span> <span class="o">=</span> <span class="p">[</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;eq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">is_portfolio</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;eq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">is_portfolio</span> <span class="p">},</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;ineq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">within_leverage</span> - <span class="c1">#}, {</span> - <span class="c1"># &#39;type&#39;: &#39;ineq&#39;,</span> - <span class="c1"># &#39;fun&#39;: meets_sharpe</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;ineq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">within_leverage</span> + <span class="c">#}, {</span> + <span class="c"># &#39;type&#39;: &#39;ineq&#39;,</span> + <span class="c"># &#39;fun&#39;: meets_sharpe</span> <span class="p">},</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;ineq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">meets_dd</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;ineq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">meets_dd</span> <span class="p">}</span> <span class="p">]</span> <span class="n">optimal</span> <span class="o">=</span> <span class="n">minimize</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="n">bounds</span><span class="p">,</span> <span class="n">constraints</span><span class="o">=</span><span class="n">constraints</span><span class="p">,</span> - <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;maxiter&#39;</span><span class="p">:</span> <span class="mi">500</span><span class="p">})</span> + <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;maxiter&#39;</span><span class="p">:</span> <span class="mi">500</span><span class="p">})</span> -<span class="c1"># Optimization time!</span> +<span class="c"># Optimization time!</span> <span class="n">display</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">message</span><span class="p">)</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Holdings: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">tickers</span><span class="p">,</span> <span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))))</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Holdings: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">tickers</span><span class="p">,</span> <span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))))</span> -<span class="n">expected_return</span> <span class="o">=</span> <span class="n">optimal</span><span class="o">.</span><span class="n">fun</span> <span class="o">*</span> <span class="o">-</span><span class="mi">100</span> <span class="c1"># multiply by -100 to scale, and compensate for minimizing</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Expected Return: </span><span class="si">{:.3f}</span><span class="s2">%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_return</span><span class="p">))</span> +<span class="n">expected_return</span> <span class="o">=</span> <span class="n">optimal</span><span class="o">.</span><span class="n">fun</span> <span class="o">*</span> <span class="o">-</span><span class="mi">100</span> <span class="c"># multiply by -100 to scale, and compensate for minimizing</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Expected Return: {:.3f}%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_return</span><span class="p">))</span> <span class="n">expected_drawdown</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">dd_a</span><span class="p">)</span> <span class="o">/</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Expected Max Drawdown: </span><span class="si">{0:.2f}</span><span class="s2">%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_drawdown</span><span class="p">))</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Expected Max Drawdown: {0:.2f}%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_drawdown</span><span class="p">))</span> -<span class="c1"># TODO: Calculate expected Sharpe</span> +<span class="c"># TODO: Calculate expected Sharpe</span> </pre></div> </div> diff --git a/feeds/blog.atom.xml b/feeds/blog.atom.xml index 78a12ab..b233e8a 100644 --- a/feeds/blog.atom.xml +++ b/feeds/blog.atom.xml @@ -1,5 +1,5241 @@ -Bradlee Speicehttps://bspeice.github.io/2016-05-15T00:00:00-04:00The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> +Bradlee Speicehttps://bspeice.github.io/2016-06-08T00:00:00-04:00Event Studies and Earnings Releases2016-06-08T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-06-08:event-studies-and-earnings-releases.html<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/3.0.0/jquery.min.js"></script> + +<p> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Or, being suspicious of market insiders.</p> +<hr> +<p>Use the button below to show the code I've used to generate this article. Because there is a significant amount more code involved than most other posts I've written, it's hidden by default to allow people to concentrate on the important bits.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[1]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">HTML</span> + +<span class="n">HTML</span><span class="p">(</span><span class="s">&#39;&#39;&#39;&lt;script&gt;</span> +<span class="s">code_show=true; </span> +<span class="s">function code_toggle() {</span> +<span class="s"> if (code_show){</span> +<span class="s"> $(&#39;div.input&#39;).hide();</span> +<span class="s"> } else {</span> +<span class="s"> $(&#39;div.input&#39;).show();</span> +<span class="s"> }</span> +<span class="s"> code_show = !code_show</span> +<span class="s">} </span> +<span class="s">$( document ).ready(code_toggle);</span> +<span class="s">&lt;/script&gt;</span> +<span class="s">&lt;form action=&quot;javascript:code_toggle()&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;Click here to toggle on/off the raw code.&quot;&gt;&lt;/form&gt;&#39;&#39;&#39;</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt output_prompt">Out[1]:</div> + +<div class="output_html rendered_html output_subarea output_execute_result"> +<script> +code_show=true; +function code_toggle() { + if (code_show){ + $('div.input').hide(); + } else { + $('div.input').show(); + } + code_show = !code_show +} +$( document ).ready(code_toggle); +</script> +<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="The-Market-Just-Knew">The Market Just Knew<a class="anchor-link" href="#The-Market-Just-Knew">&#182;</a></h1><p>I recently saw two examples of stock charts that have kept me thinking for a while. And now that the semester is complete, I finally have enough time to really look at them and give them the treatment they deserve. The first is good old Apple:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[2]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">secrets</span> <span class="k">import</span> <span class="n">QUANDL_KEY</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="kn">from</span> <span class="nn">matplotlib.dates</span> <span class="k">import</span> <span class="n">date2num</span> +<span class="kn">from</span> <span class="nn">matplotlib.finance</span> <span class="k">import</span> <span class="n">candlestick_ohlc</span> +<span class="kn">from</span> <span class="nn">matplotlib.dates</span> <span class="k">import</span> <span class="n">DateFormatter</span><span class="p">,</span> <span class="n">WeekdayLocator</span><span class="p">,</span>\ + <span class="n">DayLocator</span><span class="p">,</span> <span class="n">MONDAY</span> +<span class="kn">import</span> <span class="nn">quandl</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="o">%</span><span class="k">matplotlib</span> inline + +<span class="k">def</span> <span class="nf">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span> + <span class="c"># Quandl is currently giving me issues with returning</span> + <span class="c"># the entire dataset and not slicing server-side.</span> + <span class="c"># So instead, we&#39;ll do it client-side!</span> + <span class="n">q_format</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-%d&#39;</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/&#39;</span> <span class="o">+</span> <span class="n">ticker</span><span class="p">,</span> + <span class="n">start_date</span><span class="o">=</span><span class="n">start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">end_date</span><span class="o">=</span><span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">authtoken</span><span class="o">=</span><span class="n">QUANDL_KEY</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ticker_data</span> + +<span class="k">def</span> <span class="nf">ohlc_dataframe</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="k">None</span><span class="p">):</span> + <span class="c"># Much of this code re-used from:</span> + <span class="c"># http://matplotlib.org/examples/pylab_examples/finance_demo.html</span> + <span class="k">if</span> <span class="n">ax</span> <span class="ow">is</span> <span class="k">None</span><span class="p">:</span> + <span class="n">f</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span> + + <span class="n">vals</span> <span class="o">=</span> <span class="p">[(</span><span class="n">date2num</span><span class="p">(</span><span class="n">date</span><span class="p">),</span> <span class="o">*</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">date</span><span class="p">]))</span> + <span class="k">for</span> <span class="n">date</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">index</span><span class="p">]</span> + <span class="n">candlestick_ohlc</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">vals</span><span class="p">)</span> + + <span class="n">mondays</span> <span class="o">=</span> <span class="n">WeekdayLocator</span><span class="p">(</span><span class="n">MONDAY</span><span class="p">)</span> + <span class="n">alldays</span> <span class="o">=</span> <span class="n">DayLocator</span><span class="p">()</span> + <span class="n">weekFormatter</span> <span class="o">=</span> <span class="n">DateFormatter</span><span class="p">(</span><span class="s">&#39;%b %d&#39;</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_major_locator</span><span class="p">(</span><span class="n">mondays</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_minor_locator</span><span class="p">(</span><span class="n">alldays</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">xaxis</span><span class="o">.</span><span class="n">set_major_formatter</span><span class="p">(</span><span class="n">weekFormatter</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ax</span> + +<span class="n">AAPL</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="s">&#39;AAPL&#39;</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> +<span class="n">ax</span> <span class="o">=</span> <span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">,</span> + <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&quot;Apple Price 3/1/2016 - 5/1/2016&quot;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +rgAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>The second chart is from Facebook:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[3]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">FB</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="s">&#39;FB&#39;</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span> +<span class="n">ax</span> <span class="o">=</span> <span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Facebook Price 3/5/2016 - 5/5/2016&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +g+z11183M7Ott97aHn/8cTMzW7NmjT333HMp12HOnDn2pS99yczMPvnkE7vqqqts0003tXfffdfM +zFatWmVjx461++67z8zMFixYYGPHjrX33nvPzMzq6uqsqanJzMzuuOMO22GHHWzp0qXW2dlpF198 +sR1wwAFdy7r55putra3NOjs77corr7Ta2lpbv369mZntv//+dtNNN5mZWUdHhz399NNZLT9Zqe9P +rjR1221mzy5WGCkR13vFSPl59dfxxx/PmDFjGD16NGPGjKGpqQmA7bffnsMOO4whQ4YwduxYZsyY +0aM2ed5557HNNtuw6aabdiurqalh1KhRHHPMMTz//PNpl51u3D/84Q+ceeaZ7Ljjjmy22WY0NDR0 +O7IYOnQoL730EuvWraO6upovfOELaZfx5JNPMmbMGDbffHN+8IMfcNNNN7HFFsFNOm+66SaOPvpo +pkyZAsBhhx3GXnvtxb333ttjPtdccw0XXnghkydPZtCgQVxwwQU8//zzrFy5EoBp06YxatQoBg0a +xIwZM1i/fj1Lly7tive1117jH//4B8OGDWOfffbp8/Kdy4syvHK5LBN78Hua+6u/5s2bx+rVq2lr +a2P16tWcddZZALzzzjtMnTqVcePGMWrUKE499VTee++9btOOG9fz2d41NTVd74cNG0Z7e3vaZacb +9+233+7WbBN9D3D77bdzzz33MGHCBA455BCeeir97fL3339/Vq9ezZo1azj22GO72tsB3nzzTW69 +9VbGjBnT9eP2+OOP09LS0mM+b775Juedd17XuGPHjkUSq1atAqCxsZGdd96Z0aNHM3r0aNauXdu1 +vZqamli6dCk77rgj++67b9cJ3HTL//vf/552fZyrNH7ytB8sza/CRRddxKBBg3jppZeorq5m3rx5 +/Ou//mu3cZTLoUIvtt56a956662uzytWrOi2rC9+8YvccccddHZ28qtf/YqTTz65W3t3KsOGDePq +q69mu+2246yzzmL33Xdn/PjxnH766VxzzTUZYxo/fjw/+tGPmDp1ao9hixYt4vLLL+eRRx5h5513 +BmDMmDFd23b77bdn7tzgiYu33347J510EqtXr+7T8p2rVGVZYy9V69atY/jw4YwYMYJVq1Zx+eWX +D9iyTz75ZGbPns2rr77KBx98wE9/+tOuYRs2bGDu3LmsXbuWwYMHM2LEiKx75IwePZpvfetbzJoV +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>These two charts demonstrate two very specific phonomena: how the market prepares for earnings releases. Let's look at those charts again, but with some extra information. As we're about the see, the market "knew" in advance that Apple was going to perform poorly. The market expected that Facebook was going to perform poorly, and instead shot the lights out. Let's see that trend in action:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[4]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">plot_hilo</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> + <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="n">date2num</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">date2num</span><span class="p">(</span><span class="n">end</span><span class="p">)],</span> + <span class="p">[</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">start</span><span class="p">][</span><span class="s">&#39;High&#39;</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">end</span><span class="p">][</span><span class="s">&#39;High&#39;</span><span class="p">]],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">)</span> + <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="n">date2num</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">date2num</span><span class="p">(</span><span class="n">end</span><span class="p">)],</span> + <span class="p">[</span><span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">start</span><span class="p">][</span><span class="s">&#39;Low&#39;</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">end</span><span class="p">][</span><span class="s">&#39;Low&#39;</span><span class="p">]],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">)</span> + +<span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + +<span class="n">ax_aapl</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> +<span class="n">ax_fb</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> + +<span class="c"># Plot the AAPL trend up and down</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax_aapl</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_aapl</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">15</span><span class="p">),</span> <span class="n">AAPL</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_aapl</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">),</span> <span class="n">AAPL</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">ax_aapl</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;AAPL Price History&#39;</span><span class="p">)</span> + +<span class="c"># Plot the FB trend down and up</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax_fb</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_fb</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">),</span> <span class="n">FB</span><span class="p">)</span> +<span class="n">plot_hilo</span><span class="p">(</span><span class="n">ax_fb</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">28</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">FB</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">ax_fb</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;FB Price History&#39;</span><span class="p">)</span> + +<span class="n">f</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABBEAAAF6CAYAAABP8MBVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcjfX7x/HXZc++ZUaRUZE2soWIQUVJEam00V7fXyRa +5Fto07ekfVF20kbRpj1KWixFSrI0iGbabJFtfH5/fM5ojNmdM/c5M+/n4zGP4b7vc9/XbZnzOdf9 ++VyXOecQEREREREREclJsaADEBEREREREZHYoCSCiIiIiIiIiOSKkggiIiIiIiIikitKIoiIiIiI +iIhIriiJICIiIiIiIiK5oiSCiIiIiIiIiOSKkggiRYCZPWNmQwK47mAze66grysiIiLBMLOlZtY2 +gOu+Y2aXFvR1RYoiJRFE8sHMZpvZX2ZWMov9w8xsr5k1z7D9cjPbY2ZbzGyTmS0ysy6hfe3MbF0e +rv9P6Dy/mdl0M4vL6njn3PXOufvyco+5iGGomU3OZPteMzsydN0RzrlrcnGuT8zsinDGJyIiUlSZ +WZKZbQ+NE7aGvsebWZ3Q+/SW0NevZvaUmRXP5lx7051jnZk9bGaW1fHOuROcc5+G+X4OGCdkHDc5 +585yzh0wLsnkXPvGKSKSP0oiiOSRmdUB2gB7gXOyOOxS4E/gskz2zXPOVXTOVQbGAa+YWaXQPpfL +MBxwg3OuIlAfqAw8kkW8kfx/nlm8ub2HsMluMCMiIlIEOaBLaLxRIfQ9Od2+SqExxIlAK+A/OZyr +Yej4jkBv4OqMB2WXiIig/Iw58j1OCegeRaKOkggieXcZ8AUwAeiTcWdoCl880A+4yMxKZHOuccAh +wFH5iMMAnHObgOnACaHrjzezp83sbTPbCiSGtt2dLsZzzewbM9tsZivM7IzQ9opmNsbMNoSeNtyT +jw/o+45PP1vBzEqb2WQz+8PMNprZV2Z2qJndC5wKPBl6yvF46PhTzOzrdMe2SnfeT8zsXjOba2bb +gIFmtmC/IMxuNrPX8xi7iIhIYZHd+3faGOIP4APguByOTTv+J+Az/h1z/Gxmt5rZYuBvMyse2tYh +tL+Ymd1hZitDY475ZnZ4aF8DM3vfzP40s2Vmdv5B3Wy62QpmdlRo1uam0IzNF0Pb54TuZUlozHF+ +aPvVofHQH2Y2w8xqpjvvXjO7wcx+An4ysyfNbGSGa880s/4HE79ILFESQSTvLgOmAFOBTmZ2aCb7 +3wReDf2+a2YnCSUXrga2AivyG4yZVQd6AIvSbb4IuMc5VwH4PMPxJwMTgYHOuUpAWyAptHsisAs4 +EmgMnA5cld/YQtIy/pcDFYHDgarAdcA/zrn/4gck/xd6UtLPzKoAbwGPAtXwsyzeDm1Pc0kotgrA +40CCmR2TYf/Eg4xdRESkMDIAMzsM6IR/OJLzi8yOwyf+0485LgTOBCo751IzvGQgcAHQOTTmuALY +bmZlgffx46nqoXM8ZWYN8noPWbgHeC8067MW8ASAc65daP+JoTHHq6GEx/1AT6AmsBZ4KcP5zgWa +45MtE0Px+iDMquFnaLyQh9hFYpqSCCJ5YGZtgCOAV5xzi4CV+Gl9afsPAc4HXnDO7QGmceCShlZm +9hewAf/G2s05tzUf4TwROs83oXMNTLdvpnPuSwDn3M4Mr7sCGOuc+zi0/1fn3E9mVgM/CBjgnNsR +ejrxKD4hkZULzNeGSPvaSNbTBHfjEwL1nfeNc+7vLI7tAvzknJvqnNvrnHsJ+JH9EzITnHM/hvbv +Al7GJw4ws+OBOsDb2cQuIiJSmM1I9/78WrrtBvwees9eB/yNn9GYnUVm9icwE3jOOTch3b7HnHMb +MhlvAFwJDHHOrQRwzn3nnNsInA387JybFBoTLAZew4+hsvJE+jEH/oFNVnYDdczscOfcLufcvAz7 +0ycgeuPHRYudc7uBwfix2hHpjrnfObfZObfTOTcf2GxmHUP7LgRmh8ZNIkWCkggieXMZ8H7oDRDg +RfwT9jTn4d+4ZoV+PxU4K5SlTvOFc66qc66Gc+4U59wn+YzlxtB5ajvnLnXO/ZluX3YFGmsDqzLZ +XgcoCfyaLiHwLP4JQVZeDsWQ9lWFrJ8MTAbeA14ys1/M7H/ZrC08DFiTYdsa/CyGNBnvcRL/JnQu +wSd6dmcTu4iISGF2brr35/PSbXdAtdB7dllgHn5WQHYaO+eqOefqOeeGZtj3Szavqw2szmR7HaBl +hocQvfHLQbNyY/oxBz4RkZVb8J9zvjaz78ysbzbH7jfmcM5tw9e1Sj/myHiPkwg9uAh9z7Ggo0hh +kt1abRFJx8zKAL2AYmb2a2hzKaCymZ3onPsOn2QoD6wN1RIw/P+z3oSm0hWQ7IoGrSPzGgzrgB34 +gUXYiyOGZmbcA9wTyu7Pws8uGM+B8W7AL9FIL+01+06Z4fxfmdkuMzsV/+ed3QwKERGRwi6nmgjO +ObfTzCYAg8ysqnPur3ycKzdjjh8y2T7bOdcpm9fmm3PuN+AaADNrDXxoZnOcc5klNDbgkxqEji+H +nzmZPnGQ8R6nAN+ZWUOgATAjjOGLRD3NRBDJve7AHuBYoFHo61j8ev7LQusKO+Kn4p8U2t8QeJD9 +Zytkx0IFCPd9hfkeAMYCfc2svXmHmdkxoarN7wOPmFmF0L4jLUy9ns0s0cxOMN8t4m/8jI20tZMp ++DoMad4B6pnZhaEiTRfg/6yzm7oI/knAk0BmUxdFREQkXaHE0DjjMuDXbBIIB2MM/uHB0aHrnZiu +7lF9M7vEzEqYWUkza5bHmghZMrOeaQUcgU34jlp7Q79PZv8xx4v4cVHD0J/H/cCXzrksZ3U659YD +C/DjjulZLOUQKbSURBDJvcuAcc659c6539K+gKeAi/GdGr5xzn2UYf/jwImhYkQ5OQzYHvr6B198 +KLNextll/bNtuxhay9cXX+9gMzAb/5Q/7R5L4Z8Y/IUvDpnd1MLcXp/QeaaFrvk98Ak+kw/wGHB+ +qELzo6GBzNnAIOCP0Pcu6ZaRZHWNyfiK0ZpWKCIiRVlO44SNZrYF+BVoQdYtq3Nzruy2jQJeAd43 +s834pMIhoZpIZ+DrCWwIfT2AH4PkNYbMjmkOfBW6xxlAP+dcUmjfMGBSaBlFT+fcR8Cd+JoM64G6 +pCucmM21J+LHHJNyEZtIoWI5zVo2s7H4wXyKc65haFtP/H/AY4HmoQJzmFkdYBl+ijL4LN4NkQld +RGR/oSUnKUAT51xmdR9EJEZlMR55EF9wdSe+1ktf59wWMzsN/4GkJL7jzK0HUX9GROQAoeWTk51z +CUHHIlLQcjMTYTy+9Ut63+Gnds/J5PiVzrkmoS8lEESkIN0AzFcCQaRQymw88j5wvHPuJHyr3MGh +7b8DZzvnGuFniWl2koiEjZmVBPoDzwcdi0gQciys6JybG5phkH7bcvCLtzN5SXaFV0REIsLMfg79 +sluggYhIRGQxHvkw3W+/JFSQNdQuLu2Y782sjJmVVMcWETlYoboNC/Atth8LOByRQESiO0OCmS3C +r3u+0zk3NwLXEBHZj3OubtAxiEigrgBeyrgxtARzkRIIIhIOzrkf8Z24RIqscCcRNgBHOOc2mlkT +YIaZHRcqniIiIiISdmY2BNjtnJuaYfvxwAjg9EACExERKYTCmkQIZfk3hn69yMxWAfWBRRmPNbOw +96EXEREpLJxzWh6YC2bWBzgL6JBhey18tfVL01Vlz+z1Go+IiIhkIbPxSG5bPO7rJ5vFPv8Ls+qh +HvCE2tIdDazO6qRDhw7FOZfl18Hsj+S527VrF7FzF9b7imTcui/dl+5L9xX0fTGMsN6XZGm/8YiZ +dQZuAc5x6fq0m1klfB/625xzX+Z00vz+fRX0vuz+XUZTnLqH6N+ne4iOfbqH6NgXrntIPxaI1XvI +uC8rOSYRzGwqMA+ob2ZrzayvmXUzs3VAS+AtM5sVOrwtsCRUE+EV4Frn3Kaszp2YmJjttQ9mfyTP +nZCQELFz57Q/Vu8rknHntF/3lff9uq/w79d95X2/7kvSy2w8AjyBX5v8gZktMrOnQ4f/H3AUcJeZ +fRPaVz2rc+f376ug92X37zKa4tQ9RP8+3UN07NM9RMc+3UPe92WZeYj0l790bBo6dGjQIUSE7iu2 +6L5ii+4rtuT1vhgW3ve00HtkYO/RRekrlsYjheH/m+4hOugeooPuITqE6x7CPRbIi0j9PWQ1Hsnt +cgZJp7A+JdJ9xRbdV2zRfcWWwnpfEtsKw79L3UN00D1EB91DdNA95J35BEPBMzMX1LVFRETCyYYb +bmj43tPMDKfCigVC4xEREQmHcI8FokFW45Fwt3g8aAkJCaxZsyboMKSQqFOnDklJSUGHISIiMUbj +EQknjUdEpDCJuiTCmjVr0BMBCRczPcgTEZG803hEwknjEREpTFQTQURERERERERyRUkEERERERER +EckVJRFEREREREREJFeURIhic+fO5dhjjw06jDxp374948aNCzoMERERCRONR0REJD0lEfIoISGB +smXLUrFiRSpUqEDFihXp169fRK7Vpk0bli1bFpFzZ2XixImUKFGCihUrUrlyZRo3bszbb79doDGI +iIhI9jQeERGRoERdd4ZoZ2a8/fbbtG/f/qDOk5qaSvHixcMUVXidcsopfPrppwA899xzXHjhhaxf +v56KFSsGHJmIiIiAxiMiIhIczUTIh6xaPq1evZqOHTtSvXp1atSowSWXXMKWLVv27a9bty4PPvgg +jRo1onz58qSmplK3bl0efvhhGjVqRJUqVbjooovYtWsXAHPmzKF27dr7vT6rYwEefPBBDjvsMGrV +qsXYsWMpVqwYq1evBuCdd97h+OOPp2LFitSuXZtRo0bl6l4vvfRStm3bxooVK/Zt+/LLL2ndujVV +qlShcePGzJkzJ8vXjxs3juOOO45q1apx5plnsnbt2n37brrpJo444ggqVapE8+bNmTt37r598+fP +p3nz5lSqVImaNWsyaNCgfF1fRESksNJ4ROMREZFAOOcC+fKXPlBW26NFQkKC++ijjzLdt3LlSvfh +hx+63bt3uz/++MO1a9fODRgwYL/XNm7c2K1fv97t2LFj37YWLVq45ORkt3HjRnfssce60aNHO+ec +mz17tqtdu/Z+r8/q2FmzZrmaNWu6ZcuWuX/++cddcsklrlixYm7VqlXOOedq1qzpPv/8c+ecc5s2 +bXLffPNNpvcwYcIEd+qppzrnnNuzZ4978sknXenSpd3vv//unHNu/fr1rlq1au7dd991zjn34Ycf +umrVqrk//vjDOedcYmKiGzt2rHPOuRkzZrh69eq55cuXu9TUVHffffe5U045Zd+1XnjhBbdx40aX +mprqRo0a5eLj493OnTudc861atXKTZkyxTnn3LZt29xXX32Vq+tnFO3/nkSkcGBYeH/WhH52BfYe +XZS+NB7ReETjEREJh3CPBaJBVuMRzUTIh27dulG1alWqVKlC1apVGTt2LABHHXUUHTt2pESJElSr +Vo0BAwYckJXu378/hx12GKVLl95vW1xcHJUrV6Zr1658++23WV47q2NfffVV+vbtS4MGDShTpgzD +hg1LGxwBUKpUKb7//nu2bt1KpUqVOOmkk7K8xhdffEHVqlU55JBDuPXWW5kyZQrVq1cHYMqUKXTp +0oVOnToB0LFjR5o1a8Y777xzwHlGjx7N4MGDqV+/PsWKFeP222/n22+/Zd26dQD07t2bypUrU6xY +MQYMGMDOnTtZvnz5vnhXrlzJn3/+SdmyZTn55JPzfH0REZHCTOMRjUdERIIQkzURbLiF5TxuaObT +AHMyc+bMTNcg/vbbb/Tv35/PPvuMv//+m9TUVKpWrbrfMbVq1TrgdXFxcft+XbZsWX799dcsr53V +sRs2bKB58+b79qWfdggwffp07rnnHm677TYaNWrEiBEjaNmyZabXaNWqFZ9++inbt2/nyiuv5NNP +P6Vnz54ArFmzhldeeYU333wT8DNZ9uzZQ8eOHQ84z5o1a+jfvz8DBw7cd6yZsX79emrXrs3IkSMZ +N27cvnvYunUrf/zxBwBjx47lzjvvpEGDBhx55JHcdddddOnSJcvrd+jQIcs/MxERkUgIx3gkv2MR +0HhE4xERkWDEZBLhYN5ww3J9l/n177jjDooVK8b3339PpUqVmDlzJjfeeON+x5iFJwGSUc2aNfnl +l1/2/X7t2rX7Xatp06bMmDGD1NRUnnjiCXr16rXfesDMlC1blqeffpojjzySK6+8kkaNGlG7dm0u +u+wyRo8enWNMtWvX5r///S8XXXTRAfvmzp3LQw89xCeffMJxxx0HQNWqVff92R511FFMnToV8AOO +nj178tdff+Xp+iIiIpGk8ciBNB4RESn8tJwhjLZu3Ur58uWpUKEC69ev56GHHiqwa/fq1Yvx48fz +448/sn37du699959+3bv3s3UqVPZsmULxYsXp0KFCrmuxFylShWuvvpqhg8fDsAll1zCm2++yfvv +v8/evXvZsWMHc+bMYcOGDQe89rrrruP+++/nhx9+AGDz5s1MmzYN8H9WJUuWpFq1auzatYu7776b +rVu37nvtCy+8sO8pQKVKlTAzihUrlqfri4iIFEUaj+xP4xERkfBSEiEfunbtSsWKFfd99ejRA4Ch +Q4eycOHCfesD07anySzrn5cnAdkd27lzZ/r160f79u2pX78+rVq1Ati31nHy5MnUrVuXypUr89xz +z+3LqudG//79mTVrFkuXLqVWrVrMnDmT+++/n0MPPZQ6deowcuRI9u7de0CM3bp14/bbb+fCCy+k +cuXKNGzYkHfffReATp060alTJ+rXr0/dunUpW7bsflMe33333X3VmwcMGMDLL79M6dKlc7y+iIhI +UaHxiMYjIiJBsKymwkX8wmYus2ubWZbT8yT3fvzxR0488UR27txJsWJFN1ekf08iUhBsuIV1anvo +Z1dk5pvLfjQeiSyNRzz9exIp/NLGAjt2QMmSkMuJVlEtq/FI0f1pXgjNmDGDXbt2sXHjRm677TbO +OeecIv2GLSIiIgVP4xERKcqefBI6dICffw46ksjRT/RCZPTo0dSoUYN69epRsmRJnn766aBDEhER +kSJG4xERKcoGDICu8fM5+WQYOxYK4ySkmOzOIJmbNWtW0CGIiIhIEafxiIgUZcWLw6Bj36bznc25 +9FJ4/XUYMwbi44OOLHw0E0FEREREREQkjE44Ab76Cho3hpNOglBTmEJBSQQRERERERGRMCtVCu65 +B2bMgDvugEsugY0bg47q4CmJICIiIiIiIhIhLVvCt99ClSrQsCG8/37QER0cJRFEREREREREIqhs +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 +wqAjyClHHQUzZ8Jrr8Hxx8N//hN0RMFTEkFERERERESkErvsAsXF0KqV394wY0bQEQWrTtABiIiI +iIiIiGSyunVh2DBfePG446BTp32DDikwWokgIiIiIiIiEodevWDqVGjbNnc/SufuyEVERCRrmNkI +Mysxs7lljjUyswlmtsjM3jSzhmUu28/MpprZfDP7t5nVCyZyEREJm913h2uvPTHoMAKjJIKIiIhk +g5HA0eWOXQ1Mcs61BN4GrgEws9rAE8C5zrl9gAJgffpCFRERCS8lEURERCTjOeemAKvKHT4BGB37 +fjTQM/Z9V+Dfzrn5sd9d5ZxzaQlUREQk5JREEBERkWy1g3OuBMA5FwV2iB3fA8DM3jCzWWZ2RVAB +ioiIhI26M4iIiEhYlK42qAMcArQDfgXeMrNZzrl3AotMREQkJJREEBERkWxVYmZ5zrkSM4sAK2PH +vwLec86tAjCz8UAboMIkwqBBg377vqCggIKCglTGLCIikpGKi4spLi6u8npKIoiIiEi2sNi/UuOA +QuA24ExgbOz4m8AVZrYVsAE4HLizshstm0TIRpFIhJKSEoYPH040Gg06HBERyVLlE+mDBw+u8HpK +IoiIiEjGM7Mx+C4L25vZcqAIGAo8Z2ZnAV8AJwM4534wszuBWcAm4DXn3OuBBJ4GJSUlm30VERFJ +JSURREREMkl+ftARZCTnXP9KLjqykuuPAcakLiIREZHcpO4MIiIimaSwMOgIJJcoaSUiItWkJIKI +iIhIpsvL2/xrsihpJSIi1aQkgoiIiEimi0ahqMh/FRERCZCSCCIiIiIiIiISFyURRERERERERCQu +SiKIiIiIhFi+iieKiEgSKYkgIiIiEmKFKp4oIiJJpCSCiIiIiIiIiMRFSQQRERERERERiYuSCCIi +IiIiIiISFyURRERERERERCQuSiKIiIiIiIiISFyURBARERERERGRuCiJICIiIiIiIiJxURJBRERE +REREROKiJIKIiIiIiIiIxEVJBBERERERERGJi5IIIiIiIiIiIhIXJRFEREREslheXt5mX0VERFJJ +SQQRERGRbJCfX+HhaDRKUVER0Wg0vfGIiEhOUhJBREREJBsUFgYdgYiIiJIIIiIiIiIiIhIfJRFE +REREREREJC5KIoiIiIiIiIhIXJREEBEREREREZG4KIkgIiIikuXyK+ncICIikmxKIoiIiIhkuUJ1 +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 +cAw4PwAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>As we can see above, the market broke a prevailing trend on Apple in order to go down, and ultimately predict the earnings release. For Facebook, the opposite happened. While the trend was down, the earnings were fantastic and the market corrected itself much higher.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Formulating-the-Question">Formulating the Question<a class="anchor-link" href="#Formulating-the-Question">&#182;</a></h1><p>While these are two specific examples, there are plenty of other examples you could cite one way or another. Even if the preponderance of evidence shows that the market correctly predicts earnings releases, we need not accuse people of collusion; for a company like Apple with many suppliers we can generally forecast how Apple has done based on those same suppliers.</p> +<p>The question then, is this: <strong>how well does the market predict the earnings releases?</strong> It's an incredibly broad question that I want to disect in a couple of different ways:</p> +<ol> +<li>Given a stock that has been trending down over the past N days before an earnings release, how likely does it continue downward after the release?</li> +<li>Given a stock trending up, how likely does it continue up?</li> +<li>Is there a difference in accuracy between large- and small-cap stocks?</li> +<li>How often, and for how long, do markets trend before an earnings release?</li> +</ol> +<p><strong>I want to especially thank Alejandro Saltiel for helping me retrieve the data.</strong> He's great. And now for all of the interesting bits.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Studies">Event Studies<a class="anchor-link" href="#Event-Studies">&#182;</a></h1><p>Before we go too much further, I want to introduce the actual event study. Each chart intends to capture a lot of information and present an easy-to-understand pattern:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[5]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">pandas.tseries.holiday</span> <span class="k">import</span> <span class="n">USFederalHolidayCalendar</span> +<span class="kn">from</span> <span class="nn">pandas.tseries.offsets</span> <span class="k">import</span> <span class="n">CustomBusinessDay</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> + +<span class="c"># If you remove rules, it removes them from *all* calendars</span> +<span class="c"># To ensure we don&#39;t pop rules we don&#39;t want to, first make</span> +<span class="c"># sure to fully copy the object</span> +<span class="n">trade_calendar</span> <span class="o">=</span> <span class="n">USFederalHolidayCalendar</span><span class="p">()</span> +<span class="n">trade_calendar</span><span class="o">.</span><span class="n">rules</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="c"># Remove Columbus day</span> +<span class="n">trade_calendar</span><span class="o">.</span><span class="n">rules</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="c"># Remove Veteran&#39;s day</span> +<span class="n">TradeDay</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">days</span><span class="p">:</span> <span class="n">CustomBusinessDay</span><span class="p">(</span><span class="n">days</span><span class="p">,</span> <span class="n">calendar</span><span class="o">=</span><span class="n">trade_calendar</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">plot_study</span><span class="p">(</span><span class="n">array</span><span class="p">):</span> + <span class="c"># Given a 2-d array, we assume the event happens at index `lookback`,</span> + <span class="c"># and create all of our summary statistics from there.</span> + <span class="n">lookback</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">norm_factor</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">array</span><span class="p">[:,</span><span class="n">lookback</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">centered_data</span> <span class="o">=</span> <span class="n">array</span> <span class="o">/</span> <span class="n">norm_factor</span> <span class="o">-</span> <span class="mi">1</span> + <span class="n">lookforward</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">lookback</span> + <span class="n">means</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">lookforward_data</span> <span class="o">=</span> <span class="n">centered_data</span><span class="p">[:,</span><span class="n">lookforward</span><span class="p">:]</span> + <span class="n">std_dev</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">std</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)])</span> + <span class="n">maxes</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">mins</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">range_begin</span> <span class="o">=</span> <span class="o">-</span><span class="n">lookback</span> + <span class="n">range_end</span> <span class="o">=</span> <span class="n">lookforward</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + + <span class="n">max_err</span> <span class="o">=</span> <span class="n">maxes</span> <span class="o">-</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">min_err</span> <span class="o">=</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">mins</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:],</span> + <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">min_err</span><span class="p">,</span> <span class="n">max_err</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Max &amp; Min&#39;</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + + <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + +<span class="k">def</span> <span class="nf">plot_study_small</span><span class="p">(</span><span class="n">array</span><span class="p">):</span> + <span class="c"># Given a 2-d array, we assume the event happens at index `lookback`,</span> + <span class="c"># and create all of our summary statistics from there.</span> + <span class="n">lookback</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">norm_factor</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">array</span><span class="p">[:,</span><span class="n">lookback</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">centered_data</span> <span class="o">=</span> <span class="n">array</span> <span class="o">/</span> <span class="n">norm_factor</span> <span class="o">-</span> <span class="mi">1</span> + <span class="n">lookforward</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">lookback</span> + <span class="n">means</span> <span class="o">=</span> <span class="n">centered_data</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">lookforward_data</span> <span class="o">=</span> <span class="n">centered_data</span><span class="p">[:,</span><span class="n">lookforward</span><span class="p">:]</span> + <span class="n">std_dev</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">std</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)])</span> + <span class="n">maxes</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">mins</span> <span class="o">=</span> <span class="n">lookforward_data</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">range_begin</span> <span class="o">=</span> <span class="o">-</span><span class="n">lookback</span> + <span class="n">range_end</span> <span class="o">=</span> <span class="n">lookforward</span> + <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">range_begin</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> <span class="n">means</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">+</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="p">:]</span> <span class="o">-</span> <span class="n">std_dev</span><span class="p">,</span> + <span class="n">alpha</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;$\pm$ 1 s.d.&quot;</span><span class="p">)</span> + + <span class="n">max_err</span> <span class="o">=</span> <span class="n">maxes</span> <span class="o">-</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">min_err</span> <span class="o">=</span> <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">mins</span> + <span class="n">plt</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">range_end</span><span class="p">),</span> + <span class="n">means</span><span class="p">[</span><span class="o">-</span><span class="n">lookforward</span><span class="o">+</span><span class="mi">1</span><span class="p">:],</span> + <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">min_err</span><span class="p">,</span> <span class="n">max_err</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Max &amp; Min&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">((</span><span class="o">-</span><span class="n">lookback</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">lookback</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> + +<span class="k">def</span> <span class="nf">fetch_event_data</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">events</span><span class="p">,</span> <span class="n">horizon</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span> + <span class="c"># Use horizon+1 to account for including the day of the event,</span> + <span class="c"># and half-open interval - that is, for a horizon of 5,</span> + <span class="c"># we should be including 11 events. Additionally, using the</span> + <span class="c"># CustomBusinessDay means we automatically handle issues if</span> + <span class="c"># for example a company reports Friday afternoon - the date</span> + <span class="c"># calculator will turn this into a &quot;Saturday&quot; release, but</span> + <span class="c"># we effectively shift that to Monday with the logic below.</span> + <span class="n">td_back</span> <span class="o">=</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> + <span class="n">td_forward</span> <span class="o">=</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> + + <span class="n">start_date</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span> <span class="o">-</span> <span class="n">td_back</span> + <span class="n">end_date</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span> <span class="o">+</span> <span class="n">td_forward</span> + <span class="n">total_data</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span> + <span class="n">event_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">total_data</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">td_back</span><span class="p">:</span><span class="n">event</span><span class="o">+</span><span class="n">td_forward</span><span class="p">]</span>\ + <span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">horizon</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>\ + <span class="p">[</span><span class="s">&#39;Adjusted Close&#39;</span><span class="p">]</span> + <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">events</span><span class="p">]</span> + <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">event_data</span><span class="p">)</span> + +<span class="c"># Generate a couple of random events</span> + +<span class="n">event_dates</span> <span class="o">=</span> <span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">27</span><span class="p">)</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">TradeDay</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mi">20</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">40</span><span class="p">)]</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">fetch_event_data</span><span class="p">(</span><span class="s">&#39;CELG&#39;</span><span class="p">,</span> <span class="n">event_dates</span><span class="p">)</span> +<span class="n">plot_study_small</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span> + + +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;Mean price for days leading up to each event&#39;</span><span class="p">,</span> + <span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="o">-.</span><span class="mi">01</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mf">4.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">025</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.05</span><span class="p">))</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="p">(</span><span class="o">-.</span><span class="mi">1</span><span class="p">,</span> <span class="o">.</span><span class="mi">005</span><span class="p">),</span> <span class="p">(</span><span class="o">-.</span><span class="mi">5</span><span class="p">,</span> <span class="o">.</span><span class="mi">02</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">})</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;$\pm$ 1 std. dev. each day&#39;</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="o">.</span><span class="mi">055</span><span class="p">),</span> <span class="p">(</span><span class="mf">2.5</span><span class="p">,</span> <span class="o">.</span><span class="mi">085</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">})</span> +<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s">&#39;Min/Max each day&#39;</span><span class="p">,</span> <span class="p">(</span><span class="o">.</span><span class="mi">9</span><span class="p">,</span> <span class="o">-.</span><span class="mi">07</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-.</span><span class="mi">1</span><span class="p">),</span> + <span class="n">arrowprops</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;facecolor&#39;</span><span class="p">:</span> <span class="s">&#39;black&#39;</span><span class="p">,</span> <span class="s">&#39;shrink&#39;</span><span class="p">:</span> <span class="o">.</span><span class="mi">05</span><span class="p">});</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtEAAAFwCAYAAAB+YSfRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VPW9//HXdyaTSTLZSICwb+pFRAIJsi8GUNyxqIj7 +Ulu1anvb/qoUr1VwudfeVlzaWltrrVqvooiIRSkoxn1BURaFgGjCGkhCyL7MZL6/PyYZs5OYwGR5 +Px+P85g53/mecz4zo+Gdb77nHGOtRUREREREWs4R6gJERERERDobhWgRERERkVZSiBYRERERaSWF +aBERERGRVlKIFhERERFpJYVoEREREZFWapcQbYw50xizzRiz3RizoJHXhxtjPjDGlBtjflnvtUxj +zEZjzOfGmE/aox4RERERkaMprK07MMY4gD8Cs4B9wHpjzCvW2m21uuUBPwV+0Mgu/ECatTa/rbWI +iIiIiBwL7TESPR7YYa3NstZ6geeB82t3sNbmWms/A3yNbG/aqQ4RERERkWOiPcJrf2B3rfU91W0t +ZYG1xpj1xpgft0M9IiIiIiJHVZunc7SDKdba/caYXgTC9FZr7XuhLkpEREREpCntEaL3AoNqrQ+o +bmsRa+3+6sccY8zLBKaHNAjRxhjbxjpFRERERFrEWmuae709pnOsB443xgw2xoQDlwArm+kfLMgY +E2WMia5+7gFmA1ua2tBaq6WTLnfddVfIa9Ci7647Lvr+Ou+i765zL/r+OvfSEm0eibbWVhljbgHW +EAjlT1hrtxpjbgi8bP9qjEkCPgViAL8x5j+Bk4BewMvVo8xhwLPW2jVtrUlERERE5GhqlznR1trV +wPB6bX+p9fwAMLCRTYuBMe1Rg4iIiIjIsaJLy8kxkZaWFuoS5HvSd9e56fvrvPTddW76/ro+09J5 +H6FmjLGdpVYRERER6byMMdhjcGKhiIiIiEi3ohAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIi +IiIiraQQLSIiIiLSSgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQ +LSIiIiLSSgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLS +SgrRIiIiIiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLSSgrRIiIi +IiKtpBAtIiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLSSgrRIiIiIiKtpBAt +IiIiItJKCtEiIiIiIq2kEC0iIiIi0koK0SIiIiIiraQQLSIiIiLSSgrRIiIiIiKtpBAtIiIiItJK +CtEiIiIiIq2kEC0iIiIi0kphoS5ARERERDq+9Mx00jPTg8/ThqQBkDYkLfi8OzHW2lDX0CLGGNtZ +ahURERHpysxig72r6+YyYwzWWtNcH03nEBERERFpJYVoEREREZFWUogWEREREWmldgnRxpgzjTHb +jDHbjTELGnl9uDHmA2NMuTHml63ZVkRERESko2lziDbGOIA/AmcAI4FLjTEn1uuWB/wU+N332FZE +REREpENpj5Ho8cAOa22WtdYLPA+cX7uDtTbXWvsZ4GvttiIiIiIiHU17hOj+wO5a63uq2472tiIi +IiIiIaGbrYiIiIi0A92MpHtpjxC9FxhUa31AdVu7b7to0aLg87S0NNLS0lpao4iIiMhRVTssm8WG +9GvSQ1qPtFx6ejrp6emt2qbNdyw0xjiBDGAWsB/4BLjUWru1kb53AcXW2ge+x7a6Y6GIiIh0Cl3+ +jn5d/f214I6FbR6JttZWGWNuAdYQmGP9hLV2qzHmhsDL9q/GmCTgUyAG8Btj/hM4yVpb3Ni2ba1J +RERERORoapc50dba1cDwem1/qfX8ADCwpduKiIiIiHRkOrFQRESkg9CJaSKdh0K0iIhIB9HVT0zT +LwnSlShEi4iIyDHR1X9JkO6lPW62IiIiIiLSrShEi4iIiIi0kkK0iIiItNp1111HUlISycnJrdqu +oKCAP//5z02+vnjxYpYsWdKqfX6fbY6FrKwsRo0a1ertOur7kboUokVERKSBPXv2UFxc3OTr1157 +Lf/+979bvd/8/HweffTRtpTWqRjT7P06pBNTiBYREZEGdu7cyaFDh5p8ferUqfTo0aPZfZSWlnLu +ueeSkpJCcnIyL774IgsXLmTnzp3wGCxYsACA++67j+HDhzN9+nQyMjJaVF9T2zz77LNMmDCB1NRU +fvKTn+D3+1m4cGGd4N7Skd76+6q5c/LcuXMZN24co0aN4m9/+1uw/9NPP83o0aNJSUmBlwNtPp+P +66+/npNPPpkzzzyTioqKVr2fxo5111138fDDDwf73HHHHfzhD39owacm7cpa2ymWQKkiIiLdA4tC +++9eenq6zczMbLZPZmamHTVqVJOvv/TSS/b6668PrhcWFga3qXl/n332mU1OTrbl5eW2sLDQHn/8 +8faBBx5o9rhNbbN161Z73nnnWZ/PZ6219qabbrLPPPOM/fzzz+2pp54a3P6kk06ye/bsafYYTe3L +Wmvz8/OttdaWlZXZk08+2R46dMh++eWXdvjw4fbQoUPWWmtZgM3MzLRhYWF206ZN1lprL774Yvvs +s8+2+P00dazMzEybmppqrbXW7/fb4447LnjcYyXU/30ebdW5s9lsqkvciYiICAC7du3irbfeAmDb +tm306tWLxMREjDHMmTOH+Pj4Vu1v1KhR/OpXv2LhwoWcc845TJ06tcHo9rvvvsvcuXNxu9243W7m +zJlzxP02tc2bb77JZ599xrhx47DWUl5eTp8+fbjiiivIyckhOzubgwcPkpCQQP/+/Zs9xptvvsmG +DRvq7CspKQmAhx56iBUrVgCBaS87duzgk08+Yd68ed+NzkcGHoYNGxacFz127FgyMzNb/H6aOtb4 +8ePp2bMnGzduJDs7m9TU1CP+VUDan0K0iIiIADBo0CCuvvpqAN555x2GDBnCoEGDvvf+TjjhBDZs +2MBrr73GHXfcwWmnncaVV14ZnBZxNFxzzTXcd999DdrnzZvHiy++SHZ2NvPnzz/ifqy1XH311Q32 +9fbbb7Nu3To+/vhj3G43M2bMoLy8PLhNfW63O/jc6XQG+7ZEc8f60Y9+xJNPPkl2djY//OEPW7xP +aT+aEy0iIiIN2O+mU37vPvv37ycyMpLLLruMW2+9lQ0bNhATE0NRUVGwz/Tp01mxYgUVFRUUFRXx +6quvHrG2praZOXMmy5YtIycnBwicxLhr1y4ALr74Yp5//nleeukl5s2bd8RjzJo1q9F9FRQU0KNH +D9xuN9u2beOjjz6qc+zgSHvZd5/R930/TR0L4Ac/+AGrV6/m008/5YwzzjjiMaT9aSRaREREgMAl +2d544w0Atm/fTs+ePUlISMAYw9y5c+tMGbjssstIT08nLy+PQYMGsXjxYq699to6+9u8eTO33nor +DoeD8PBwHnvsMRISEpgyZQpZj2axoHQBv/3tb7n44otJTk4mKSmJ8ePHB7c/55xzeOKJJ+jTp0+d +/aakpDB//vwG24wYMYJ7772X2bNn4/f7CQ8P509/+hODBg3ipJNOoqioiAEDBgSnZTR3jKb2deaZ +Z/LYY48xcuRIhg8fzqRJkwA46aST+K//+i9OPfVUwsKq49VPWnZ1jqbez1lnndXosQBcLhczZsyg +R48eugJIiJij+SeV9mSMsZ2lVhERkbYyiw32rq77757eX9v4/X7Gjh3LsmXLOO64447acZrS5b8/ +Y7DWNvvbiaZziIiIiHQiW7du5YQTTuD0008PSYCWAE3nEBEREelERowYEbjWtoSURqJFRERERFpJ +IVpEREREpJUUokVERES6sK1bt+L3+0NdRpejEC0iIiLSBVlrufvuuxk5ciS//OUvQ11Ol6MQLSIi +ItLFVFZWcskll/Db3/4Way2PP/44f/3rX0NdVpeiEC0iIiLSxZx99tmsXLmS0tJSAEpLS/n5z3/O +W2+9FeLKug6FaBEREZEuZtq0aTgcdWNeWVkZ559/Ptu3bw9RVV2LQrSIiIhIF3PnnXdyzjnnEBkZ +Wae9uLiYGTNmkJeXF6LKug6FaBEREZEuxhjDM888w4gRI3C5XMF2ay05OTmcccYZVFRUhLDCzk8h +WkRERKQLcrvd/Pvf/6Znz54YY4LtXq+Xr776iquuugprbQgr7NwUokVERES6qJ49e7Ju3To8Hk+d +9rKyMv71r39xzz33hKiyzk8hWkRERKQLO/HEE3n55ZcbzI8uLS3l/vvv54UXXghRZZ2bQrSIiIhI +F3faaaexZMkSoqKi6rSXlZVx7bXXsn79+hBV1nkpRIuIiIh0AzfeeCPXXXddgyBdWlrK7Nmz2bVr +V4gq65zCQl2AiIhIa6RnppOemR58njYkDYC0IWnB5yLSuAcffJBt27bxzjvv1Lk6R2FhITNnzuTz +zz8nJiYmhBV2HgrRIiLSqdQOy2axIf2a9JDWI9KZOJ1OXn75ZVJTU9m5cydVVVUA+P1+9uzZw5w5 +c3jjjTdwOp1Ya7n//vv517/+xfvvvx/iyjseTecQERER6UY8Hg/r1q0jLi6uTntFRQWffPIJN998 +M16vl6uuuop7772XTz/9lNzc3BBV23EpRIuIiIh0M/3792ft2rWNzo9+5plnGD58OC+99BKlpaVE +RETw3nvvhajSjkshWkRERKQbSk1N5Z///Gejl7779ttvKSsrA6CoqIg1a9aEosQOTSFaREREpJua +O3cud9xxR4MR6dqstQrRjVCIFhEREenGFi5cSEpKCmFhTV9vYvfu3RQUFBzDqjo+hWgRERGRbsrv +93Pbbbfx+eef4/P5muynedENKUSLiIiIdEPl5eXMmTOHRx99lNLS0mb7FhcX8+abbx6jyjoHhWgR +ERGRbmjnzp2kp6e3qK/f7+f1118/ugV1MgrRIiIiIt3QyJEjOXjwIEuWLGHIkCF4PJ5m++/cuZPi +4uJjVF3HpxAtIiIi0k1FRUVxww038M0337Bq1SrOOOMMIiIiCA8Pb9A3MjKSDz/8MARVdkwK0SIi +IiLdnDGGU089ldWrV5ORkcEtt9xCdHR0ndHpkpISzYuuRSFaRERERIIGDRrEAw88wMGDB3n44Yc5 +7rjj8Hg8VFVV8dprr4W6vA5DIVpEREREGoiMjOS6665jx44drF69mrPPPpvc3NxQl9VhNH1VbRER +ERHp9owxTJ06lVWrVmGtDXU5HYZGokVERESkRYwxoS6hw2iXEG2MOdMYs80Ys90Ys6CJPo8YY3YY +Y74wxqTUas80xmw0xnxujPmkPeoRERERETma2jydwxjjAP4IzAL2AeuNMa9Ya7fV6nMWcJy19gRj +zATgz8DE6pf9QJq1Nr+ttYiIiIiIHAvtMRI9Hthhrc2y1nqB54Hz6/U5H3gawFr7MRBnjEmqfs20 +Ux0iIiIiIsdEe4TX/sDuWut7qtua67O3Vh8LrDXGrDfG/Lgd6hERERGRo0QnFwZ0hKtzTLHW7jfG +9CIQprdaa98LdVEiIiIi3ZHf76ewsJCCggIOHz7M4cMF7N9/mP37D3PwYAG5uQUwINRVhl57hOi9 +wKBa6wOq2+r3GdhYH2vt/urHHGPMywSmhzQaohctWhR8npaWRlpaWtsqFxEREelmvF4vBQUFwZB8 +6FAB+/Yd5sCBAg4cOEx+fjHWejAmDojH748jPLwfbvcIIiLiiYjIB34T6rfRrtLT00lPT2/VNu0R +otcDxxtjBgP7gUuAS+v1WQncDCw1xkwEDltrDxhjogCHtbbYGOMBZgOLmzpQ7RAtIiIiIg2Vl5dz ++PDhYEjOzQ2MJGdnF5CTc5jCwgqMiQXisDYea+OIiBiG2x1HREQ8AwbE4nA4m9y/11ty7N7MMVJ/ +cHbx4ibjaFCbQ7S1tsoYcwuwhsAc6yestVuNMTcEXrZ/tda+Zow52xjzNVACXFu9eRLwsjHGVtfy +rLV2TVtrEhEREemKrLWUlJQEQ3J+fmCKRc1Ui4MHD1NWZnE6A+HY2niMiSMioh9udxxRUfHEx0fr +es/toF3mRFtrVwPD67X9pd76LY1s9y0wpj1qEBEREensmpqPnJ0dmGqRm1uAzxeOw/FdSHY6E4Ij +yQkJ8YSFRSgkHwMd4cRCERERkW6hpfORa0Ky3x9PeHg/IiJOwu2Oo0+fOJzO8FC/DUEhWkRERKTd +VFVVkZ8fuH/cxx9/TG7udyH54MHDFBUF5iMbEzhhD+Jxu4cRERGP2x13xPnI0nEoRIuIiIi0grWW +oqIi8vLyyMvLY//+XLKy8ti9O4+cnEIgFgbDY4/lYkw8ERH9iIiIx+OJo0cPzUfuKhSiRURERBpR +Xl4eDMoHD+aRlZXLnj157Nt3iMrKcByOnlibiDGJREYOJSoqkQEDelSPJP8ngwefE+q3IEeRQrSI +iIh0Wz6fj/z8fPLy8sjNzWP37lx27cpj3748Cgq8OByJQCAsR0ScSFRUIr16JRIW5g516RJiCtEi +IiLSpVlrKSwsrDX9Io/MzFz27s0jJ6cIiMOYnlRVJRIePoCoqNFERSXqUnDSLIVoERER6RLKysrq +TL/YtSuPXbty2b//ED5fBJCItT1xOBKJihpGZGQiAwbE60Q++V4UokVERKTT8Pl8HDp0qNb0i8Cy +Z08uxcVVOByJWBsIy5GRI4iMTKR37wRNv5B2pxAtIiIiHYq1loKCguCo8r59gVHl3btzycsrxph4 +IBG/vyfh4QOJjBxDTEwiCQkeTb+QY0YhWkREREKitLS03tUv8tizJ696+kUkxiTi9yfidPYkMvJ4 +oqISGTgwHmMcoS5dRCFaRERE2p/f76eoqKjW3fkKyMkpIDu7kIMHC8DAzTc/Umv6RSKRkSOJikok +KSlBd+WTDk8hWkRERFrFWktZWVkwIBcUFHDoUCH79xdw4EABubkF5OeXAB6MicPawOJ09iQi4jjc +7jiI/QmDBi3Q9AvptBSiRUREpI7KykoKCwtrjSIXkp1dUH3r6gLy8grxesNwOOIwJo6qqliMicPt +7kNERBxudxwDB8YccdqFArR0ZgrRIiIi3Uj9aRYFBYHpFTUBOSengOJiL05nICD7/bFYG0d4+EDc +7pOJiIgjKSlW0y2k21OIFhER6SLqT7MI3GCkIDiKnJNTe5pFLBBHVVUcYWGJREQMw+2OJTY2jsTE +KI0SixyBQrSIiEgn4fV66wTk/PxAOM7O/m6ahc8XFgzIfn9ccJqF2x1LREQcAwbE6OYiIu1AIbob +czgcXHHFFTz99NMAVFVV0adPHyZNmsTKlStDXB189tlnPPPMMzz00ENt2k9GRgaXXHIJDoeDZcuW +MXTo0Dbt7+233+b3v/89r776apv205SYmBiKioravJ+nnnqKzz77jEceeYS//OUveDwerrjiinao +8PsrKCjg//7v//jJT35yzI/91FNP8emnn/KHP/zhmB+7to0bN7Jv3z7OOuuskNYhHUfN6HFpaWmd +BeDll18LBuTc3EKKiysxJrbOyXou1wAiIkbidsfRu3esbioicowoRHdjHo+HLVu2UFFRgdvtZu3a +tQwcODDUZQGBQD927FjGjh3b5n2tWLGCefPmcfvtt7d4G2tts3/KPJp/5jwa+77hhhvafZ/fR35+ +Po8++mhIQjR0jJOYvvjiCz799FOF6C7KWktlZWWDQFxaWkpRUSmHD5eSn1/C4cOlFBYGlpKScqx1 +43BEAYHF2igYDKtWJeB2DyUiIo6YmDgSEjTNQqSj0NXKu7mzzz6bVatWAfDcc89x6aWXBl8rLS3l +uuuuY+LEiYwdOzY48pqVlcX06dM55ZRTOOWUU/joo4+AwAjtjBkzmDdvHiNGjODKK69s9JgzZszg +5z//OSkpKSQnJ/Ppp58CsHjxYq666iqmTp3KVVddxdtvv815550HQElJCT/84Q9JTk5mzJgxvPzy +ywCsXbuWyZMnc8oppzB//vzg6E2N119/nYceeog///nPzJo1C4AlS5YwatQokpOTefjhh4Pv6cQT +T+Tqq69m1KhR7Nmzp85+Vq9ezYgRIzjllFNYvnx5sH39+vVMnjyZsWPHMnXqVHbs2AHAqaeeyqZN +m4L9pk2bxubNm3nnnXdISUkhNTWVsWPHUlJS0uz38/vf/57x48czZswYFi9eHGyfO3cu48aNY9So +Ufztb38Ltj/55JMMHz6ciRMn8v777wfbFy9ezJIlS4Kf/69//WsmTJjAiSeeGOxXVlbG/PnzOfnk +k7nggguYOHEiGzZsaFDT0KFDOXToEBD4a8GMGTPqfH+TJ09m+PDhdeqqsXDhQr755htSU1NZsGAB +ALfeeiujRo1i9OjRvPDCC41+Ds8++ywTJkwgNTWVn/zkJ1hrAbjpppsYP348o0aNqvP5rF+/nilT +pjBmzBgmTpwY/Jz37t3LWWedxfDhw4PHr2/Dhg2kpaUxbtw4zjrrLA4cOEBGRgYTJkwI9snKyiI5 +OTn4GdTv39Tn7PV6ufPOO3nhhRdITU3lxRdfbLQG6Th8Ph+FhYVkZ2fzzTffsGXLFj755BPeeiud +5ctf4+9/X8aDDz7NokWP8YtfPMCPf3wvN974AP/v/z3FnXeu4v77P+bhh3fy178W8NxzLt54oy+b +NiWzf/8sKivnExNzMwMH3sHgwQsYOPCnDBx4HQMHXsqgQecDMGDARHr1GkFMTD/Cw3U3PpGORCPR +3ZgxhksuuYTFixdzzjnnsGnTJq677jreffddAO677z5mzZrFE088QUFBAePHj+e0004jKSmJN954 +g/DwcL7++msuvfRS1q9fDwRG2b766iv69OnDlClT+OCDD5g8eXKDY5eVlfH555/z7rvvcu2117J5 +82YAtm7dyvvvv094eDhvv/128B+Me+65h/j4+GAwrbkd7L333subb75JZGQk//u//8sDDzzAb37z +m+BxzjrrLG688UZiYmL45S9/yYYNG3jqqadYv349VVVVTJgwgbS0NOLj4/n666955plnGDduXJ1a +KyoquP7660lPT2fYsGHMnz8/+NqIESN47733cDgcvPnmmyxcuJBly5bxox/9iCeffJIHH3yQ7du3 +U1FRwahRo5gzZw6PPvookyZNorS0lIiIiCa/n7Vr17Jjxw4++eQTrLXMmTOH9957j6lTp/Lkk08S +Hx9PeXk548aN48ILL6SiooJFixbx+eefExsbS1paGqmpqY3uu6qqio8//pjXX3+dRYsWsXbtWh59 +9FESEhLYsmULX375JSkpKU3+d9PU+ubNm/n4448pKioiJSWFc889lz59+gRfv//++/nyyy+D4Xz5 +8uVs2rSJzZs3c/DgQcaNG8epp55KUlJScJtt27axdOlSPvjgA5xOJzfffDPPPvssV1xxBf/93/9N +fHw8fr+fWbNmceGFFzJ8+HAuueQSXnzxRVJTUykuLg5+zhs3buSLL77A5XIxfPhwfvazn9G/f//g +sXw+Hz/96U9ZuXIliYmJvPDCC9x+++088cQTeL1esrKyGDx4MEuXLuWSSy7B5/Pxs5/9rNH+TX3O +d999d3CajRxbfr+f8vLy4MhwSUlJ9WNgRDg/PzBSXFAQWC8qKqWszIvDEYUxHmpGif3+wEhxWFgi +LtdAXK4oXK4o3O4ooqOjcDpdoX6rInIMKER3cyeffDKZmZk899xznHPOOcERPoA1a9bw6quv8rvf +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 +FJdEUlxSwOISqY6aTnEnIiIiUiVKlqU+0bLfIiIiIiI+0ki0iIiIyHWgcpUbS41m5/CnymbniIuL +K7dMrdQ9sbGxZGVlBToMERERuQ40O0c9GInOzs6udElaqTsqWsRBREREJFipJlpERERExEdKokVE +REREfKQkWkRERETER0qiRURERER8pCT6BpWSksLMmTMDHYaIiIhIUFISXQctWrSIbt260ahRI8aN +GxfocERERETkCkE/xV1FZs58lWPHvqu188fEfI8XXvgvn4+bN28ekydPvma/6OhoZsyYwbp167hw +4UJ1QhQRERGRWlQvk+hjx74jLm52rZ0/K6t6587Pz69Sv6FDhwKwfft2jh8/ftW+8+bNY8GCBZw5 +c4bo6Ghee+017r777nL9du3axfjx4/nb3/7GwIEDNW+ziIiISA2onMOPrveiMF999RWLFi1i586d +nDlzhnXr1hEXF1eu38WLFxk2bBhjx47l1KlTDB8+nD/96U/XNRYRERGRG0m9HImuKw4fPsy77757 +aelItmzZwksvvYRzDjOjR48eJCYmVvv8oaGhFBQUsG/fPqKiooiJiamw39atWyksLGTChAkAPPLI +I3Tr1q3a1xURERG50SmJrkU/+MEPytRA5+fnM2nSpOt6/ldffZXZs2ezf/9+7r//fl5++WVatWpV +pl9OTg7R0dFl9sXGxl63OERERERuNCrnCHLJycl88sknZGdnAzBlypRyfVq1alWutvrYsWN+iU9E +RESkPlIS7UdVrYkuKioiLy+PoqIiCgsLyc/Pp6ioqFy/r776ik2bNlFQUEB4eDgRERGEhJS/pT17 +9qRBgwYsWLCAwsJCMjIy2LZtW43fj4iIiMiNSuUctejgwYOsWLHCWxO9efNmXnjhBW9NdM+ePRkw +YEC54+bMmUNqaqp3Bo2lS5cya9ascouj5OfnM2XKFA4cOEBYWBi9evXijTfeAGDQoEH069ePKVOm +EBYWRkZGBuPHj+f5559n0KBBPPLII2XOdXl/EREREbk6u94zRtQWM3MVxXopQb1cXZ0n+kZW0X0S +ERGR4GSphptVfz/XS/OWq84HXC+TaKl7dJ9ERETqDyXRqokWEREREfGZkmgRERERER+pnEP8QvdJ +REQkuHmyPHiyPN7XSXFJACTFJXlf1xeqiZY6Q/dJREREgoVqokVEREREaoGSaBERERERHymJFhER +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>And as a quick textual explanation as well:</p> +<ul> +<li><p>The blue line represents the mean price for each day, represented as a percentage of the price on the '0-day'. For example, if we defined an 'event' as whenever the stock price dropped for three days, we would see a decreasing blue line to the left of the 0-day.</p> +</li> +<li><p>The blue shaded area represents one standard deviation above and below the mean price for each day following an event. This is intended to give us an idea of what the stock price does in general following an event.</p> +</li> +<li><p>The green bars are the minimum and maximum price for each day following an event. This instructs us as to how much it's possible for the stock to move.</p> +</li> +</ul> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Type-1:-Trending-down-over-the-past-N-days">Event Type 1: Trending down over the past N days<a class="anchor-link" href="#Event-Type-1:-Trending-down-over-the-past-N-days">&#182;</a></h1><p>The first type of event I want to study is how stocks perform when they've been trending down over the past couple of days prior to a release. However, we need to clarify what exactly is meant by "trending down." To do so, we'll use the following metric: <strong>the midpoint between each day's opening and closing price goes down over a period of N days</strong>.</p> +<p>It's probably helpful to have an example:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[6]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">f</span><span class="p">,</span> <span class="n">axarr</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> +<span class="n">f</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + +<span class="n">FB_plot</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">FB</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">):],</span> <span class="n">FB_plot</span><span class="p">)</span> + +<span class="n">FB_truncated</span> <span class="o">=</span> <span class="n">FB</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">18</span><span class="p">):</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">)]</span> +<span class="n">midpoint</span> <span class="o">=</span> <span class="n">FB_truncated</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">FB_truncated</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">FB_truncated</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">midpoint</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Midpoint&#39;</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_fb</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="n">FB_plot</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;FB Midpoint Plot&#39;</span><span class="p">)</span> + +<span class="n">AAPL_plot</span> <span class="o">=</span> <span class="n">axarr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> +<span class="n">ohlc_dataframe</span><span class="p">(</span><span class="n">AAPL</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10</span><span class="p">):],</span> <span class="n">AAPL_plot</span><span class="p">)</span> +<span class="n">AAPL_truncated</span> <span class="o">=</span> <span class="n">AAPL</span><span class="p">[</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">)]</span> +<span class="n">midpoint</span> <span class="o">=</span> <span class="n">AAPL_truncated</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">AAPL_truncated</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">AAPL_truncated</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">midpoint</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Midpoint&#39;</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">vlines</span><span class="p">(</span><span class="n">date2num</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">12</span><span class="p">)),</span> + <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ax_aapl</span><span class="o">.</span><span class="n">get_ylim</span><span class="p">()[</span><span class="mi">1</span><span class="p">],</span> + <span class="n">color</span><span class="o">=</span><span class="s">&#39;g&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&#39;Earnings Release&#39;</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">AAPL_plot</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s">&#39;AAPL Midpoint Plot&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +eeSRR5g2bRp///vfl+lz0003MXr0aGbPns2gQYP4wQ9+AMDcuXPZe++9OfHEE5k9ezYnnXQSe+21 +F3Pnzq1xrKeffpqBAwcye/ZsTj311MpLF8477zx23nlnrrzySubPn8/ll1+ep3dCkiRJktSamERY +SUtmIzz88MMMHDiQXr161XiZwu23386oUaMYOHAga665JiUlJcv02Wuvvdhxxx1p164d559/Pk89 +9RQzZ87kvvvuY8CAAYwYMYI2bdpwyCGHsMkmm3DPPffUGFPfvn056qijiAiOPPJIPvjgAz788MN8 +v3RJkiRJUivVLAsr5qkuIatSmuCwww5jl1124Z133uGII47IxbVsYLNmzWLrrbeufNy3b99lkg19 ++vSpvL/WWmvRpUsXZs2axaxZs+jbt+9Sffv27cvMmTNrjKmoqKjy/pprrgnAJ598Qvfu3Vfw1UmS +JEmStKxmORMhpfzcVsV6661H//79eeCBB/je975Xa7+ePXvy3nvvVT5+9913l0k2VN3+ySefMHfu +XHr16kWvXr0oKytbqu+MGTNYd911VzjefK0IIUmSJElqvZplEqGpGD9+PP/4xz8qz/rXdDnD8OHD +mTBhAlOnTmXhwoX86le/WqbP/fffz5QpU/j8888555xzGDJkCOuuuy577rkn06ZN45ZbbmHRokXc +euutTJ06lX322WeFY+3Rowdvv/32ir9ISZIkSZJyTCKsoKpn9Pv3789WW21V47Yl9thjD0488UR2 +3XVXBgwYwLBhw5bpM2LECEpKSujWrRv//ve/ueGGGwDo2rUr9957L2PGjGGdddZhzJgx3HfffXTp +0qXW8WqL9YQTTuD222+nW7dunHjiiSv2oiVJkiRJAqKms+eNMnBEqmnsiKjxjH5LNWrUKPr06VPj +DAWtutb2eWoOojRIo/03kZYn9/8ur0NrBLUdj0iSWjePWWs/HnEmgiRJkiRJqheTCAVmwUOpHiZM +KHQEkiRJkmimSzy2JOPHjy90CFLTV22VEkmSJEmF4UwESZIkSZJULyYRJEmSJElSvZhEkCRJkiRJ +9WISQZIkSZIk1YtJBEmSJEmSVC8mEZqwyZMnM3DgwEKHsUKGDh3qihOSJEmS1EKZRFhB/fr1o337 +9nTs2JEOHTrQsWNHjj/++AYZa6eddmLq1KkNsu/aXHfddbRt25aOHTvSuXNnBg8ezH333deoMUiS +JEmSmqY6kwgRMS4iKiLipSptF0fE1Ih4ISL+EhEdq2w7MyKm5bbv1lCBF0pEcN999zF//nwWLFjA +/Pnzufzyy1d4P4sWLWqA6PJjhx12YP78+cybN4/jjjuOQw45hPnz5xc6LEmSJElSgdVnJsK1wO7V +2h4CNkspbQlMA84EiIhNgeHAQOC7wNiIiPyF2zSklGpsf/vttxk2bBjrrLMO3bt357DDDlvqx3f/ +/v25+OKLGTRoEGuvvTaLFi2if//+/Pa3v2XQoEF06dKFQw89lM8//xyAxx57jD59+iz1/Nr6Alx8 +8cX06tWL3r17M27cONq0acPbb78NwP33389mm21Gx44d6dOnD5deemm9Xuvhhx/Op59+yrRp0yrb +nnrqKXbccUe6dOnC4MGDeeyxx2p9/vjx49l0003p1q0b3/3ud5kxY0blthNPPJH11luPTp06sc02 +2zB58uTKbc888wzbbLMNnTp1omfPnpxyyikrNb4kSZIkKX/qTCKklCYDc6u1/T2ltDj38Cmgd+7+ +vsAtKaUvU0plZAmGbfMXbtOWUuKss86ivLycqVOn8v7771NSUrJUn1tuuYUHHniAefPmsdpqqwFw +++2389BDD/HOO+/w4osvMmHChMr+1XMwtfWdOHEil112Gf/4xz+YPn06kyZNWuq5Rx99NNdccw3z +58/nlVdeYdddd63z9SxatIjx48ez+uqr07dvXwBmzZrF3nvvzbnnnsvcuXMZM2YMBx54ILNnz17m ++XfffTcXXnghd911Fx999BE777wzhx56aOX2bbfdlpdeeom5c+cyYsQIDj744MqkyAknnMCJJ57I +xx9/zFtvvcXw4cNXeHxJkiRJUn7loybCUcD9ufvrAu9V2TYz19ai7L///nTt2pUuXbrQtWtXxo0b +B8AGG2zAsGHDaNu2Ld26deOkk05a5iz5CSecQK9evVhjjTWWauvRowedO3dmn3324YUXXqh17Nr6 +3n777YwaNYpNNtmEr33ta5SUlCw1Y2L11Vfn1VdfZcGCBXTq1Iktt9yy1jGefPJJunbtypprrslp +p53GDTfcwDrrrAPADTfcwF577cXuu2eTU4YNG8bWW2/N/fffv8x+rrrqKs4880wGDBhAmzZtOOOM +M3jhhRd4773sIzJixAg6d+5MmzZtOOmkk/jss8944403KuOdPn06s2fPpn379my77bYrPL4kSWoY +VU94SJJal1VKIkTEL4EvUko35yme+o1bGnm5ray7776bOXPmMHfuXObMmcMPf/hDAD788EMOPfRQ +evfuTefOnTnssMP4z3/+s9Rze/fuvcz+evToUXm/ffv2fPLJJ7WOXVvfWbNmLXXpQ9X7AH/5y1+4 +77776Nu3L0OHDuWpp56qdYztt9+eOXPmMG/ePPbdd1/++c9/Vm579913ue222+jatWtlIuWJJ56g +vLx8mf28++67nHDCCZV9u3XrRkQwc+ZMAMaMGcOmm25Kly5d6NKlC/Pnz698v8aNG8cbb7zBJpts +wnbbbVdZ3LG28T/44INaX48kSa1JY/zALysra/AxMFEhSU1S25V9YkSMBPYEqs6LnwlU/fXaO9dW +o6pT/YuLiykuLq7X2Gl0zTUJGkttNRHOOuss2rRpw6uvvkqnTp24++67+fnPf75Un4YqEdGzZ0/e +f//9ysczZsxYaqxvfvOb3HXXXSxatIgrrriC4cOHL1WfoCbt27dn7NixrL/++vzwhz9k0KBB9OnT +hyOOOIKrrrqqzpj69OnD2WefvdQlDEtMnjyZSy65hEcffZRNN90UgK5du1a+txtssAE33XQTkCVA +DjroIObMmbNC40tSczFp0iQmTZpU6DDUQjTKD/zG0FJehyS1MPWdiRC5W/YgYg/gVGDflNJnVfr9 +DTgkIlaPiP7AhsDTte20pKSk8lbfBEJTtmDBAtZee206dOjAzJkzueSSSxpt7OHDh3Pttdfy+uuv +s3DhQs4777zKbV988QU33XQT8+fPZ7XVVqNDhw6V9Rjq0qVLF4455hhKS0sBOOyww7jnnnt46KGH +WLx4Mf/73/947LHHmDVr1jLPPfbYY7ngggt47bXXAPj444+54447gOy9ateuHd26dePzzz/nV7/6 +FQsWLKh87o033lg5K6FTp05EBG3atFmh8SWpuSguLl7qO1GSJKmpqs8SjzcBU4ABETEjIkYBVwBr +Aw9HxPMRMRYgpfQacBvwGlmdhJ+k2k7bN2P77LMPHTt2rLwdeOCBAIwePZrnnnuusl7BkvYlapqF +sCIzE5bXd4899uD4449n6NChDBgwgO233x6gsvbC9ddfT//+/encuTNXX3115Vn++jjhhBN44IEH +eOWVV+jduzd33303F1xwAV//+tfp27cvY8aMYfHixcvEuP/++3PGGWdwyCGH0LlzZ7bYYgsmTpwI +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 +kCSpOkciSJIkSZKknJhEkCRJkiRJOTGJIEmSJEmScmISQZIkSZIk5cQkgiRJkiRJyolJBEmSJNXp +0UcfpX///oUOo0GGDBnijhOS1EhMIkiSJLUwffr0oWPHjnTq1Ikdd9yRTp06cf755zdKW1/4whdY +sGBBo7x2XaZOnUr79u3p1KkTXbp0Yb/99mPmzJlNGoMkqXbtCx2AJEmSGiYimDlzJkOGDNmq11m/ +fj3t2rXLU1T59a//+q/8+c9/BuCXv/wlp556KkuXLqVTp04FjkyS2jZHIkiSJLVAKaVay998802G +Dh1K9+7d6dGjByNGjGDNmjVV5/v27cu1117LgAED2GGHHVi/fj19+/bl+uuvZ8CAARQXF3Paaafx +0UcfATB37lx69+5d4/q66gJce+219OzZk169ejFx4kSKiop48803AZg1axZ77703nTp1onfv3txw +ww05vdczzjiDf/7zn7z++utVZU8++SSHHHIIxcXF7LfffsydO7fO6ydNmsRee+1Ft27dOProo1my +ZEnVuTFjxrDrrrvSuXNnBg0axKOPPlp17umnn2bQoEF07tyZnXfemQsvvHCL2pek1sQkgiRJUiuS +UuLSSy9l+fLlLFiwgL/+9a+MGzeuRp3bb7+d2bNn8+6771aNRJg+fTr3338/b731Fi+++CJTpkyp +qh8RNa6vq+6cOXP4yU9+wkMPPcQbb7xBRUVFjWu//vWv86tf/Yo1a9Ywf/58jjjiiHrfz/r165k0 +aRIdOnSgrKwMgGXLlnHcccdx+eWXs3r1aiZMmMBXv/pVVq5cucn1M2bM4JprruHuu+/mnXfe4dBD +D+W0006rOj948GBeeuklVq9ezfDhwznllFOqkiKjR49mzJgxvPfee/zlL39h2LBhDW5fklobkwiS +JEkt0EknnUTXrl0pLi6ma9euTJw4EYDdd9+doUOH0r59e7p168YFF1ywyafko0ePpmfPnmy77bY1 +ykpKSujSpQvHH388L7zwQp1t11V3+vTpjBo1ij333JPPfOYzjBs3rsaIiQ4dOvDKK6+wdu1aOnfu +zOc///k623jiiSfo2rUr2223Hd/73ve49dZb6d69OwC33norxx57LEceeSQAQ4cO5YADDmDWrFmb +vM7NN9/MJZdcQr9+/SgqKuLiiy/mhRde4O233wZg+PDhdOnShaKiIi644ALWrVvHwoULq+J94403 +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 +TkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Given these charts, we can see that FB was trending down for the four days preceding the earnings release, and AAPL was trending down for a whopping 8 days (we don't count the peak day). This will define the methodology that we will use for the study.</p> +<p>So what are the results? For a given horizon, how well does the market actually perform?</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[7]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># Read in the events for each stock;</span> +<span class="c"># The file was created using the first code block in the Appendix</span> +<span class="kn">import</span> <span class="nn">yaml</span> +<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="k">import</span> <span class="n">parse</span> +<span class="kn">from</span> <span class="nn">progressbar</span> <span class="k">import</span> <span class="n">ProgressBar</span> + +<span class="n">data_str</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> +<span class="c"># Need to remove invalid lines</span> +<span class="n">filtered</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="s">&#39;{&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">x</span><span class="p">,</span> <span class="n">data_str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">))</span> +<span class="n">earnings_data</span> <span class="o">=</span> <span class="n">yaml</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">filtered</span><span class="p">))</span> + +<span class="c"># Convert our earnings data into a list of (ticker, date) pairs</span> +<span class="c"># to make it easy to work with.</span> +<span class="c"># This is horribly inefficient, but should get us what we need</span> +<span class="n">ticker_dates</span> <span class="o">=</span> <span class="p">[]</span> +<span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">date_list</span> <span class="ow">in</span> <span class="n">earnings_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="k">for</span> <span class="n">iso_str</span> <span class="ow">in</span> <span class="n">date_list</span><span class="p">:</span> + <span class="n">ticker_dates</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ticker</span><span class="p">,</span> <span class="n">parse</span><span class="p">(</span><span class="n">iso_str</span><span class="p">)))</span> + +<span class="k">def</span> <span class="nf">does_trend_down</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="c"># Figure out if the `event` has a downtrend for</span> + <span class="c"># the `horizon` days preceding it</span> + <span class="c"># As an interpretation note: it is assumed that</span> + <span class="c"># the closing price of day `event` is the reference</span> + <span class="c"># point, and we want `horizon` days before that.</span> + <span class="c"># The price_data.hdf was created in the second appendix code block</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="p">]</span> + <span class="n">midpoints</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> + + <span class="c"># Shift dates one forward into the future and subtract</span> + <span class="c"># Effectively: do we trend down over all days?</span> + <span class="n">elems</span> <span class="o">=</span> <span class="n">midpoints</span> <span class="o">-</span> <span class="n">midpoints</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="o">.</span><span class="n">dropna</span><span class="p">()[</span><span class="n">elems</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="c"># If the stock doesn&#39;t exist, it doesn&#39;t qualify as trending down</span> + <span class="c"># Mostly this is here to make sure the entire analysis doesn&#39;t </span> + <span class="c"># blow up if there were issues in data retrieval</span> + <span class="k">return</span> <span class="k">False</span> + +<span class="k">def</span> <span class="nf">study_trend</span><span class="p">(</span><span class="n">horizon</span><span class="p">,</span> <span class="n">trend_function</span><span class="p">):</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="n">horizon</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> + <span class="n">invalid_events</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">ticker_dates</span><span class="p">):</span> + <span class="k">if</span> <span class="n">trend_function</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">event_data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="o">+</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">)][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">five_day_events</span><span class="p">,</span> <span class="n">event_data</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> + <span class="c"># Sometimes we don&#39;t get exactly the right number of values due to calendar</span> + <span class="c"># issues. I&#39;ve fixed most everything I can, and the few issues that are left</span> + <span class="c"># I assume don&#39;t systemically bias the results (i.e. data could be missing</span> + <span class="c"># because it doesn&#39;t exist, etc.). After running through, ~1% of events get</span> + <span class="c"># discarded this way</span> + <span class="n">invalid_events</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">))</span> + + + <span class="c"># Remove our initial zero row</span> + <span class="n">five_day_events</span> <span class="o">=</span> <span class="n">five_day_events</span><span class="p">[</span><span class="mi">1</span><span class="p">:,:]</span> + <span class="n">plot_study</span><span class="p">(</span><span class="n">five_day_events</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&#39;Action over {} days: {} events&#39;</span> + <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">horizon</span><span class="p">,</span><span class="n">five_day_events</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + +<span class="c"># Start with a 5 day study</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:21:38 Time: 0:21:38 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +NXU1G9arJ1QDUD2hesN63or/vkbedfQGXovky/dZkrqujl6PGDSopPw9SeruYnKQLu56/44ZNHQe +r0Xy5fssSV1XR69HnKNBkiRJkiSVjEGDJEmSJEkqGYMGSZIkSZJUMgYNkiRJkiSpZAwaJEmSJElS +yZTnXYAkSVJ3MH78eCK88cf2Nn78+LxLkCRto24dNJTivufd4d7pkiQpf3V1dXmXIElStxBd7T7F +b/be1aW473lXvXd6Z/vsZz/L2LFj+frXv77Vr/Xe15K6u676f0FH71utbbe5axFJknq7jl6POEdD +CUyYMIF+/fqxatWqTfZPnDiRQqHAggULSn7O+vp6zjzzTIYNG8aoUaP44he/WLI6r7rqqjcVMkiS +JEmSZNBQAhHBLrvswm9/+9sN+2bNmsVrr7223cZyXn/99cyYMYO6ujqee+45TjnllC5ZpyRJkiSp +dzFoKJGPf/zj3HDDDRu2b7jhBj7xiU9s0uaOO+7goIMOorKykvHjxzN58uQNz918883suuuurF27 +FoA777yT0aNHs3LlynbPV1FRQWVlJUOGDKF///684x3vKFmdZ599Nt/85jcBuPfeexk3bhw/+tGP +2GmnnRgzZgzXX399h84lSZIkSep9DBpK5IgjjuDll1/mqaeeorm5md/97nd87GMf22S+gkGDBvHr +X/+al156idtvv52f/exn/PnPfwbgwx/+MEcddRSf//znWbVqFZ/61Ke47rrrGD58eLvnO+igg3jw +wQeZNGlSyetsa9myZbz88sssWbKEX/ziF5x77rm89NJLW3VeSZIkSVLv0K3vOtFWTM63+39Lb4F3 +vOMd7L333uy8886bPH/00UdvWN9vv/047bTTuPfeeznppJMAuPzyy9l///2prq7m5JNP5oQTTmj3 +PKtXr+akk07i9ttv5+KLLyYiuPjiiwEYN24cd911F/vuu++brrOtPn36cNFFF1EoFDjhhBMYNGgQ +Tz31FIcddliH3hdJkiRJUu9RkqAhIo4HLiXrIXFtSumSNs8PAf4bqALKgB+mlK4vxblbK8VdJ7bF +xz72MY4++miee+45zjzzzNc9/9BDD/HVr36VWbNmUV9fT319PR/60Ic2PF9ZWcmHPvQhfvzjH3PL +Lbds9jz/8z//wz777MN73vMeDjnkEI4++mgigk984hM0NTVtMWToSJ1tDR8+nEJhY+eXAQMGbBji +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>When a stock has been trending down for 5 days, once the earnings are announced it really doesn't move on average. However, the variability is <em>incredible</em>. This implies two important things:</p> +<ol> +<li>The market is just as often wrong about an earnings announcement before it happens as it is correct</li> +<li>The incredible width of the min/max bars and standard deviation area tell us that the market reacts <em>violently</em> after the earnings are released.</li> +</ol> +<p>Let's repeat the same study, but over a time horizon of 8 days and 3 days. Presumably if a stock has been going down for 8 days at a time before the earnings, the market should be more accurate.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[8]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># 8 day study next</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:29 Time: 0:20:29 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +XlrzW/yEisVmdls9x70TSIocey7ben8ATMT/O3h5J/sXbLd/tOifzePAXDN7HjgImBp53bdFjici +IhJ3LPL3WkRERKRBIvM9fAUM1RwDIiIiAuq5ICIiIo1gZifgexU8oGBBREREaqnngoiIiIiIiIg0 +iXouiIiIiIiIiEiTKFwQERERERERkSZRuCAiIiIiIiIiTaJwQURERERERESaROGCiIiIiIiIiDSJ +wgURERERERERaRKFCyIiIiIiIiLSJAoXRERERERERKRJFC6IiIiIiIiISJMoXBARERERERGRJlG4 +ICIiIiIiIiJNonBBRERERERERJpE4YKIiIiIiIiINInCBRERERERERFpEoULIiIiIiIiItIkChdE +REREREREpEkULoiIiIiIiIhIkyhcEBEREREREZEmUbggIiIiIiIiIk0Sk3DBzE41swVmtsjMbqjn +8Uwze8vMZpvZXDO7LBbnFRERkfjTgHbHxWb2VWT5zMwGN/S5IiIismfMOde0A5iFgEXACUApMA0Y +6ZxbELXPH4BM59wfzKwrsBDo7pyrbtLJRUREJK40sN1xFDDfOVdmZqcCY51zRzXkuSIiIrJnYtFz +4QhgsXNumXOuCngJOGu7fRzQMbLeEVitYEFERET2wG7bHc65Kc65ssjdKUDvhj5XRERE9kwswoXe +wLdR979j2x/xWg8BA82sFPgKuC4G5xUREZH405B2R7QrgHf38LkiIiLSQIktdJ5TgFnOuZ+a2T7A +v8xssHNu4/Y7mlnTxmmIiIi0U845C7qGtsTMfgKMAY5r5PPUFhEREdmJnbVHYhEulAD9ou73iWyL +Nga4K1LIEjMrBA4Aptd3wKbOAyGxNXbsWMaOHRt0GRIA/e7jl373rY+ZcoWIhrQ7iEzi+DhwqnNu +bWOeC2qLtEZ6X4pf+t3HL/3uW59dtUdiMSxiGrCvmeWYWTIwEnhru32WASdGiukO7AcsjcG5RURE +JL7stt1hZv2AicAo59ySxjxXRERE9kyTey4452rM7DfA+/iw4inn3Hwzu8o/7B4H7gSeMbM5kadd +75xb09Rzi4iISHxpYLvjVqAz8Ij5r1iqnHNH7Oy5Ab0UERGRdiUmcy445yYB+2+37bGo9eX4eRek +DcrLywu6BAmIfvfxS797ac0a0O64Eriyoc+VtkHvS/FLv/v4pd9922KtbUyhmbnWVpOIiEjQzEwT +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 +AAAAKMr/B9pAH9lY/+K6AAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>However, looking only at stocks that trended down for 8 days prior to a release, the same pattern emerges: on average, the stock doesn't move, but the market reaction is often incredibly violent.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[9]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="c"># 3 day study after that</span> +<span class="n">study_trend</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">does_trend_down</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:26 Time: 0:26:26 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABBAAAAGNCAYAAACopYLKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VPW9//HXNwmBsG+yCglK61q3IqK4pGhde9XbuqAo +1NZbu9rltpVra4FeH636u7e1rXa71aptXVBxRZEqBBAVEEVFRVFBBFzKThDI9v39MQMGCCTAJCeZ +eT0fj3HOnPOdcz5nIsk57/me7wkxRiRJkiRJknYlL+kCJEmSJElS82eAIEmSJEmS6mWAIEmSJEmS +6mWAIEmSJEmS6mWAIEmSJEmS6mWAIEmSJEmS6mWAIElqsUII54YQakIIn25A21EhhF61Xv85hHBg +41aYGSGE/iGEuSGEF0IIr4QQrmjAe4pDCK80RX3p7X0nhPB6ur7r0vOODiG8WOtxbq32U0MIC9Lz +XwghdE/PHxVC+Cg974UQwleaah+2259zWsr/H5IkNZWCpAuQJGkvDAdmABcB4+pp+2VgPvABQIzx +a41a2V4IIeTHGKtrzVoODIkxVoYQ2gKvhhAeijF+UM+qYuNV+YkQQinwb8BnYoxVW8IA4BXgszHG +mnR481II4eEYY016+UUxxhfrWOXdMcYrG7/yXToXeBRYkHAdkiQ1G/ZAkCS1SCGEdsBQ4KukAoTa +y64KIbyc/nb7FyGELwGDgL+nv9Vuk/4G/Kh0+4vS7V/e8u15ev76EMK1IYR5IYRnQgj71FFHlxDC +AyGEl9JtDg0pi0IIHWu1ezOEsE8IoXsI4b4Qwqz049j08jEhhDtCCE8Dd9TeRoyxKsZYmX5ZBISd +fCafTdf6IvCtWvOLQwjTQwjPpx9D0vNvDyGcXavd30MI/xZCODhd2wvp9e1fz4/jG8B1McaqdL0r +0s+baoUFRUDNdu/b2XFInfu33b6OqFXjH0IIeSGEK0IIN9RqMyqE8NudtA/p+Tv8jNM/k7OBG9Lt +B4QQrgwhvJpud2d99UmSlI0MECRJLdU5wKQY41vAihDCkQAhhNNJfRt+dIzxSOCGGOP9wBzg4hjj +UTHGTVtWEkLoDVwHlAJHAEfXOqluBzwTYzyCVE+H/6ijjnHACzHGw4GfAH+LMUbgQeDf09sYDCyO +Mf4L+A3wqxjjMcB5wC211nUQMCzGOGL7jYQQ9g0hvAS8C1y/k94HtwLfSu93bR8Bp8QYB5HqtfG7 +9PxbgMvS6+8IHAtMBL4O3BhjPIpU8LI03WZiqHUZSC2fBk4MITyXDmYG1ap7cAhhPvAS8PVagQLA +bekT9J9ut74vpgOZ8SGEfev4LA4ELgSOS9dYA1wM3E/6M0+7ELh7J+23fMY7/IxjjM8CDwM/Sv// +sgi4Cjgi3e7rdXwGkiRlPQMESVJLdRFwd3r6Hj7phXAK8NcY42aAGOOa9PxA3d9sHw1MjTGuSp/c +/gM4Mb2sIsb4WHp6LlBSx/uPB/6W3tZUoGsIoT0wntTJOunne2rVd1O6l8DDQPv0ZQkAD8cYK+ra +2Rjj0nRIMRD48va9IUIInYBOMcaZ6Vl/q7W4FfCXEMLLwL2kggpijNOBgSGEbqQ+v/vTn8GzwE9C +CD8CSmp9lmftJLgoALrEGIcAP07v+5a6Z8cYDyX1OV8dQihML7o4xvgZ4ATghBDCJVs+g/Q2Dwee +BG6vY3snA0cBc9Kf4zBgv3TPh7fToUVX4IAY4zM7aT8gva6G/IwhFYDcGUIYAVTvpI0kSVnNMRAk +SS1OCKELqZPAQ0MIEcgndb3/j/d0lTuZX1lrupq6/25uP85AAIgxPhtC2D+kxgM4F/h5reXH1Lok +ITUz1aN+Q32Fxhg/SH+jfwIwob72ad8HPogxHhZCyAc21lp2B3ApqZDjy+lt3BVCeA74AvBYCOFr +McayXaz/vS21xBjnhNTAlt1ijCtr1f1GCKEcOJRUj4330/M3pC8JGAz8Pca4utZ6/wLcwI4CcHuM +8Sd1LLubVG+DBcADDWhfO7DZ2c8Y4CxSwdLZpMKVQ7frTSFJUtazB4IkqSU6H7gjxjggxrhfjLEY +WBRCOB74J3BZCKEItoYNAOuAjnWsazap7vdd0yfXFwFlu1HLDOCS9LZKgX/FGMvTyx4AfgW8Vqsn +xGTgu1veHEI4vL4NhBD6hhDa1Nqf44E3areJMa4F1oQQjkvPuqTW4k7A++npkaQCly1uB76XWkVc +kN7GgBjjohjj74CHgMPqKfFBUoEOIXVHjFYxxpUhhJL0Z0oIoRg4AFgcQshP93oghNCKVFAxP/26 +9iUS5wCv1bG9p4DztvTCCKlxKPrXquUcUoHI3bto3y+9bGfh0XrS/7+kx0voH2OcBoxOz29fz2ci +SVLWMUCQJLVEF/LJt8tbTCA1qv8TwCPA8yGEF4D/TC+/Hfhj+pr7NqR7DqS75I8mFRq8CDwfY3w0 +/Z6G3MVgHPDZ9PgEvwBG1Vo2ntS19nfXmvddYFD6Gv/5QL23ZCR1ycGsdPf7qaTGdXi1jnZfAX6f +3u/atf+e1GUPL5Iar2BrT4cY40fA68Bfa7W/IIQwP93+ENKDOu5iDIS/AvuF1G0j7yQVUkAq6Hgp +Xc/9wDdijKuA1sATIYR5wAukxlj4v/R7rqy17W+T7hVRW4zxdeCnwOT05z4Z6JVetia9P/1jjM/v +on3vLaurY38g9TP7UQhhLqnLRv6evgRkLvCbGOO6nbxPkqSsFVLjPEmSpFyUHn/hJeCoGOP6pOuR +JEnNlz0QJEnKUSGEk0ldIvBbwwNJklQfeyBIkiRJkqR62QNBkiRJkiTVywBBkiRJkiTVywBBkiRJ +kiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTV +ywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBB +kiRJkiTVywBBkiRJkiTVywBBkiRJkiTVywBBkiRJkiTVK2MBQgghL4TwQgjh4UytU5Ik5Y4Qwukh +hAUhhDdDCFfVsfyAEMIzIYRNIYQfbLdscQjhpRDCiyGE2U1XtSRJuaMgg+v6LvAa0DGD65QkSTkg +hJAH3AScDCwH5oQQHooxLqjVbCXwHeDcOlZRA5TGGFc3erGSJOWojPRACCHsC5wJ/CUT65MkSTln +MLAwxvhujLESuBs4p3aDGOOKGONcoKqO9we8NFOSpEaVqT+0vwZ+BMQMrU+SJOWWvsB7tV4vTc9r +qAj8M4QwJ4TwHxmtTJIkARm4hCGEcBbwYYxxXgihlNQ3AHW1M1yQJKkOMcY6/3ZqtwyNMb4fQtiH +VJDweozx6e0beTwiSVLdGnI8kokeCEOBs0MI7wB3AZ8LIdyxk4Ky+jFmzJjEa3Af3Uf30X3Mpkcu +7KO2Wgb0r/V63/S8Bokxvp9+/hfwAKlLInbWNqsfufDvxn3Mjof7mB0P9zE7Hg211wFCjPHqGGP/ +GON+wHBgSoxx5N6uV5Ik5ZQ5wMAQQnEIoZDUMcWu7uy09VuSEELbEEL79HQ74FRgfmMWK0lSLsrk +XRgkSZL2SIyxOoTwbWAyqS84bokxvh5CuCK1OP45hNATeB7oANSEEL4LHAzsAzyQvjyhAPhHjHFy +MnsiSVL2ymiAEGOcBkzL5DpbktLS0qRLaHTuY3ZwH7OD+6hsE2OcBByw3bw/1Zr+EOhXx1vLgSMa +t7qWIxf+3biP2cF9zA7uY24Ju3O9w15tKITYVNuSJKmlCCEQHUSxyXg8IknSjhp6PJL4JQwlJSW8 +++67SZehehQXF7N48eKky5AkqVF4PNI0PJ6QpJYt8R4I6aSjSWrQnvPnJEmNwx4ITcvjkWT5OUtS +89TQ45FM3MZRkiRJkiRlOQMESZIkSZJULwMESZIkSZJULwMESZIkSZJULwMESZIkSZJUr8Rv41iX +n/3sRpYsWdNo6+/fvzM///n3Gm39TeGyyy6jX79+/PznP0+6FEmSspLHI/XzeESSckuzDBCWLFlD +ScnYRlv/4sWNt26Am2++mdtuu41XXnmFiy++mFtvvbVRtydJkjLP4xFJkrblJQy74frrr29Qu759 ++3LNNdfw1a9+tZErkiRJucbjEUlSUgwQdsPmzZsb1O7cc8/l7LPPpmvXrvW2vf7669l3333p2LEj +Bx10EFOnTq2z3YsvvshnP/tZOnXqxPDhw9m0adNu1S5JkrKDxyOSpKQYIOyGGGNG1/fmm29y8803 +M3fuXNatW8cTTzxBSUnJDu0qKyv593//d0aNGsWqVas4//zzuf/++zNaiyRJahk8HpEkJaVZjoHQ +XLz99tvcd999hBCIMTJz5kxuuOEGYoyEEDjmmGM46aST9nj9+fn5VFRUMH/+fLp160b//v3rbPfc +c89RVVXFlVdeCcCXvvQljj766D3eriRJajk8HpEkNRcGCLuw//77c9VVV219vXnzZn784x9ndP03 +3ngjY8eO5bXXXuO0007jf//3f+ndu/c27ZYvX07fvn23mVdcXJyxOiRJUvPl8YgkqbnwEoaEDR8+ +nBkzZvDuu+8CMHr06B3a9O7dm2XLlm0zb8mSJU1Sn6TmpWxxGWPLxjK2bCylt5VunS5bXJZ0aZJa +MI9HJEkNYQ+E3dDQaw6rq6uprKykurqaqqoqNm/eTEFBAfn5+du0e/PNN1m2bBlDhw6lsLCQoqIi +ampqdljfscceS0FBAb/73e/4xje+wcMPP8zs2bMZNmxYRvZLUstRWlJKaUkpAGFcoOzLZYnWI6np +eTwiSUpKswwQ+vfv3Kj3Ru7fv3OD2r3xxhvcfffdW685nDZtGj//+c+3XnN47LHH8vnPf36H9117 +7bWMGzeOEAIA//jHPxgzZgw/+9nPtmm3efNmRo8ezYIFC2jVqhXHHXccf/7znwE488wzOfHEExk9 +ejStWrViwoQJXH755fz0pz/lzDPP5Etf+tI266rdXpIk7T2PRzwekSRtK2R6JN+dbiiEWNe2tvwx +VPPmz0lqfsK4QBzjv8uWLv37NSRdR67weCRZfs6S1Dw19HjEMRAkSZIkSVK9DBAkSZIkSVK9DBAk +SZIkSVK9DBAkSZIkSVK9DBAkSZIkSVK9DBAkSZIkSVK9CpIuQJIkKWnFxcWE4N00G1txcXHSJUiS +9kKzDBDKFpdRtrhs63RpSSkApSWlW6ebYh2SJCk3LF68OOkSJElq9kKMsWk2FEKsa1shBHZVQxgX +iGP2rsZMrCMbfOMb32DfffflJz/5yW6/t76fk6Sm5++27JD+/epX301kZ8cjkiTlsoYejzgGwi6U +lJTQpk0bVq1atc38I488kry8PJYsWZLxbVZUVDBy5Ei6du1Kr169+P73v5+xOv/whz/sUXggSZIk +SZIBwi6EEBgwYAB33XXX1nnz589n48aNjXad5G233ca8efNYvHgxixYt4txzz22WdUqSJEmScosB +Qj0uvfRSbr/99q2vb7/9dkaNGrVNm8cee4yjjjqKTp06UVxczLhx47YuGz9+PPvttx/l5eUAPP74 +4/Tu3ZuVK1fWub1WrVrRqVMnOnbsSFFRESeddFLG6rzsssv42c9+BsC0adPo168fv/rVr+jZsyd9 ++/bltttua9C2JEmSJEm5xwChHkOGDGH9+vW88cYb1NTUcM8993DJJZdsMx5A+/bt+dvf/sbatWuZ +OHEif/zjH3n44YcBuOCCCxg6dChXXnklq1at4vLLL+fWW2+lW7dudW7vqKOO4rnnnmPs2LEZr3N7 +H3zwAevXr2f58uX85S9/4Vvf+hZr167dre1KkiRJknJDs7wLw/bCuGS74W/5dv+kk07ioIMOok+f +PtssP/HEE7dOH3rooQwfPpxp06Zx9tlnA3DTTTdx2GGHUVpayjnnnMMZZ5xR53ZWr17N2WefzcSJ +ExkzZgwhBMaMGQNAv379mDRpEocccsge17m9wsJCrrnmGvLy8jjjjDNo3749b7zxBoMHD27Q5yJJ +kiRJyh0tIkDIxF0Y9sYll1zCiSeeyKJFixg5cuQOy2fNmsV//dd/MX/+fCoqKqioqOD888/furxT +p06cf/75/PrXv2bChAk73c69997LwQcfzKmnnsqgQYM48cQTCSEwatQoqqurdxkeNKTO7XXr1o28 +vE86obRt23brpRaSJEmSJNXmJQwN0L9/fwYMGMDjjz/OF7/4xR2WjxgxgnPPPZdly5axZs0arrji +im0uHZg3bx633norF110Ed/5znd2up2qqioqKysB6Nq1K08++SS33XYbp512Gj/84Q/3uk5JkiRJ +kvaUAUID3XrrrUyZMoWioqIdlpWXl9OlSxdatWrF7NmzufPOO7cu27RpE5deeinXXXcdt956K8uX +L+cPf/hDnds488wzmTNnDv/3f/9HVVUV+fn5HHfccSxcuJC2bdvudZ2SJEmSJO0pA4RdqH0LxAED +BnDUUUfVuez3v/8911xzDZ06deLaa6/lwgsv3Lrs6quvpri4mK997WsUFhbyt7/9jWuuuYa33357 +h+2VlJTw+OOPc/vtt9OtWzeOPPJIevXqxdSpU7nqqquYPHnyXtW5O/srSZIkSVJtYVej9Gd0QyHE +urYVQtjlnQLCuJCRMRD2dh25rr6fk6Sm5++27JD+/WqC20R2djwiSVIua+jxSLMMEMoWl1G2uGzr +dGlJKQClJaVbp+uTiXXoEwYIUvNjgJAdDBCalgGCJEk7atEBgpoff05S82OAkB0MEJqWAYIkSTtq +6PGIYyBIkiRJkqR6GSBIkiRJkqR6GSBIkiRJkqR6GSBIkiRJkqR6FSRdQHFxMSE4dlRzV1xcnHQJ +kiRJkqQEJR4gLF68OOkSJEmSJElSPbyEQZIkSZIk1SvxHgiSJNVWtriMssVlW6dLS0oBKC0p3Tot +SZKkphdijE2zoRBiU21LknJBGBeIY7L792pO7GMIxBgdDKiJeDwiSdKOGno84iUMkiRJkiSpXgYI +kiRJkiSpXgYIkiRJkiSpXgYIkiRJkiSpXgYIkiRJkiSpXgYIkiRJkiSpXgVJFyBJkiRJUlOJMbJ5 +82Y2bdrE5s2bt5ne8rxhwybKyzezfv0mKioqOO+80+jatWvSpSfOAEGSJEmS1CLU1NTs9KR/06ZN +bNq07cn/hg2bKS/fxMcfp+Zv3LiZTZsqgEJCaE0IbYDWQBtibE2MqecQWlNQ0JH8/NaUlz/LsGGr +DBAwQJAkSZIkNYGampo6T/prn/yXl2856f9kesOGTwKAzZsr0yf+n5z8x7htABBCGwoKOlNQ0JqC +gjbk56eeCwtb07ZtG/LzCwmh4VfzL136SqN9Ji3NXgcIIYTWwHSgML2++2KM4/Z2vZIkKbeEEE4H +biQ1RtMtMcbrt1t+APBX4Cjg6hjjrxr6XklS5tXU1PDWW2+xevVqNm7ctPWkf8vzxx+nnjduTJ38 +V1RUAa3Jy0ud+IfQZoeT/7y8thQUdN160r8lBNj25D8kvOe5a68DhBjj5hDC52KMH4cQ8oGZIYTH +Y4yzM1CfJEnKASH1VdBNwMnAcmBOCOGhGOOCWs1WAt8Bzt2D90qSMqSmpoaXX36FCRNm8O67rQmh +LzG2IT+/HQUF3Xb45r9Nm9a0a9fak/8skJFLGGKMH6cnW6fXGTOxXkmSlDMGAwtjjO8ChBDuBs4B +toYAMcYVwIoQwhd2972SpL1XVVXFvHkvcf/9T7N8eSc6dz6TkpIBhgI5JCMBQjr5nwvsD9wcY5yT +ifVKkqSc0Rd4r9brpaSCgcZ+rySpHpWVlTz//Avcf/9M/vWvHnTpci4DBhQnXZYSkKkeCDXAkSGE +jsCDIYSDY4yvbd9u7NixW6dLS0spLS3NxOYlSWoxysrKKCsrS7qMnObxiCQ1TEVFBbNmPc+ECc+w +evW+dO16IQMG9E26LGXAnh6PhBgze7VBCOEaYEPtgY3S82OmtyVJuSyMC8Qx2f17NSf2MQRijDnf +9zOEMAQYG2M8Pf16NBDrGgwxhDAGWL/lWGM33+vxiCTVY9OmTTz77GweeGAWa9eWsM8+J9C+fa+k +y0rM0qV/Z/ToIQwcODDpUhpNQ49HMnEXhu5AZYxxbQihCPg8cN3erleSJOWUOcDAEEIx8D4wHLho +F+1rH+Ts7nslSXX4+OOPmTHjOR5++Hk2bPgUPXpcRteu3ZMuS81IJi5h6A3cnh4HIQ+4J8b4WAbW +K0mSckSMsTqE8G1gMp/civH1EMIVqcXxzyGEnsDzQAegJoTwXeDgGGN5Xe9NaFckqcUpLy+nrOwZ +Hn30RTZtOpiePS9nn326Jl2WmqFM3MbxFVL3Y5YkSdpjMcZJwAHbzftTrekPgX4Nfa8kadfWrl3L +1KnP8NhjL1NZeRg9e36dNm06JV2WmrGMDKIoSZIkSWoZVq9ezZNPPs0TT7xGdfWR9O79LQoL2ydd +lloAAwRJkiRJygErVqzgiSdmMGXKQmIcRO/e36FVq7ZJl6UWxABBkiRJkrLYhx9+yOOPT2f69MWE +cAy9e59BQUGbpMtSC2SAIEmSJElZaNmyZUycOJ1nnllGQcFx9O17Dvn5hUmXpRbMAEGSJEmSssiS +JUt49NHpzJ79Ea1aHU+/fueRn98q6bKUBQwQJEmSJKmFizGyaNEiHnpoOvPmraV16+Pp3384eXme +8ilz/L9JkiRJklqoGCMLFy7kwQen8+qrmygqOoGSks8QQl7SpSkLGSBIkiRJUgsTY+S1117ngQem +s3BhpF27EykpOcjgQI3KAEGSJEmSWoiamhrmz3+VCROms2hRKzp0+BwlJZ8mhJB0acoBBgiSJEmS +1MxVV1fz0ksvc//9M1i6tD2dOp1GScn+BgdqUgYIkiRJktRMVVVVMXfui0yYMJMPPuhKly5nU1JS +bHCgRBggSJIkSVIzU1FRwezZc5kw4RlWruxN165fYsCAfkmXpRxngCBJkiRJzcTmzZt59tk5PPjg +c6xZ059u3S5mwIDeSZclAQYIkiRJkpS4jRs3MnPmLB58cDbl5fuzzz4jKSnpkXRZ0jYMECRJkiQp +IRs2bGDatGd55JG5bNx4ID16fJXu3bslXZZUJwMESZIkSWpi69ato6zsGSZOfImKikPp2fMKevbs +nHRZ0i4ZIEiSJElSE1mzZg1Tpszk8cfnU1V1BL16fZPWrTskXZbUIAYIkiRJktTIVq5cyT//+TT/ +/OcCamo+S+/e36awsF3SZUm7xQBBkiRJkhrJRx99xKRJMygre5sQBtOr15W0alWUdFnSHjFAkCRJ +kqQMizFy990PM3nyQvLzh9CnzxcoKGiddFnSXjFAkCRJkqQMe/vtt5k06T3697+S/PzCpMuRMiIv +6QIkSZIkKZvEGLn33im0bz/M8EBZxQBBkiRJkjLo9dcX8Prrke7dD0q6FCmjDBAkSZIkKUNqamoY +P34KnToNI4SQdDlSRhkgSJIkSVKGvPzyKyxaVETXrgOTLkXKOAMESZIkScqA6upqxo8vo0sXex8o +OxkgSJIkSVIGzJ37IsuWdaVz55KkS5EahQGCJEmSJO2lyspKxo+fTrduw5IuRWo0BgiSJEmStJdm +zXqef/2rDx079k26FKnRGCBIkiRJ0l7YvHkz9977ND162PtA2c0AQZIkSZL2wtNPP8fatfvTrl2P +pEuRGpUBgiRJkiTtoY0bNzJhwix69ixNuhSp0RkgSJIkSdIemjp1Jhs2HERRUdekS5EanQGCJEmS +JO2B8vJyHnpoLr16nZh0KVKTMECQJEmSpD3w5JMzqKg4nDZtOiVditQkDBAkSZIkaTetWbOGRx99 +md69T0i6FKnJGCBIkiRJ0m6aNGkaNTVHU1jYLulSpCZjgCBJkiRJu2HlypVMnvwGffocl3QpUpMy +QJAkSZKk3fDoo1MJ4VgKCtokXYrUpAwQJEmSJKmBPvjgA8rKFtOnzzFJlyI1OQMESZIkSWqghx+e +SkHB8eTnFyZditTkDBAkSZIkqQGWLl3KM898QO/eg5IuRUqEAYIkSZIkNcCECU/RuvVJ5OUVJF2K +lAgDBEmSJEmqx6JFi5g7dy09ex6edClSYgwQJEmSJGkXYozcd99TtG37OfLy8pMuR0qMAYIkSZIk +7cKbb77J/PmV9OhxaNKlSIkyQJAkSZKknYgxMn78FDp0+BwhhKTLkRJlgCBJkiRJOzF//qssXFhA +t24HJF2KlDgDBEmSJEmqQ01NDffcM5UuXU6294GEAYIkSZIk1WnevJdYsqQDnTsPSLoUqVkwQJAk +SZKk7VRVVXH33WV062bvA2kLAwRJkiRJ2s6cOXP58MOedOrUL+lSpGbDAEGSJEmSaqmoqGD8+Bns +s8+wpEuRmhUDBEmSJEmq5ZlnZrNqVTHt2/dKuhSpWTFAkCRJkqS0TZs2cd99z9Cz5+eSLkVqdgwQ +JEmSJClt+vRnKS//NG3bdk+6FKnZMUCQJEmSJGDDhg088MBsevUqTboUqVkyQJAkSZIkYMqUp9m0 +6TO0adM56VKkZmmvA4QQwr4hhCkhhFdDCK+EEK7MRGGSJCm3hBBODyEsCCG8GUK4aidtfhtCWBhC +mBdCOLLW/MUhhJdCCC+GEGY3XdWSssW6det45JF59Op1QtKlSM1WQQbWUQX8IMY4L4TQHpgbQpgc +Y1yQgXVLkqQcEELIA24CTgaWA3NCCA/VPp4IIZwB7B9j/FQI4RjgD8CQ9OIaoDTGuLqJS5eUJSZP +nk5V1VG0bt0h6VKkZmuveyDEGD+IMc5LT5cDrwN993a9kiQppwwGFsYY340xVgJ3A+ds1+Yc4A6A +GOMsoFMIoWd6WcBLMyXtodWrVzNp0mv07j006VKkZi2jf2hDCCXAEcCsTK5XkiRlvb7Ae7VeL2XH +LyS2b7OsVpsI/DOEMCeE8B+NVqWkrPTYY2XEOJhWrdomXYrUrGXiEgYA0pcv3Ad8N90TYQdjx47d +Ol1aWkppaWmmNi9JUotQVlZGWVlZ0mVko6ExxvdDCPuQChJejzE+XVdDj0ck1fbRRx/x1FNv0aeP +Q7kpd+yPePl1AAAgAElEQVTp8UiIMe71xkMIBcCjwOMxxt/spE3MxLYkSSlhXCCOye7fqzmxjyEQ +YwxJ15G0EMIQYGyM8fT069FAjDFeX6vNH4GpMcZ70q8XACfFGD/cbl1jgPUxxl/VsR2PRyRt45Zb +7uHZZ/ux777HJV2KmqmlS//O6NFDGDhwYNKlNJqGHo9k6hKGW4HXdhYeSJIk1WMOMDCEUBxCKASG +Aw9v1+ZhYCRsDRzWxBg/DCG0TfeEJITQDjgVmN90pTcfN90EN94Iq1YlXYnUMixfvpwZM5bSu/fR +SZcitQiZuI3jUGAEMCx966QXQgin731pkiQpV8QYq4FvA5OBV4G7Y4yvhxCuCCF8Ld3mMWBRCOEt +4E/AN9Nv7wk8HUJ4EXgOeCTGOLnJd6IZGDQI5syB/faDkSNh5kyww4W0cw8+OIXCwhPJz2+VdClS +i7DXYyDEGGcC+RmoRZIk5bAY4yTggO3m/Wm719+u432LSA3inPOGDEk9VqyA226Dyy6D1q3hiivg +0kuhU6ekK5Saj3fffZdZs1ZQXHxR0qVILYa3O5IkScoy3bvDD38ICxbAb34D06dDSQl89aswe7a9 +EqQYI/ff/xRFRaXk5fldqNRQBgiSJElZKi8Phg2D8eNTYcKnPgXDh8NnPwt/+hOsX590hVIy3n77 +bV566WN69jws6VKkFsUAQZIkKQf07AmjR8Nbb8EvfwlPPAH9+8PXvw4vvph0dVLTiTFy771TaN9+ +GCF4OiTtDv/FSJIk5ZC8PDjtNJgwAV59Ffr2hXPOgcGD4ZZbYMOGpCuUGtfrry/g9dcj3bsflHQp +UotjgCBJkpSj+vSBa66BRYtgzBh48MFUr4RvfxteeSXp6qTMq6mpYfz4KXTqNIwQ6r3lvaTtGCBI +kiTluPx8OOsseOSR1OUM3brB6afD0KFwxx2wcWPSFUqZ8fLLr7BoURFduw5MuhSpRTJAkCRJ0lb9 ++8O4cfDuu/CjH8Gdd0K/fvD976cGYpRaqurqasaPL6NLF3sfSHvKAEGSJEk7KCiAc8+FSZNgzhwo +KoLS0tTjrrtg8+akK5R2z9y5L7JsWVc6dy5JuhSpxTJAkCRJ0i4NGAC/+AUsWQLf+lZqsMV+/VI9 +FBYuTLo6qX6VlZWMHz+dbt2GJV2K1KIZIEiSJKlBCgvh/PPhySdh5szUvKFD4ZRT4L77oLIy2fqk +nZk163n+9a8+dOzYN+lSpBbNAEGSJEm77VOfgv/3/+C99+CrX4Xf/S41fsLVV6fu6iA1F5s3b+be +e5+mRw97H0h7ywBBkiRJe6x1a7joIpg2DaZMSd2x4eij4YwzUreFrKpKukLluqeffo61a/enXbse +SZcitXgGCJIkScqIgw6CX/861SvhootSPRSKi2HMmNQ8qalt3LiRCRNm0bNnadKlSFnBAEGSJEkZ +VVQEI0emxkmYNAlWroTDD4ezz4aJE6G6OukKlSumTp3Jhg0HUVTUNelSpKxggCBJkqRG85nPwE03 +pXognHMOjBsH++0H114Ly5cnXZ2yWXl5OQ89NJdevU5MuhQpaxggSJIkqdG1a5cabHH27NTYCEuX +wiGHwBe/CJMnQ01N0hUq2/zzn9OpqDicNm06JV2KlDUMECRJktSkjjwS/vhHWLIETjsNrroqdVeH +666DDz9MujplgzVr1jBx4iv07n1C0qVIWcUAQZIkSYno0AGuuAJeeAHuugsWLoQDD4QLL0zd0SHG +pCtUSzVp0jRqagZRWNgu6VKkrGKAIEmSpESFAIMHwy23wKJFcMIJ8N3vpsKE//1fWLEi6QrVkqxY +sYLJk9+gd+/jki5FyjoGCJIkSWo2OneGb38bXn4Z/vpXeOklGDgQLrkEZsywV4LqN3FiGSEcS6tW +RUmXImUdAwRJkiQ1OyHAccfBHXfAO+/AoEHwH/8Bhx6a6pXgHRxUlw8++ICyssX06XNM0qVIWckA +QZIkSc1a167wve/B66/D738Pr76auoPDqaemAob165OuUM3FQw9NoaDgePLzC5MuRcpKBgiSJElq +EUKAk06CW29N9UC4/HK47z7o1w8uvhgeewwqK5OuUklZunQpzz77Ib17D0q6FClrGSBIkiSpxSkq +ggsugIcfhrfeguOPh2uvhX33hSuvhNmzHS8h10yY8BSFhSeSl1eQdClS1jJAkCRJUovWvTt885vw +zDMwc2bq9YgRqbs4/Pd/p8ZQUHZ75513mDt3Lb16HZF0KVJWM0CQJElS1hg4EH72M3jzzdT4CB99 +BEOGwNCh8Ic/wMqVSVeoTIsxcv/9U2jb9nPk5eUnXY6U1QwQJEmSlHVCgGOOgd/9DpYtg6uvhunT +Yb/94Jxz4N57YePGpKtUJrz55pu88koFPXocmnQpUtYzQJAkSVJWa9UKzjoL7roL3nsPvvhF+NOf +oG9f+OpXYepUqKlJukrtiRgj48dPoWPHYYQQki5HynoGCJIkScoZHTvCqFHw5JPwyitw0EHw/e9D +cTGMHg3z5yddoXbH/PmvsnBhAd26HZB0KVJOMECQJElSTurbF374Q5g3L3ULSIAzzoAjjoD/+Z/U +pQ9qvmpqarjnnql07mzvA6mpGCBIkiQp533mM3DddfDuu3DjjbBgQWreKafAbbfBunVJV6jtvfji +PJYs6UCXLvslXYqUMwwQJEmSpLS8PCgthb/8JdUD4etfhwcfhH79YPhwmDgRKiuTrlJVVVXcc880 +unU72d4HUhMyQJAkSZLqUFQE552XChDeeQdOOgl+8YvUpQ/f+Q7MmgUxJl1lbpozZy4ffNCDTp36 +JV2KlFMMECRJkqR6dOsG3/gGzJwJzz4LPXrAyJHw6U/DuHHw1ltJV5g7KioqGD9+BvvsMyzpUqSc +Y4AgSZIk7Yb994drrkmNk3DnnbBqFQwdCsceCzffDCtWJF1hdnvmmdmsWlVMhw69ky5FyjkGCJIk +SdIeCAGOPhp+8xtYujQVKsycCQMHwtlnw/jxsHFj0lVml02bNnHffc/Qs+fnki5FykkGCJIkSdJe +atUKzjwz1SPhvfdSYyf85S/Qpw985SswZQpUVyddZcs3bdozlJd/mrZtuyddipSTDBAkSZKkDOrQ +ITU+wuTJ8OqrcOih8MMfQnEx/PjH8PLLSVfYMm3YsIEHH5xDr16lSZci5SwDBEmSJKmR9OkDP/gB +vPACPPEE5OfDF74Ahx0GN9yQuvRBDTNlytNs2nQobdp0TroUKWcZIEiSJElN4JBD4Je/hMWL4Xe/ +g4ULU0HCySfDX/8Ka9cmXWHztW7dOh55ZB69ep2YdClSTjNAkCRJkppQXh6cdBL83//B8uXwzW/C +ww9D//5w4YXwyCNQUZF0lc3L5MnTqao6itatOyRdipTTDBAkSZKkhLRpA1/6EjzwACxaBMOGwfXX +Q9++8K1vwbPPQoxJV5msVatW8fjjr9K799CkS5FyngGCJEmS1Ax07QpXXAFPPw2zZ6fGT7jsstRt +IX/2M3jjjaQrTMZjj5UBx9CqVdukS5FyngGCJEmS1MwMGAA/+Qm8/jqMHw/r10NpKQweDL/9LXz4 +YdIVNo2PPvqIKVPepnfvY5MuRRIGCJIkSVKzFQJ89rPw61/De+/BtdfC88/DAQfAGWfAP/4BGzYk +XWXjeeSRqeTlHUdBQeukS5GEAYIkSZLUIhQUwKmnwh13wLJlcOmlcOedqfESLr0UJk2Cqqqkq8yc +5cuXM2PGUnr3Hpx0KZLSDBAkSZKkFqZdO7j4Ypg4Ed58M3Vpw5gxsO++8L3vpXoptPTBFx98cAqF +hSeSn98q6VIkpRkgSJIkSS1Yjx7wne/ArFkwYwZ07gzDh8NBB8F//ze8807SFe6+d999l1mzVtCr +11FJlyKpFgMESZIkKUt86lMwdiwsXAi33ZYabHHIEBg6FP7wB1i5MukK6xdj5P77n6KoqJS8vPyk +y5FUiwGCJEmSlGVCSAUHN92UGi/h6qth+nTYbz84++zUnR02bky6yrq9/fbbvPTSx/TseVjSpUja +jgGCJEmSlMVatYKzzoK77krdyeFLX4K//AX69IGvfAWeegqqq5OuMiXGyPjxT9Gu3ecIwVMVqbkp +SLoASZIkSU2jY0cYNSr1WL4c7r4bfvSj1KUOF18Ml1wChx2W6sGQhNdee50FC2DAgIOTKUA5J8ZU +gFZZmbqLSWXlttNVVbB6dY+ky2w2DBAkSZKkHNSnD/zgB6nHq6/CP/6RuryhY0cYMSIVKPTv33T1 +1NTUcO+9U+nU6VRCUgmGEhcj1NTs+oR++3l1Ld/Zc13z8vNTt0lt1eqT59rTbdvum/TH0mwYIEiS +JEk57pBD4Be/gGuvhZkz4e9/hyOPhM98JtUr4bzzUnd3aEwvv/wK77zThgEDBjbuhhpZjLBhA6xe +DR9/XH/7hmQlzanN9strahp2kt6QNlumQ6j7RH5n87ZMt26dusXprtrWNS+vnqtlli59ARhS/4eX +AwwQJEmSJAGpE6kTTkg9fvtbeOyxVM+E//xPOOWUVJhw5pmpE7VMqq6uZvz4Mrp2PadF9D6oqoK1 +a2HVqlRQsP2joAC6dk2dzO5KjPVvqzm1qWt5CHWfpG95Lipq+In8lnn1ndArOQYIkiRJknbQujX8 ++7+nHqtXw/33w29+A5dfnuqRMGIEHH98Zk725s59kWXLujJgQMnerywDYoRNm3YeEJSXpy716NLl +k0e/fqnQoHNnaNMm6T2QGocBgiRJkqRd6tIlFRxcfjksWZK6o8M3vwnr16eChEsugYP3cNzDyspK +7rlnGt26Dc9s0fWoqUn1IqgrIFi1KtWmdkDQpw8cemhqulMnvyVXbjJAkCRJktRg/fvDVVfBj38M +L7+cGi/h85+Hnj1TYcJFF6VOthvquefmsGJFXwYM6JvxWjdv3jYUqB0SrFuXusRgS6+Brl3hoIM+ +CQyKipK7G4XUXGUkQAgh3AJ8AfgwxnhYJtYpSZJySwjhdOBGIA+4JcZ4fR1tfgucAWwAvhxjnNfQ +90rKrBDg8MNTj+uug2nTUmHCIYfAoEGpXglf/CJ06LDzdWzevJn77ptJjx6j9qiGGFO9IOoKCFav +Tg3KV7sXQY8ecMABqenOnVPX3UtquEz9k/kr8DvgjgytT5Ik5ZAQQh5wE3AysByYE0J4KMa4oFab +M4D9Y4yfCiEcA/wRGNKQ90pqXPn5MGxY6nHzzfDII6nBF6+8MjXo4ogRcNppqQHyanv66edYs2Y/ +BgzosdN1V1bWfZnB6tWwZk1qvIHaIcHAgannLYMY2otAypyMBAgxxqdDCMWZWJckScpJg4GFMcZ3 +AUIIdwPnALVDgHNIf1kRY5wVQugUQugJDGjAeyU1kaIiuOCC1GPFCrj3XvjlL+ErX0nNu+QSOOYY +2LRpIxMmzKJnz8spL9/5WAQbN6Z6C9QOCfbb75NeBIWFSe+xlDvstCNJkpqDvsB7tV4vJRUq1Nem +bwPfKykB3bvDN76RerzzDtx5J4waBdXVsM8+63njja9TXt5x620Pt4QCxcVwxBGp1x06OGCh1Fw0 +aYAwduzYrdOlpaWUlpY25eYlSUpcWVkZZWVlSZeRLfaoY7LHI1Iy9tsPfvpT+MlPYO5c+J//eZH+ +/T/NgAEdve2h1MT29HgkxBgzUkD6EoZHdjaIYgghZmpbkiQI4wJxTHb/Xs2JfQyBGGPOX6EbQhgC +jI0xnp5+PRqItQdDDCH8EZgaY7wn/XoBcBKpSxh2+d5a6/B4RGom5s9/lRtumEZJyRXk5eUnXY60 +U0uX/p3Ro4cwcODApEtpNA09HslkZ6DAHn4TIEmSct4cYGAIoTiEUAgMBx7ers3DwEjYGjisiTF+ +2MD3SmpmDjnkYAYPbs/7789OuhRJDZSRACGEcCfwDPDpEMKSEMJlmVivJEnKDTHGauDbwGTgVeDu +GOPrIYQrQghfS7d5DFgUQngL+BPwzV29N4HdkLQbQghcdNFZwAw2b16XdDmSGiBTd2G4OBPrkSRJ +uSvGOAk4YLt5f9ru9bcb+l5JzV+3bt0477xB3HnnEwwYcH7S5Uiqh+OZSpIkSUrMsGEn0Lv3Mlav +fifpUiTVwwBBkiRJUmJatWrFl798BqtXT6SmpirpciTtggGCJEmSpEQdeOABDB3ajWXLnk26FEm7 +YIAgSZIkKXEXXHAG+fnPsGnTmqRLkbQTBgiSJEmSEtelSxcuvHAI778/KelSJO2EAYIkSZKkZuGk +k4bSr99HrFz5ZtKlSKqDAYIkSZKkZqGgoIAvf/lM1q17nOrqyqTLkbQdAwRJkiRJzcbAgQMpLe3N +8uVPJ12KpO0YIEiSJElqVr74xdMoLJzDxo2rki5FUi0GCJIkSZKalU6dOjF8+FDef/8xYoxJlyMp +zQBBkiRJUrNz/PFD2H//taxYsSDpUiSlGSBIkiRJanby8/MZNeosyssnUV1dkXQ5kjBAkCRJktRM +lZSU8PnPF7Ns2bSkS5GEAYIkSZKkZuzcc0+lqOhFNmz4V9KlSDnPAEGSJElSs9W+fXtGjDiJDz6Y +6ICKUsIMECRJkiQ1a0OGHM2BB27io4/mJ12KlNMMECRJkiQ1a3l5eYwceRYbN06mqmpT0uVIOcsA +QZIkSVKz169fP04/fSDLlpUlXYqUswwQJEmSJLUI//Zvp9C+/SuUl3+QdClSTjJAkCRJktQitGvX +jpEjh/HRRw6oKCXBAEGSJElSizFo0FEcemgNH344L+lSpJxjgCBJkiSpxQghcMklZ1FR8RSVlRuT +LkfKKQVJFyBJmVK2uIyyxWVbp0tLSgEoLSndOi1Jklq+Pn368IUvHMQjjzxFcfEXki5HyhkGCJKy +Ru2gIIwLlH25LNF6JElS4znjjGFMn34z69YdSceOfZMuR8oJXsIgSZIkqcUpKipi1KhTWLFiIjHW +JF2OlBMMECRJkiS1SEcccThHHFHA++/PTboUKScYIEiSJElqkUIIjBhxFtXVZVRUbEi6HCnrGSBI +kiRJarF69uzJuecexvLl/0y6FCnrGSBIkiRJatFOPbWU7t3fYe3aJUmXImU1AwRJkiRJLVrr1q0Z +NepUVq50QEWpMRkgSJIkSWrxDj30EAYPbsfy5bOTLkXKWgYIkiRJklq8EALDh59JjNPZvHl90uVI +WckAQZIkSVJW6N69O+ed91nef39y0qVIWckAQZIkSVLWGDbsBHr1eo/VqxclXYqUdQwQJEmSJGWN +wsJCRo06ndWrJ1JTU510OVJWMUCQJEmSlFUOPPAAjjuuC8uXP5t0KVJWMUCQJEmSlFVCCFxwwRmE +MJNNm9YmXY6UNQwQJEmSJGWdrl27cuGFx/D++5OSLkXKGgYIkiRJkrJSaenx7Lvvh6xcuTDpUqSs +YIAgSZIkKSsVFBTw5S+fwdq1j1NTU5V0OVKLZ4AgSZIkKWt96lOf4qSTerJs2dNJlyK1eAYIkiRJ +krLaeeedTqtWs9m4cVXSpUgtmgGCJEmSpKzWqVMnhg8/jvfff5wYY9LlSC2WAYIkSZKkrHfCCcey +335rWLnyjaRLkVosAwRJkiRJWS8/P59Ro85k/fpJVFdXJF2O1CIZIEiSJEnKCQMGDOCUU/qxfPmM +pEuRWiQDBEmSJEk549xzT6V167l8/PGKpEuRWhwDBEmSJEk5o0OHDowYcSLvvz/RARWl3WSAIEmS +JCmnHHvsYA444GP+9a9Xky5FalEMECRJkiTllLy8PEaOPIuPP36CqqrNSZcjtRgGCJIkSZJyTv/+ +/Tn99IEsW1aWdClSi2GAIEmSJCkn/du/nUL79i9TXv5h0qVILYIBgiRJkqSc1K5dOy699HN89JED +KkoNYYAgSZIkKWcNGnQUBx9cxYcfvpR0KVKzV5B0AZKk3bflW5KqqqptXteermte0sv35D1VVVUU +FPjnSpLUOFIDKn6Bn/zkTiorD6BVq6KkS5KaLY/IJGk7MUZqamqorq7e5lFVVbXDvIa2qaqqprIy +9aioqKKi4pPXlZWfLK/9XFFRRVVV9U4flMDll/8yXXVI/TcEtpyDhxBq7dWOy7fM2376k/fVvfyT +6YYv37LOGHe9/trLYwSKYd68eQwaNAhJkhpLnz59+MIXDuTRR6dQXHxW0uVIzZYBgqQWrbKykvLy +ctavX095eTnl5eWsWbMegFtvvS99gl5V54l67ceWNltO9kPIB/J3eK79CKFg63SM+dtMb3mdek61 +y8trRQj55OXl7+S5oM5leXn5tGmzfZs8YCwlJdc0+WfetL5JdXV10kVIknLAmWeezIwZN7N+/ZF0 +6NAn6XKkZskAQVKzE2Nk48aN24QC69eXs2rVelasKGfVqnJWrlzPmjXlbNxYTX5+B0JoT4ztqalp +D3SAEnj++QPrOBkv2GZefn4+BQX5tG277Yn7tt/eS5KkbFdUVMTIkSdz440Tad/+q+mwXlJtGQkQ +QginAzeSGpTxlhjj9ZlYb0ty003wm99Aq1apR2HhJ9O1Hzubvyfv2Ztt5Pn7UAmoqqpiw4YN2wQD +a9euZ+XK8q3BwKpV61m7dgM1NYXk5XUAPgkG8vM7UVjYl8LC9rRu3YFu3dqTn996pyf7PXoc2rQ7 +KGmPhBC6APcAxcBi4IIY49o62tV5vBFCGAP8B/BRuunVMcZJTVC6pCxz5JFHcPjhL/DGGy/Qp4+X +z0nb2+sAIaSiuZuAk4HlwJwQwkMxxgV7u+6WZMQIOPVUqKxMPSoqPpne/rGzZbXnf/zx7rXf3W3k +5e1dGFFQsO3zzqYzPa++5X5p3PRijGzevHmbUKC8fMfeAqtXl/PxxxWE0I4QagcDHSgs7E1hYfv0 +owN9+7YjL88OUlIOGQ08GWO8IYRwFfBf6XlbNeB441cxxl81ZdGSsk8IgREjzuLqq/9GRcVBFBa2 +S7okqVnJxBH6YGBhjPFdgBDC3cA5QE4FCF26pB4tQYxQXb3nYURV1Y7Tu5r38ce7btfQ9TRkXu1g +JNPhRGOFIg1tn5/ftAFJTU3NDr0F1q3bsbfAmjXlVFXlb9NbIMb2hNCBwsKeW3sLdO7cnu7dizJ6 +acCWwQBj3PZRQzVQRHnckLFtNU9tKaecmq2jItZxVwPiLl/X2SZs3+aTtttvq0HrZdv31NRq8//b +u/fgKgszj+O/51ySkEASCCAI1ZQiBbVVFBGQS1qxIlKgVmupo7LtzLo7te10O85i66zY6R+1reyu +tnZ2266123W6jlysovUyGly3YhW5CdSl0xBBIaBJiCaQ67N/nBNJIORCzjlvznu+n5kzeW/nfZ83 +t/Oc33kvfa4n8rHT7TzCZZmkBcnhhyVV6qQAQX33G0TIAFJi3LhxWrbsU1q//nmVly8LuhxgSElF +gDBB0v4u4weUeJHHEGWWeGMai0nDQnSXmq7ByGCCiJ7mn27esWNSQ0P/lx/MtPb2Ez+3wYYVUpuO +HWtWS0virgHNze3JR+LuAC0tHWpr61DiIoBxuRdLGqWOjli3iwomhiOSIt3ewHf+PHp6pHJeJ7MT +D0nS2Vulm0332dj0/tINAfdpXOJtk590Z4OTp1mXeX7SeE/TThq33tZ7ynZOWs/J49Zlfb2ux6TW +4f34LiAExrp7jSS5+yGzHv94++o3bjezmyW9Luk7PZ0CAQD9tWjRZ7Rp00919Oh+lZQQZgOdMnqM +8OrVqz8arqioUEVFRSY3j5DrGoyEUUdH9yNHzjSYaGuT3nhjl/7yl2o1NBxXe3uHIhFPnq5iisdL +FIuVKj+/RPF4QTJ4iCsez1c8XqBoNPEN7vqm/eQ38Jma1zn9VDN0jzXp7m6fdIfPPWY5sY9hU1lZ +qcrKyqDLyDgze07SWV0nKXEIyl09LD7QX+wHJX3f3d3MfiBpjaSvnW5h+hEAfcnPz9fKlZ/TT36y +UcXFf8sFFRE6Z9qPmA+y+TSzWZJWu/ui5PgqSX7yhRTNzAe7LQCp1Xm3g6amJjU2Nn70tbGxSfX1 +jaqra1JdXaPq6xvV0NCkDz5oUnt7TGaFMiuSe6GkIrW3FyoWK1I8XqR4vFB5eYmv8XiRotF4IPuW +K2+uc2EfNy/arMsvvzzoUtLGzOTu4UtKBsDM9kiqcPcaMxsn6UV3n3bSMv3tN86V9IS7f/o026If +AdAv7q4HHviN3nxzqs4+O7yvQ+jbgQO/1apVszR58uSgS0mb/vYjqfis9jVJk5Mv2AclfVnSihSs +F0CamZkKCwtVWFio0aNH97l85wUTu4cNicDh6NEG1dYeUn19o+rrm3T0aKPef79Jra2mSKRIZkWS +CuVepI6OQkUip4YNeXlFikTi3EIRyD2/l7RS0r2SbpX0eA/LnLbfMLNx7n4oudx1kt5Md8EAws/M +tGLFYt1550Nqbj5f+fkjgi4JCNygAwR3bzez2yU9qxO3Vdoz6MoADDlmpoKCAhUUFKisrKzP5d1d +LS0t3QKHpqYmffhhoxoaGlVbe1h1dY06ejQRONTUNKmlxRWJJMKGzqMc3BMBRGfQ0DV46O02jgCy +xr2SHjWzr0qqlvQlSTKz8ZJ+4e5L+ug3fmRmF0vqUOI2kLdlegcAhNOYMWN03XWX6NFHn1N5+XVB +lwMELiVniyfvtfzJVKwLQHiYmfLz85Wfn69Ro0b16zktLS09nFKROIWitvY91dcnTqtoaGjSkSON +am5uTx7hkDidojNwULl04MBmmUUViUSTX2Ndhk/9GonEepxnFiGkANLI3WslLexh+kFJS7qM99hv +uPstaS0QQE5buHC+Kit/pvr6fSotLQ+6HCBQIb3cHIBslZeXp7y8PJWWlvZr+dbW1lMCh6amJv36 +WWnJkjq1trZ/9GhrS3xtaWnrNt7WdmI4Md7WbXp7e8dHd50wi0k6cSeKzuET0xLz3ROPzuknhmPq +6Og5wOgryDg5CFG+1NZ2/JTvycDO7x7YueDpWvdp11swgM0BAJAGeXl5WrlykX74w40qLv67xGsw +kIYNLY4AAA43SURBVKMIEABktXg8rpKSEpWUlHSf8ay0fPk1KdmGu6u9vb3bo62t7ZRp/Z2fCCba +1Nx8vFvA0TXUSDzauk3vHnK0S/lSbe2/DGhfBnIkRSQysKMuBrLufi9boFN/tgAAZNi0aVM1e/YW +bdmyWRMnXhF0OUBgCBAAoA9mplgsptgQu0fo/ffcoQcfXBV0GWl1/z13aOrUqUGXAQDIcWamG29c +rK1bf6njxy9UQQHhNnITNzQFAAAAgD6MGjVKN9wwUwcPPhN0KUBgCBAAAAAAoB8qKq7QhAkHVVv7 +l6BLAQJBgAAAAAAA/RCPx7Vy5WLV1z+ljo62oMsBMo4AAQAAAAD6acqU8zR//li9887/Bl0KkHEE +CAAAAAAwANdfv0ix2Ks6dqwu6FKAjCJAAAAAAIABKC0t1YoVs3Xw4NNBlwJkFAECAAAAAAzQvHlz +VF5eq/feeyvoUoCMIUAAAAAAgAGKRqNauXKxPvjgabW3twZdDpARBAgAAAAAcAYmTZqkK6+cqHfe ++Z+gSwEyggABAAAAAM7Q8uWfU37+62pqej/oUoC0I0AAAAAAgDNUXFysm26ap0OHNsrdgy4HSCsC +BAAAAAAYhNmzZ+q88xp15MjuoEsB0ooAAQAAAAAGIRqN6tZbr1VT0zNqa2sOuhwgbQgQAAAAAGCQ +zjnnHF199SS9++6moEsB0oYAAQAAAABSYOnSq1RYuF2NjYeDLgVICwIEAAAAAEiBoqIi3XxzhWpq +uKAiwokAAQAAAABS5LLLLtX557eqpmZH0KUAKUeAAAAAAAApEolEdPPN16q5+Xm1tR0PuhwgpQgQ +AAAAACCFJkyYoMWLp+jAgReCLgVIKQIEAAAAAEixa6+9UqNH71Z19R/U3NwQdDlAShAgAAAAAECK +FRYW6u67b9N115nq6n6u6uqNOn68PuiygEEhQAAAAACANBgxYoQ+//mrdd99t+uGG/J19Oi/ad++ +x3XsWG3QpQFnhAABAAAAANKoqKhIixcv1Jo139RNNxWrsfGX2rdvnRobjwRdGjAgsaALAAAAAIBc +MGzYMF111Wc0b95sbd78mtav/7WOHCnX6NHzNHz4uKDLA/pEgAAAAAAAGVRQUKCKinmaM+dyvfrq +61q//r9UVXW2ysrmq7h4QtDlAadFgAAAGFIq91Wqcl+lJGnBuQu0unK1JKmivEIV5RWB1QUAQKrl +5eVp3rw5mjXrMm3ZslWPPfbfqqoaq1Gj5quk5JygywNOQYAAABhSCAoAALkmHo9r1qyZmjHjEm3b +tl2PPbZOVVUjVVo6X6Wl5TKzoEsEJBEgAAAAAMCQEIvFNGPGpZo+/WLt2LFTa9c+qaqqQpWWLtDI +kZ8gSEDgCBAAAAAAYAiJRqOaPv1iXXTRp7Vr126tW/es/vrXmEaMmK+ysk8SJCAwBAgAQoNz5wEA +QJhEIhF96lMX6sILL9CePX/Whg2b9NZbL6qoaL7GjJkms0jQJSLHECAACA2CAgAAEEZmpvPPn6Zp +06Zq79692rDhJe3a9aIKC+dr7NgLCRKQMQQIAAAAAJAFzExTpkzRHXecp6qqKj3++CZt316p/Py5 +OuusixSJRIMuESFHgAAAWYTTNAAAgJlp0qRJ+va3J6m6ulpPPPGSXn/9JeXlXaFx46YrEuFtHtLD +3D0zGzLzTG0LAIBsYWZyd66GlSH0IwDC6sCBA9q48SW98spBxeNXaNy4SxWNxoMuKxQOHPitVq2a +pcmTJwddStr0tx8hmgIAAACALDdx4kTddttXtHTpQT311Et6+eWXFYnM0vjxlykWyw+6PIQEV9sA +AAAAgJAYP368vva1G3XvvbdowYIavfvu/dq/f5Pa2o4HXRpCgAABAAAAAEJm7NixuuWWL+rHP/6q +Fi6s06FD9+vtt19Qa2tT0KUhi3EKAwAAAACEVFlZmVasWK5Fi+r0/PMv65lnHlB7+3SNHz9HeXnD +gy4PWYYjEAAAAAAg5EaOHKkbbvi81qz5ey1b1q733vuZqqufVnNzQ9ClIYsQIAAAAABAjiguLtby +5ddozZqv64tfjKqu7ueqrn5Sx47VBV0asgABAgAAAADkmOHDh2vJks9pzZpv6MYbh+mDD/5d+/Zt +UFPT+0GXhiGMayAAAAAAQI4qLCzUokVXasGCOfrjH/+kDRt+pcOHP6ExY+apqGhs0OVhiCFAAAAA +AIAcN2zYMF155QLNnTtLr7zymtavf1iHD5+r0aPnacSI8UGXhyGCAAEAAAAAIEnKz89XRcVczZkz +U3/60xatW/eIqqrGq6xsgYqLJwRdHgJGgAAAAAAA6CYvL09z587WrFmXacuWrVq79lFVVY3WyJHz +VVp6btDlISAECAAAAACAHsViMV1++WWaMeMSbdu2XWvXblBVVYlKS+ertPTjMrOgS0QGESAAAAAA +AHoVjUZ16aWXaPr0i7Vjx06tW/eU9u0rUHHxfBUWjpZ7R/LhXYY7JHUf7zq/t3mnzj8xbNYhM/9o +WEos2zncOS8xnJiXWObEsj0PnxjvfL7kikQ+VCw2N5Pf7iHL3D0zGzLzTG0LAIBsYWZydz6+yRD6 +EQBIjY6ODu3evUdPPvmK6uqaFImYotGIotGIIpFIt3GzE8OJ+dbjcE/zYrGe55lZcjuJR2/jg50X +jUY1fPjwUB9t0d9+hAABAIAAESBkFv0IAACn6m8/EslEMQAAAAAAILsRIAAAAAAAgD4RIAAAAAAA +gD4RIAAAAAAAgD4RIAAAAAAAgD4RIAAAAAAAgD4NKkAws+vN7E0zazezS1JVVLaqrKwMuoS0Yx/D +gX0MB/YRYWFmI83sWTN7y8yeMbOS0yz3KzOrMbMdZ/L8XJELfzfsYziwj+HAPuaWwR6BsFPSFyRt +SkEtWS8XfrHYx3BgH8OBfUSIrJL0vLt/UtILku48zXIPSbp6EM/PCbnwd8M+hgP7GA7sY24ZVIDg +7m+5+15JlqJ6AABA7lkm6eHk8MOSlve0kLu/LKnuTJ8PAAAGh2sgAACAoI119xpJcvdDksZm+PkA +AKAfzN17X8DsOUlndZ0kySV9z92fSC7zoqTvuPsbvayn9w0BAJCj3D30R/L10k/cJenX7j6qy7Lv +u3vZadZzrqQn3P3TXabVDuD59CMAAPSgP/1IrB8ruSpTxQAAgHDqrZ9IXhjxLHevMbNxkg4PcPX9 +fj79CAAAZy6VpzDwggwAAM7E7yWtTA7fKunxXpY1ndpzDOT5AADgDPV5CkOvTzZbLukBSaMl1Uva +5u7XpKg2AACQA8xslKRHJX1MUrWkL7l7vZmNl/QLd1+SXO4RSRWSyiTVSLrb3R863fMzvycAAITb +oAIEAAAAAACQGwK5C4OZfcfMOpKfGISKmX3fzLab2VYz+0PyXMxQMbMfmdkeM9tmZmvNrDjomlLN +zK43szfNrN3MLgm6nlQys0Vm9mcz+z8z+8eg60k1M/tV8nzqHUHXki5mNtHMXjCzXWa208y+GXRN +qWZm+Wb2avJ/6U4zuzvomtLFzCJm9oaZ/T7oWnIN/Uh2ox/JbvQj2Y9+JFz6249kPEAws4mSrlLi +EMMw+pG7X+Tu0yVtlBTGX7JnJV3g7hdL2ivpzoDrSYedkr4gaVPQhaSSmUUk/VTS1ZIukLTCzKYG +W1XKPaTE/oVZm6R/cPcLJM2W9PWw/RzdvVnSZ5L/Sy+WdI2ZzQy4rHT5lqTdQReRa+hHQoF+JEvR +j4QG/Ui49KsfCeIIhH+WdEcA280Id/+wy2iRpI6gakkXd3/e3Tv3a7OkiUHWkw7u/pa771X4Lg46 +U9Jed69291ZJv5O0LOCaUsrdX5ZUF3Qd6eTuh9x9W3L4Q0l7JE0ItqrUc/em5GC+EncNCt05d8k3 +sYsl/TLoWnIQ/UiWox/JavQjIUA/Eh4D6UcyGiCY2VJJ+919Zya3m2lm9gMze1vSVyT9U9D1pNlX +JT0ddBHotwmS9ncZP6AQ/qPPJWZWrkQi/mqwlaRe8lC6rZIOSXrO3V8LuqY06HwTG7pmZCijHwkl ++pHsQj8SMvQjWa/f/Ugs1Vs2s+ckndV1UrKQuyR9V4nDBbvOyzq97OP33P0Jd79L0l3J87m+IWl1 +5qscnL72MbnM9yS1uvsjAZQ4aP3ZR2AoM7Phkh6T9K2TPm0MheQni9OT5zVvMLPz3T00h/qb2bWS +atx9m5lVKEtfE4cq+hH6kWxBP4JsRz+S3Qbaj6Q8QHD3q3qabmYXSiqXtN3MTInDzLaY2Ux3P5zq +OtLpdPvYg0ckPaUsfMHuax/NbKUSh7l8NiMFpcEAfo5h8o6kc7qMT0xOQ5Yxs5gSL9b/6e6hvue9 +uzeY2YuSFilc1wq4QtJSM1ssaZikEWb2G3e/JeC6QoF+pBv6kSGMfkQS/UjWoh8JhQH1Ixk7hcHd +33T3ce4+yd0/rsShStOz7cW6L2Y2ucvociXOBQoVM1ukxCEuS5MXFgm7rPxk6jRekzTZzM41szxJ +X5YUxiu/m8L1c+vJf0ja7e7/GnQh6WBmo82sJDk8TIlPi/8cbFWp5e7fdfdz3H2SEn+LLxAepB/9 +SHjQj2Q1+pHwoB/JcgPtRwK5jWOSK5x/UD80sx1mtk3SQiWuZhk2D0gaLum55K0+Hgy6oFQzs+Vm +tl/SLElPmlkozqt093ZJtytx5epdkn7n7qFqKs3sEUl/lDTFzN42s78JuqZUM7MrJN0k6bPJ2wq9 +kWykw2S8pBeT/0tflfSMuz8VcE0IJ/qR7EU/kqXoR8KBfiQ3mTvXbQIAAAAAAL0L8ggEAAAAAACQ +JQgQAAAAAABAnwgQAAAAAABAnwgQAAAAAABAnwgQAAAAAABAnwgQAAAAAABAnwgQAAAAAABAn/4f +STfmKmb+uQ4AAAAASUVORK5CYII= +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Finally, when we look at a 3-day horizon, we start getting some incredible outliers. Stocks have a potential to move over ~300% up, and the standard deviation width is again, incredible. The results for a 3-day horizon follow the same pattern we've seen in the 5- and 8-day horizons.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Event-Type-2:-Trending-up-for-N-days">Event Type 2: Trending up for N days<a class="anchor-link" href="#Event-Type-2:-Trending-up-for-N-days">&#182;</a></h1><p>We're now going to repeat the analysis, but do it for uptrends instead. That is, instead of looking at stocks that have been trending down over the past number of days, we focus only on stocks that have been trending up.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[10]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">does_trend_up</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">horizon</span><span class="p">):</span> + <span class="c"># Figure out if the `event` has an uptrend for</span> + <span class="c"># the `horizon` days preceding it</span> + <span class="c"># As an interpretation note: it is assumed that</span> + <span class="c"># the closing price of day `event` is the reference</span> + <span class="c"># point, and we want `horizon` days before that.</span> + <span class="c"># The price_data.hdf was created in the second appendix code block</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_hdf</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">,</span> <span class="n">ticker</span><span class="p">)</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">ticker_data</span><span class="p">[</span><span class="n">event</span><span class="o">-</span><span class="n">TradeDay</span><span class="p">(</span><span class="n">horizon</span><span class="p">):</span><span class="n">event</span><span class="p">]</span> + <span class="n">midpoints</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Open&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;Close&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span> + + <span class="c"># Shift dates one forward into the future and subtract</span> + <span class="c"># Effectively: do we trend down over all days?</span> + <span class="n">elems</span> <span class="o">=</span> <span class="n">midpoints</span> <span class="o">-</span> <span class="n">midpoints</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">elems</span><span class="o">.</span><span class="n">dropna</span><span class="p">()[</span><span class="n">elems</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">])</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="c"># If the stock doesn&#39;t exist, it doesn&#39;t qualify as trending down</span> + <span class="c"># Mostly this is here to make sure the entire analysis doesn&#39;t </span> + <span class="c"># blow up if there were issues in data retrieval</span> + <span class="k">return</span> <span class="k">False</span> + +<span class="n">study_trend</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:22:51 Time: 0:22:51 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +zsvTaq7XU3dyckYTExO6cmVSzz03qfHxSV29OiP3nKS83H9J6XSb0uk2pVIZuVvl54qaL7fO9LYn +pNfcqI/bXqmqc+jmc9ZVY93Ng6Lydqvu8M5bt7mdzEX3sapzaKP6talquzT3/HWUzSlfQdmcY0v9 +ZnMHQPBw3cuF89cXK1vGenk2v0647TN+U7Ds1eVVIy6U9ysvl0eWmHMOk8lm65TrV+pZ5by24Biz +9SvbiiS9AACLu+ee2/Xgg4dJIAARmvoSxYMHD1aW+/r61NfX18zTY40pd8Cnp6WpqdnlpaZyver6 +88uaVSeVkrLZYMpkgqnWciPXOzqi6z/55FM6fPioisWiUilp69bt2rBhpzo6NqmtbaPS6eCjwar6 +bNXLteYrqTOT2qOHXPod/0rQbax0BqVUeai/cL28vbIedjDDkqCuV62FncjKexjcKsdU+chedczy +PmEH9W/tev2JTs6eq6K6fRFl0rzyZZb5bNmfW0oHNDehMP+UNddXUb+ZDniNdiWov0XewzEwMKCB +gYGkmwEAqHL77bfJbEDF4rTS6WzSzQFaViMSCGckPb9qfVdYtkB1AgGN5T7biS1/y7xay/V24lc6 +SbMd8GxWyuXmrs+fqreXl2vNy8vt7dF16jnOYvNUCz9C99a33qFS6XZduHBBIyMjGhoq6PjxQxoc +LOjMmVGVStdJyqtUyqujo0ddXXl1dm5TKrWaOccuyY7ohX7bKp5jmeySNvmmpFuxkEm18gdoXfMT +6P39/ck1BgAgSdqwYYNe/OKdevrpZ5TPt2AsArSIRvQGfiTpRjO7XtJZSW+RdF8DjpuI8q3nU1PN +m8qd7sXK6+3Ql0pzv2Wu/ua7upNda1vc5Y4OaePG+jrzy53SvItvVaVSKW3dulVbt27VLbfcUikv +lUo6f/68CoWChodHdOzYMzpx4gc6c+a83DdJ6glfnFhOLGxd5cQCAADA6nvVq/bpJz85LIkEAlDL +iqN+dy+a2XskfUezwzg+veKWNcFf/qX0qU8t7MinUkEHuNFTZ+ds5zpqitvpT6dnbwUHViKVSmnb +tm3atm2bbr1VuueeoLxYLFYSC0NDIxocfFqDg4/pzJmLct+scmKhoyOvrq4edXQwIgMAAFg7br31 +hcrlvqXp6Qlls51JNwdoSQ352tDdvy1pTyOO1Uzvepd0330LO+588w0slE6n1dPTo56eHu3dO1s+ +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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>The patterns here are very similar. With the exception of noting that stocks can go to nearly 400% after an earnings announcement (most likely this included a takeover announcement, etc.), we still see large min/max bars and wide standard deviation of returns.</p> +<p>We'll repeat the pattern for stocks going up for both 8 and 3 days straight, but at this point, the results should be very predictable:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[11]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">study_trend</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:20:51 Time: 0:20:51 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +hBL7fpfO3h/g3V2i+3gNye1Xd2ufLPm9uRt418weBE4A3ki87h8m9iciIpJ2zBs/SkRERKRvEuM9 +vAPM1BgDIiIiAuq5ICIiIofBzM7BG9zwZwoWREREpJ16LoiIiIiIiIhIv6jngoiIiIiIiIj0i8IF +EREREREREekXhQsiIiIiIiIi0i8KF0RERERERESkXxQuiIiIiIiIiEi/KFwQERERERERkX5RuCAi +IiIiIiIi/aJwQURERERERET6ReGCiIiIiIiIiPSLwgURERERERER6ReFCyIiIiIiIiLSLwoXRERE +RERERKRfFC6IiIiIiIiISL8oXBARERERERGRflG4ICIiIiIiIiL9onBBRERERERERPpF4YKIiIiI +iIiI9IvCBRERERERERHpF4ULIiIiIiIiItIvKQkXzOwCM1trZuvN7NaDtJtlZhEz+2wqjisiIiLp +51DnHWZ2jJm9amatZvbtw3muiIiIHBlzzvVvB2YBYD1wDrAdWA7Mdc6t7aHd80ALsMg592S/Diwi +IiJppy/nHWY2ASgFLgP2Oud+2tfnioiIyJFJRc+Fk4ENzrktzrkI8AhwaQ/tvgE8DuxMwTFFREQk +PR3yvMM5t8s5twKIHu5zRURE5MikIlwoBrYmLdck1nUws8nAZc65XwGWgmOKiIhIejrkeccAPVdE +REQOImOQjnMnkHxdY68Bg5n17zoNERGREco5p4B+EOhcREREpHe9nY+kIlzYBpQkLU9JrEt2EvCI +mRkwAbjQzCLOuad6KTYFZUmqLFiwgAULFvhdhvhAn3360mc/9Hj/hAp9O+/o93N1LjL06O+l9KXP +Pn3psx96DnY+kopwYTlwtJmVAjuAucDVyQ2cc9OSirkX+EtvwYKIiIjIQRzyvKOb5LOgw32uiIiI +9FG/wwXnXMzMbgKewxvD4R7n3Boz+7q32d3d/Sn9PaaIiIikp76cd5hZIfAmMAqIm9k/Acc55xp7 +eq5PL0VERGREScmYC865JcAx3db9ppe2/5CKY8rgmTNnjt8liE/02acvffYylB3qvMM5VwdM7etz +ZXjQ30vpS599+tJnP7zYULum0MzcUKtJRETEb2amAR0Hic5FREREenaw85HBultEv5WVlbFlyxa/ +y5BDKC0tpaqqyu8yREREUk7nIoND5xIiIsPTsOm5kEhIfKhIDoc+JxGRgaGeC4NH5yL+0vssIjJ0 +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 +ejFy5EhGjhzJ5MnZfTFGNm7cuKN0WLJkKW++OZvly99i27ZeQCUxVhBCJT16VFBeXkGPHhWUlpYn ++r0cSJYLkiRJXVgmA9dcAzffDPfeCx/+cNKJJEk7CyHQt29f+vbty6GHHsqxx2b3ZzIZ1q9fz7p1 +62hoaKC+voEVK1awenUDa9c20NiYIpWqACrIZCro1q1iR/nQvftBpFIliX5f+8JyQZIkqYvauBHO +OgveeSe7vsKgQUknkiTti1QqRWVlJZWVlX/xWoyRLVu20NDQQENDA+vWNbBq1UpWrpzPmjUNrFjx +LnAQIVQQY7aA2D7jobw8O+uhKy0sabkgSZLUBS1YkF1f4bjj4PbbXV9BkgpNCIGePXvSs2dPDjnk +kL94vaWlhQ0bNuwoH+rrG1i5chWrVjWwZs06GhvDjlkP69c3An07/Xtoy3JBkiSpi7n3Xjj/fPju +d+GLX0w6jSQpCSUlJbud9dDY2Pi+WQ/tFRSdyXJBkiSpi8hk4F/+BX72s2zBsH2hMEmS2goh0KNH +D3r06MGQIUOSjgNYLkiSJHUJGzfCOedAfX12fYXBg5NOJEnS3kslHUCSJKnYvf569i4QAwfCzJkW +C5Kk/GO5IEmSlKD774djj4VLL4Wf/tSFGyVJ+cnLIiRJkhKQycC118KNN8Ldd8MxxySdSJKk/We5 +IEnSfqhbUkfdkjoApgyfwrS6aQDUjqildkRtYrmUH959F849F1atyq6v0EXW4pIkab+FGGPSGd4n +hBC7WiZJ0oHR9hfyuiV1O34J76hfyMPVgXhVYfybEkIgxhiSzlEMOmMscvrp0Lcv/OQn0L17h55K +kqQDZnfjEcsFSVLBslzQ/uiMsciGDdlyQZKkfLK78YgLOkqSJHUyiwVJUqGxXJAkSZIkSTmxXJAk +SZIkSTlxzQVJUkHp7EUjO4trLnQexyKSJLXPBR0lScpzlgudx7GIJEntc0FHSZIkSZLUYSwXJEmS +JElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElS +TiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwX +JEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmSJElSTiwXJEmS +JElSTiwXJEmSJElSTnIqF0IIFSGEh0MIC0MID4UQ+u7iuEtDCPNDCHNDCL8KIZTlcl51rrq6uqQj +KCF+9sXLz15d0T6MO24OIawNIczdn/era/LnUvHysy9efvb5JdeZC1cAj8YYDwceA67c+YAQwhDg +EmBijPEooBQ4I8fzqhP5l7p4+dkXLz97dVF7HHe0+gXw1zm8X12QP5eKl5998fKzzy+5lgunAbe2 +bt8KfGoXx5UAvUIIpUBPYFWO55UkScVnr8YdMcangIb9fb8kSdp3uZYLVTHGtQAxxjVA1c4HxBhX +Af8GLANWAutjjI/meF5JklR89jju6OD3S5KkXQgxxt0fEMIjwMC2u4AIfAe4JcZY2ebYd2KM/Xd6 +fz/gTuDvgA3AHcDtMcZf7+J8uw8kSVKRijGGpDN0tFzHHW1eGw7c23pJ5vZ96/bm/Y5FJEnatV2N +R0r34o3H7+q11sWSBsYY14YQBgH17Rw2FVgcY1zX+p7fAccA7ZYLxTBwkiRJ7TsA447d2av3OxaR +JGnf5XpZxAzg3Nbtc4B72jlmGTA5hFAeQgjAJ4DXcjyvJEkqPnsz7tgutH7t7/slSdI+2ONlEbt9 +cwiVwG+BDwBLgdNjjOtDCIOBn8cYT2k97iqyd4jYCrwEfDHGuDXX8JIkqXjsw7jj10At0B9YC1wV +Y/zFrt7f+d+JJEmFJ6dyQZIkSZIkKdfLIlQkQghXhRBWhBBebP06MelM6jghhBNDCAtCCK+HEP4h +6TzqPCGEJSGEl0MIL4UQnk86jyS15XikuDgeKV6OR/KTMxe0V1ovbXk3xnhd0lnUsUIIKeB1suuj +rAJmAWfEGBckGkydIoSwGKiJMTYknUWSduZ4pHg4HilujkfykzMXtC9cPbs4fAh4I8a4tHVtlNuA +0xLOpM4T8N8GSV2b45Hi4HikuDkeyUN+YNoXXw0hzAkh3BRC6Jt0GHWYQ4DlbZ6vaN2n4hCBR0II +s0IIFyQdRpLa4XikODgeKW6OR/KQ5YJ2CCE8EkKY2+ZrXuvjqcANQDrGOB5YAzgdUSpMH40xTgRO +Ai4OIRybdCBJxcXxiCQcj+Sl0qQDqOuIMR6/l4f+HLi3I7MoUSuBYW2eD23dpyIQY1zd+vhWCOEu +stNSn0o2laRi4nhErRyPFDHHI/nJmQvaKyGEQW2efgaYn1QWdbhZwOgQwvAQQhlwBjAj4UzqBCGE +niGE3q3bvYAT8O+6pC7E8UhRcTxSpByP5C9nLmhv/SCEMB7IAEuALycbRx0lxtgSQvgq8DDZAvLm +GONrCcdS5xgI3BVCiGT/ffhVjPHhhDNJUluOR4qE45Gi5ngkT3krSkmSJEmSlBMvi5AkSZIkSTmx +XJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTmxXJAkSZIkSTn5XwGz +SIQHpzdOAAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[12]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span class="n">study_trend</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">does_trend_up</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stderr output_text"> +<pre>100% (47578 of 47578) |###########################################################| Elapsed Time: 0:26:56 Time: 0:26:56 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Conclusion-and-Summary">Conclusion and Summary<a class="anchor-link" href="#Conclusion-and-Summary">&#182;</a></h1><p>I guess the most important thing to summarize with is this: <strong>looking at the entire market, stock performance prior to an earnings release has no bearing on the stock's performance.</strong> Honestly: given the huge variability of returns after an earnings release, even when the stock has been trending for a long time, you're best off divesting before an earnings release and letting the market sort itself out.</p> +<p><em>However</em>, there is a big caveat. These results are taken when we look at the entire market. So while we can say that the market as a whole knows nothing and just reacts violently, I want to take a closer look into this data. Does the market typically perform poorly on large-cap/high liquidity stocks? Do smaller companies have investors that know them better and can thus predict performance better? Are specific market sectors better at prediction? Presumably technology stocks are more volatile than the industrials.</p> +<p>So there are some more interesting questions I still want to ask with this data. Knowing that the hard work of data processing is largely already done, it should be fairly simple to continue this analysis and get much more refined with it. Until next time.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Appendix">Appendix<a class="anchor-link" href="#Appendix">&#182;</a></h1><p>Export event data for Russell 3000 companies:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">html.parser</span> <span class="kn">import</span> <span class="n">HTMLParser</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> +<span class="kn">import</span> <span class="nn">requests</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">from</span> <span class="nn">dateutil</span> <span class="kn">import</span> <span class="n">parser</span> +<span class="kn">import</span> <span class="nn">progressbar</span> +<span class="kn">from</span> <span class="nn">concurrent</span> <span class="kn">import</span> <span class="n">futures</span> +<span class="kn">import</span> <span class="nn">yaml</span> + +<span class="k">class</span> <span class="nc">EarningsParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> + <span class="n">store_dates</span> <span class="o">=</span> <span class="bp">False</span> + <span class="n">earnings_offset</span> <span class="o">=</span> <span class="bp">None</span> + <span class="n">dates</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> + <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dates</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;table&#39;</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span> <span class="o">=</span> <span class="bp">True</span> + + <span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span><span class="p">:</span> + <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r&#39;\d+/\d+/\d+&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> + <span class="k">if</span> <span class="n">match</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span> + + <span class="c"># If a company reports before the bell, record the earnings date</span> + <span class="c"># being at midnight the day before. Ex: WMT reports 5/19/2016,</span> + <span class="c"># but we want the reference point to be the closing price on 5/18/2016</span> + <span class="k">if</span> <span class="s">&#39;After Close&#39;</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="k">elif</span> <span class="s">&#39;Before Open&#39;</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">def</span> <span class="nf">handle_endtag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;table&#39;</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">store_dates</span> <span class="o">=</span> <span class="bp">False</span> + +<span class="k">def</span> <span class="nf">earnings_releases</span><span class="p">(</span><span class="n">ticker</span><span class="p">):</span> + <span class="c">#print(&quot;Looking up ticker {}&quot;.format(ticker))</span> + <span class="n">user_agent</span> <span class="o">=</span> <span class="s">&#39;Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) &#39;</span>\ + <span class="s">&#39;Gecko/20100101 Firefox/46.0&#39;</span> + <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;user-agent&#39;</span><span class="p">:</span> <span class="n">user_agent</span><span class="p">}</span> + <span class="n">base_url</span> <span class="o">=</span> <span class="s">&#39;http://www.streetinsider.com/ec_earnings.php?q={}&#39;</span>\ + <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + <span class="n">e</span> <span class="o">=</span> <span class="n">EarningsParser</span><span class="p">()</span> + <span class="n">s</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span> + <span class="n">a</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">adapters</span><span class="o">.</span><span class="n">HTTPAdapter</span><span class="p">(</span><span class="n">max_retries</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + <span class="n">s</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="s">&#39;http://&#39;</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> + <span class="n">e</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span><span class="o">.</span><span class="n">content</span><span class="p">))</span> + + <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">earnings_offset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> + <span class="n">dates</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">e</span><span class="o">.</span><span class="n">earnings_offset</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">dates</span><span class="p">)</span> + <span class="n">past</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span> <span class="n">dates</span><span class="p">)</span> + <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">d</span><span class="p">:</span> <span class="n">d</span><span class="o">.</span><span class="n">isoformat</span><span class="p">(),</span> <span class="n">past</span><span class="p">))</span> + +<span class="c"># Use a Russell-3000 ETF tracker (ticker IWV) to get a list of holdings</span> +<span class="n">r3000</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;https://www.ishares.com/us/products/239714/&#39;</span> + <span class="s">&#39;ishares-russell-3000-etf/1449138789749.ajax?&#39;</span> + <span class="s">&#39;fileType=csv&amp;fileName=IWV_holdings&amp;dataType=fund&#39;</span><span class="p">,</span> + <span class="n">header</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> +<span class="n">r3000_equities</span> <span class="o">=</span> <span class="n">r3000</span><span class="p">[(</span><span class="n">r3000</span><span class="p">[</span><span class="s">&#39;Exchange&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;NASDAQ&#39;</span><span class="p">)</span> <span class="o">|</span> + <span class="p">(</span><span class="n">r3000</span><span class="p">[</span><span class="s">&#39;Exchange&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;New York Stock Exchange Inc.&#39;</span><span class="p">)]</span> + +<span class="n">dates_file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> + +<span class="k">with</span> <span class="n">futures</span><span class="o">.</span><span class="n">ThreadPoolExecutor</span><span class="p">(</span><span class="n">max_workers</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span> <span class="k">as</span> <span class="n">pool</span><span class="p">:</span> + <span class="n">fs</span> <span class="o">=</span> <span class="p">{</span><span class="n">pool</span><span class="o">.</span><span class="n">submit</span><span class="p">(</span><span class="n">earnings_releases</span><span class="p">,</span> <span class="n">r3000_equities</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="s">&#39;Ticker&#39;</span><span class="p">]):</span> <span class="n">t</span> + <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">r3000_equities</span><span class="o">.</span><span class="n">index</span><span class="p">}</span> + <span class="n">pbar</span> <span class="o">=</span> <span class="n">progressbar</span><span class="o">.</span><span class="n">ProgressBar</span><span class="p">(</span><span class="n">term_width</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> + <span class="n">max_value</span><span class="o">=</span><span class="n">r3000_equities</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">max</span><span class="p">())</span> + + <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">fs</span><span class="p">):</span> + <span class="n">i</span> <span class="o">=</span> <span class="n">fs</span><span class="p">[</span><span class="n">future</span><span class="p">]</span> + <span class="n">pbar</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> + <span class="n">dates_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">yaml</span><span class="o">.</span><span class="n">dump</span><span class="p">({</span><span class="n">r3000_equities</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Ticker&#39;</span><span class="p">]:</span> + <span class="n">future</span><span class="o">.</span><span class="n">result</span><span class="p">()}))</span> +</pre></div> +<p>Downloading stock price data needed for the event studies:</p> +<div class="highlight"><pre><span class="kn">from</span> <span class="nn">secrets</span> <span class="kn">import</span> <span class="n">QUANDL_KEY</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<span class="kn">import</span> <span class="nn">yaml</span> +<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="kn">import</span> <span class="n">parse</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span> +<span class="kn">import</span> <span class="nn">quandl</span> +<span class="kn">from</span> <span class="nn">progressbar</span> <span class="kn">import</span> <span class="n">ProgressBar</span> + +<span class="k">def</span> <span class="nf">fetch_ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span> + <span class="c"># Quandl is currently giving me issues with returning</span> + <span class="c"># the entire dataset and not slicing server-side.</span> + <span class="c"># So instead, we&#39;ll do it client-side!</span> + <span class="n">q_format</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span> + <span class="n">ticker_data</span> <span class="o">=</span> <span class="n">quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/&#39;</span> <span class="o">+</span> <span class="n">ticker</span><span class="p">,</span> + <span class="n">start_date</span><span class="o">=</span><span class="n">start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">end_date</span><span class="o">=</span><span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">q_format</span><span class="p">),</span> + <span class="n">authtoken</span><span class="o">=</span><span class="n">QUANDL_KEY</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ticker_data</span> + +<span class="n">data_str</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;earnings_dates.yaml&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> +<span class="c"># Need to remove invalid lines</span> +<span class="n">filtered</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="s">&#39;{&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">x</span><span class="p">,</span> <span class="n">data_str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">))</span> +<span class="n">earnings_data</span> <span class="o">=</span> <span class="n">yaml</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">filtered</span><span class="p">))</span> + +<span class="c"># Get the first 1500 keys - split up into two statements</span> +<span class="c"># because of Quandl rate limits</span> +<span class="n">tickers</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">earnings_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + +<span class="n">price_dict</span> <span class="o">=</span> <span class="p">{}</span> +<span class="n">invalid_tickers</span> <span class="o">=</span> <span class="p">[]</span> +<span class="k">for</span> <span class="n">ticker</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">tickers</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">1500</span><span class="p">]):</span> + <span class="k">try</span><span class="p">:</span> + <span class="c"># Replace &#39;.&#39; with &#39;-&#39; in name for some tickers</span> + <span class="n">fixed</span> <span class="o">=</span> <span class="n">ticker</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> + <span class="n">event_strs</span> <span class="o">=</span> <span class="n">earnings_data</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> + <span class="n">events</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse</span><span class="p">(</span><span class="n">event</span><span class="p">)</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">event_strs</span><span class="p">]</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> + <span class="n">price_dict</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">fixed</span><span class="p">,</span> + <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">-</span><span class="n">td</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">+</span><span class="n">td</span><span class="p">)</span> + <span class="k">except</span> <span class="n">quandl</span><span class="o">.</span><span class="n">NotFoundError</span><span class="p">:</span> + <span class="n">invalid_tickers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + +<span class="c"># Execute this after 10 minutes have passed</span> +<span class="k">for</span> <span class="n">ticker</span> <span class="ow">in</span> <span class="n">ProgressBar</span><span class="p">()(</span><span class="n">tickers</span><span class="p">[</span><span class="mi">1500</span><span class="p">:]):</span> + <span class="k">try</span><span class="p">:</span> + <span class="c"># Replace &#39;.&#39; with &#39;-&#39; in name for some tickers</span> + <span class="n">fixed</span> <span class="o">=</span> <span class="n">ticker</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> + <span class="n">event_strs</span> <span class="o">=</span> <span class="n">earnings_data</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> + <span class="n">events</span> <span class="o">=</span> <span class="p">[</span><span class="n">parse</span><span class="p">(</span><span class="n">event</span><span class="p">)</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">event_strs</span><span class="p">]</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> + <span class="n">price_dict</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">fetch_ticker</span><span class="p">(</span><span class="n">fixed</span><span class="p">,</span> + <span class="nb">min</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">-</span><span class="n">td</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">events</span><span class="p">)</span><span class="o">+</span><span class="n">td</span><span class="p">)</span> + <span class="k">except</span> <span class="n">quandl</span><span class="o">.</span><span class="n">NotFoundError</span><span class="p">:</span> + <span class="n">invalid_tickers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span> + +<span class="n">prices_store</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">HDFStore</span><span class="p">(</span><span class="s">&#39;price_data.hdf&#39;</span><span class="p">)</span> +<span class="k">for</span> <span class="n">ticker</span><span class="p">,</span> <span class="n">prices</span> <span class="ow">in</span> <span class="n">price_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="n">prices_store</span><span class="p">[</span><span class="n">ticker</span><span class="p">]</span> <span class="o">=</span> <span class="n">prices</span> +</pre></div> + +</div> +</div> +</div></p> +<script type="text/x-mathjax-config"> +//MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); +MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); +</script> + +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -19,7 +5255,7 @@ <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline @@ -27,8 +5263,8 @@ <span class="n">fair_1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">fair_2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Fair Distribution&#39;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Fair Distribution&#39;</span><span class="p">);</span> </pre></div> </div> @@ -229,7 +5465,7 @@ D_2 = \left\{ <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">nonzero</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> @@ -239,8 +5475,8 @@ D_2 = \left\{ <span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> </pre></div> </div> @@ -432,14 +5668,14 @@ D_2 = \left\{ <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> <span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> <span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> -<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> </pre></div> </div> @@ -655,22 +5891,22 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="k">import</span> <span class="n">polynomial</span> <span class="k">def</span> <span class="nf">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># Calculating the probabilities of each outcome was taken</span> - <span class="c1"># from this author: http://math.stackexchange.com/a/1710392/320784</span> + <span class="c"># Calculating the probabilities of each outcome was taken</span> + <span class="c"># from this author: http://math.stackexchange.com/a/1710392/320784</span> <span class="n">d1_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d1_density</span><span class="p">)</span> <span class="n">d2_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d2_density</span><span class="p">)</span> <span class="n">coefs</span> <span class="o">=</span> <span class="p">(</span><span class="n">d1_p</span> <span class="o">*</span> <span class="n">d2_p</span><span class="p">)</span><span class="o">.</span><span class="n">coef</span> <span class="k">return</span> <span class="n">coefs</span> <span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># We&#39;ve now got the probabilities of each event, but we need</span> - <span class="c1"># to shift the array a bit so we can use the x values to actually</span> - <span class="c1"># index into it. This will allow us to do all the calculations</span> - <span class="c1"># incredibly quickly</span> + <span class="c"># We&#39;ve now got the probabilities of each event, but we need</span> + <span class="c"># to shift the array a bit so we can use the x values to actually</span> + <span class="c"># index into it. This will allow us to do all the calculations</span> + <span class="c"># incredibly quickly</span> <span class="n">coefs</span> <span class="o">=</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">)</span> <span class="n">coefs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">coefs</span><span class="p">))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">coefs</span><span class="p">[</span><span class="n">x</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> @@ -696,24 +5932,24 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> - <span class="c1"># To ensure we have legitimate densities, we will randomly</span> - <span class="c1"># increase one die face probability by `change`,</span> - <span class="c1"># and decrease one by `change`.</span> - <span class="c1"># This means there are something less than (1/`change`)^12 possibilities</span> - <span class="c1"># we are trying to search over.</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c"># To ensure we have legitimate densities, we will randomly</span> + <span class="c"># increase one die face probability by `change`,</span> + <span class="c"># and decrease one by `change`.</span> + <span class="c"># This means there are something less than (1/`change`)^12 possibilities</span> + <span class="c"># we are trying to search over.</span> <span class="n">change</span> <span class="o">=</span> <span class="o">.</span><span class="mi">01</span> <span class="n">d1_index1</span><span class="p">,</span> <span class="n">d1_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">d2_index1</span><span class="p">,</span> <span class="n">d2_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> - <span class="c1"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> - <span class="c1"># in the past that made everything blow up.</span> + <span class="c"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> + <span class="c"># in the past that made everything blow up.</span> <span class="n">new_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d1_density</span><span class="p">))</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d2_density</span><span class="p">))</span> - <span class="c1"># While this doesn&#39;t account for the possibility that some</span> - <span class="c1"># values go negative, in practice this never happens</span> + <span class="c"># While this doesn&#39;t account for the possibility that some</span> + <span class="c"># values go negative, in practice this never happens</span> <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> @@ -742,28 +5978,28 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">iter_count</span> <span class="o">=</span> <span class="mi">0</span> - <span class="c1"># Start with guessing fair dice</span> + <span class="c"># Start with guessing fair dice</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> - <span class="c1"># Keep track of our best guesses - may not be</span> - <span class="c1"># what we end with</span> + <span class="c"># Keep track of our best guesses - may not be</span> + <span class="c"># what we end with</span> <span class="n">max_score</span> <span class="o">=</span> <span class="n">cur_score</span> <span class="n">max_d1</span> <span class="o">=</span> <span class="n">cur_d1</span> <span class="n">max_d2</span> <span class="o">=</span> <span class="n">cur_d2</span> - <span class="c1"># Optimization stops when we have failed to switch `conv_count`</span> - <span class="c1"># times (presumably because we have a great guess), or we reach</span> - <span class="c1"># the maximum number of iterations.</span> + <span class="c"># Optimization stops when we have failed to switch `conv_count`</span> + <span class="c"># times (presumably because we have a great guess), or we reach</span> + <span class="c"># the maximum number of iterations.</span> <span class="k">while</span> <span class="n">switch_failures</span> <span class="o">&lt;</span> <span class="n">conv_count</span> <span class="ow">and</span> <span class="n">iter_count</span> <span class="o">&lt;</span> <span class="n">max_iter</span><span class="p">:</span> <span class="n">iter_count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">iter_count</span> <span class="o">%</span> <span class="p">(</span><span class="n">max_iter</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> - <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Iteration: </span><span class="si">{}</span><span class="s1">; Current score (higher is better): </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="nb">print</span><span class="p">(</span><span class="s">&#39;Iteration: {}; Current score (higher is better): {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">iter_count</span><span class="p">,</span> <span class="n">cur_score</span><span class="p">))</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">permute</span><span class="p">(</span><span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> @@ -775,19 +6011,19 @@ and continue the next iteration.</li> <span class="n">max_d2</span> <span class="o">=</span> <span class="n">new_d2</span> <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">cur_score</span><span class="p">:</span> - <span class="c1"># If the new permutation beats the old one,</span> - <span class="c1"># automatically select it.</span> + <span class="c"># If the new permutation beats the old one,</span> + <span class="c"># automatically select it.</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> - <span class="c1"># We didn&#39;t beat the current score, but allow</span> - <span class="c1"># for possibly switching anyways.</span> + <span class="c"># We didn&#39;t beat the current score, but allow</span> + <span class="c"># for possibly switching anyways.</span> <span class="n">accept_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">new_score</span> <span class="o">-</span> <span class="n">cur_score</span><span class="p">)</span> <span class="n">coin_toss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">()</span> <span class="k">if</span> <span class="n">coin_toss</span> <span class="o">&lt;</span> <span class="n">accept_prob</span><span class="p">:</span> - <span class="c1"># We randomly switch to the new distribution</span> + <span class="c"># We randomly switch to the new distribution</span> <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> @@ -795,7 +6031,7 @@ and continue the next iteration.</li> <span class="k">else</span><span class="p">:</span> <span class="n">switch_failures</span> <span class="o">+=</span> <span class="mi">1</span> - <span class="c1"># Return both our best guess, and the ending guess</span> + <span class="c"># Return both our best guess, and the ending guess</span> <span class="k">return</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span> </pre></div> @@ -821,7 +6057,7 @@ and continue the next iteration.</li> <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">time</span> <span class="k">def</span> <span class="nf">simulate_casino</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10000</span><span class="p">):</span> <span class="n">d1_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">d2_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> @@ -829,20 +6065,20 @@ and continue the next iteration.</li> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">final_d1</span><span class="p">,</span> <span class="n">final_d2</span> <span class="o">=</span> <span class="n">optimize</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">)</span> <span class="n">end</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> - <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Simulated Annealing time: </span><span class="si">{:.02f}</span><span class="s2">s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> + <span class="nb">print</span><span class="p">(</span><span class="s">&quot;Simulated Annealing time: {:.02f}s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> <span class="n">coef_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">13</span><span class="p">)</span> <span class="o">-</span> <span class="o">.</span><span class="mi">5</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">221</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;True Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;True Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">222</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Empirical Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Empirical Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">223</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> - <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Recovered Distribution&#39;</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">&#39;Recovered Distribution&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> @@ -1223,7 +6459,7 @@ m+QFBkHwS1PQ018D5wD/PHxt/03H/cxXeHtR0jLn4qiSJEkNdH17UZIkaUUwdEmSJDVg6JIkSWrA <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">])</span> </pre></div> @@ -1551,7 +6787,7 @@ jAU+qF/bLxXO081keTEiTnJpjhoRERHRgNLLixEREREjQoquiIiIiAak6IqIiIhoQIquiIiIiAak <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">])</span> </pre></div> @@ -1925,7 +7161,7 @@ RK5CYII= <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> </pre></div> </div> @@ -2316,7 +7552,7 @@ hoSz1PA0AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> +<div class=" highlight hl-ipython3"><pre><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> <span class="n">n</span><span class="o">=</span><span class="mi">250</span><span class="p">)</span> </pre></div> @@ -2727,7 +7963,7 @@ JDVg6JIkSWrA0CVJktSAoUuSJKkBQ5ckSVIDhi5JkqQG/gdFMjKH5D5DewAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -2746,7 +7982,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">total_heartbeats</span> <span class="o">=</span> <span class="mi">2500000000</span> +<div class=" highlight hl-ipython3"><pre><span class="n">total_heartbeats</span> <span class="o">=</span> <span class="mi">2500000000</span> </pre></div> </div> @@ -2778,7 +8014,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Import all the OAuth secret information from a local file</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># Import all the OAuth secret information from a local file</span> <span class="kn">from</span> <span class="nn">secrets</span> <span class="k">import</span> <span class="n">CLIENT_SECRET</span><span class="p">,</span> <span class="n">CLIENT_ID</span><span class="p">,</span> <span class="n">CALLBACK_URL</span> </pre></div> @@ -2817,19 +8053,19 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">urllib</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">urllib</span> -<span class="n">FITBIT_URI</span> <span class="o">=</span> <span class="s1">&#39;https://www.fitbit.com/oauth2/authorize&#39;</span> +<span class="n">FITBIT_URI</span> <span class="o">=</span> <span class="s">&#39;https://www.fitbit.com/oauth2/authorize&#39;</span> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span> - <span class="c1"># If we need more than one scope, must be a CSV string</span> - <span class="s1">&#39;scope&#39;</span><span class="p">:</span> <span class="s1">&#39;heartrate&#39;</span><span class="p">,</span> - <span class="s1">&#39;response_type&#39;</span><span class="p">:</span> <span class="s1">&#39;token&#39;</span><span class="p">,</span> - <span class="s1">&#39;expires_in&#39;</span><span class="p">:</span> <span class="mi">86400</span><span class="p">,</span> <span class="c1"># 1 day</span> - <span class="s1">&#39;redirect_uri&#39;</span><span class="p">:</span> <span class="n">CALLBACK_URL</span><span class="p">,</span> - <span class="s1">&#39;client_id&#39;</span><span class="p">:</span> <span class="n">CLIENT_ID</span> + <span class="c"># If we need more than one scope, must be a CSV string</span> + <span class="s">&#39;scope&#39;</span><span class="p">:</span> <span class="s">&#39;heartrate&#39;</span><span class="p">,</span> + <span class="s">&#39;response_type&#39;</span><span class="p">:</span> <span class="s">&#39;token&#39;</span><span class="p">,</span> + <span class="s">&#39;expires_in&#39;</span><span class="p">:</span> <span class="mi">86400</span><span class="p">,</span> <span class="c"># 1 day</span> + <span class="s">&#39;redirect_uri&#39;</span><span class="p">:</span> <span class="n">CALLBACK_URL</span><span class="p">,</span> + <span class="s">&#39;client_id&#39;</span><span class="p">:</span> <span class="n">CLIENT_ID</span> <span class="p">}</span> -<span class="n">request_url</span> <span class="o">=</span> <span class="n">FITBIT_URI</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> +<span class="n">request_url</span> <span class="o">=</span> <span class="n">FITBIT_URI</span> <span class="o">+</span> <span class="s">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> </pre></div> </div> @@ -2852,10 +8088,10 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># The `response_url` variable contains the full URL that</span> -<span class="c1"># FitBit sent back to us, but most importantly,</span> -<span class="c1"># contains the token we need for authorization.</span> -<span class="n">access_token</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">response_url</span><span class="p">))[</span><span class="s1">&#39;access_token&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># The `response_url` variable contains the full URL that</span> +<span class="c"># FitBit sent back to us, but most importantly,</span> +<span class="c"># contains the token we need for authorization.</span> +<span class="n">access_token</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">response_url</span><span class="p">))[</span><span class="s">&#39;access_token&#39;</span><span class="p">]</span> </pre></div> </div> @@ -2879,46 +8115,46 @@ Application: Thank you, now give me all the data.</code></pre> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">requests_oauthlib</span> <span class="k">import</span> <span class="n">OAuth2Session</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">requests_oauthlib</span> <span class="k">import</span> <span class="n">OAuth2Session</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> <span class="n">session</span> <span class="o">=</span> <span class="n">OAuth2Session</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="p">{</span> - <span class="s1">&#39;access_token&#39;</span><span class="p">:</span> <span class="n">access_token</span><span class="p">,</span> - <span class="s1">&#39;token_type&#39;</span><span class="p">:</span> <span class="s1">&#39;Bearer&#39;</span> + <span class="s">&#39;access_token&#39;</span><span class="p">:</span> <span class="n">access_token</span><span class="p">,</span> + <span class="s">&#39;token_type&#39;</span><span class="p">:</span> <span class="s">&#39;Bearer&#39;</span> <span class="p">})</span> -<span class="n">format_str</span> <span class="o">=</span> <span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">&#39;</span> +<span class="n">format_str</span> <span class="o">=</span> <span class="s">&#39;%Y-%m-%d&#39;</span> <span class="n">start_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">end_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">31</span><span class="p">)</span> <span class="n">dr</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span> -<span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://api.fitbit.com/1/user/-/activities/heart/date/</span><span class="si">{0}</span><span class="s1">/1d/1min.json&#39;</span> +<span class="n">url</span> <span class="o">=</span> <span class="s">&#39;https://api.fitbit.com/1/user/-/activities/heart/date/{0}/1d/1min.json&#39;</span> <span class="n">hr_responses</span> <span class="o">=</span> <span class="p">[</span><span class="n">session</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">format_str</span><span class="p">)))</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dr</span><span class="p">]</span> <span class="k">def</span> <span class="nf">record_to_df</span><span class="p">(</span><span class="n">record</span><span class="p">):</span> - <span class="k">if</span> <span class="s1">&#39;activities-heart&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">record</span><span class="p">:</span> - <span class="k">return</span> <span class="kc">None</span> - <span class="n">date_str</span> <span class="o">=</span> <span class="n">record</span><span class="p">[</span><span class="s1">&#39;activities-heart&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;dateTime&#39;</span><span class="p">]</span> - <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">record</span><span class="p">[</span><span class="s1">&#39;activities-heart-intraday&#39;</span><span class="p">][</span><span class="s1">&#39;dataset&#39;</span><span class="p">])</span> + <span class="k">if</span> <span class="s">&#39;activities-heart&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">record</span><span class="p">:</span> + <span class="k">return</span> <span class="k">None</span> + <span class="n">date_str</span> <span class="o">=</span> <span class="n">record</span><span class="p">[</span><span class="s">&#39;activities-heart&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;dateTime&#39;</span><span class="p">]</span> + <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">record</span><span class="p">[</span><span class="s">&#39;activities-heart-intraday&#39;</span><span class="p">][</span><span class="s">&#39;dataset&#39;</span><span class="p">])</span> - <span class="n">df</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span> - <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">date_str</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S&#39;</span><span class="p">))</span> + <span class="n">df</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s">&#39;time&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span> + <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">date_str</span> <span class="o">+</span> <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="n">x</span><span class="p">,</span> <span class="s">&#39;%Y-%m-%d %H:%M:%S&#39;</span><span class="p">))</span> <span class="k">return</span> <span class="n">df</span> <span class="n">hr_dataframes</span> <span class="o">=</span> <span class="p">[</span><span class="n">record_to_df</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">json</span><span class="p">())</span> <span class="k">for</span> <span class="n">record</span> <span class="ow">in</span> <span class="n">hr_responses</span><span class="p">]</span> <span class="n">hr_df_concat</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">(</span><span class="n">hr_dataframes</span><span class="p">)</span> -<span class="c1"># There are some minutes with missing data, so we need to correct that</span> +<span class="c"># There are some minutes with missing data, so we need to correct that</span> <span class="n">full_daterange</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">hr_df_concat</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;min&#39;</span><span class="p">)</span> -<span class="n">hr_df_full</span> <span class="o">=</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">reindex</span><span class="p">(</span><span class="n">full_daterange</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;nearest&#39;</span><span class="p">)</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;min&#39;</span><span class="p">)</span> +<span class="n">hr_df_full</span> <span class="o">=</span> <span class="n">hr_df_concat</span><span class="o">.</span><span class="n">reindex</span><span class="p">(</span><span class="n">full_daterange</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s">&#39;nearest&#39;</span><span class="p">)</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Heartbeats from </span><span class="si">{}</span><span class="s2"> to </span><span class="si">{}</span><span class="s2">: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Heartbeats from {} to {}: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> - <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()))</span> + <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()))</span> </pre></div> </div> @@ -2966,9 +8202,9 @@ hr_q \cdot n - hr_d \cdot (n-m) <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">quarterly_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">quarterly_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">leap_day_count</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> - <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">29</span><span class="p">)][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> + <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">29</span><span class="p">)][</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">num_quarters</span> <span class="o">=</span> <span class="mi">96</span> <span class="n">leap_days</span> <span class="o">=</span> <span class="mi">6</span> @@ -3013,17 +8249,17 @@ hr_q \cdot n - hr_d \cdot (n-m) <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">minute_mean</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> -<span class="c1"># Don&#39;t you wish you knew?</span> -<span class="c1"># birthday_minutes = ???</span> +<div class=" highlight hl-ipython3"><pre><span class="n">minute_mean</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> +<span class="c"># Don&#39;t you wish you knew?</span> +<span class="c"># birthday_minutes = ???</span> <span class="n">birthday_heartbeats</span> <span class="o">=</span> <span class="n">birthday_minutes</span> <span class="o">*</span> <span class="n">minute_mean</span> <span class="n">heartbeats_until_2016</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">birthday_heartbeats</span> <span class="o">+</span> <span class="n">jan_92_jan_16</span><span class="p">)</span> <span class="n">remaining_2016</span> <span class="o">=</span> <span class="n">total_heartbeats</span> <span class="o">-</span> <span class="n">heartbeats_until_2016</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Heartbeats so far: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">heartbeats_until_2016</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_2016</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Heartbeats so far: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">heartbeats_until_2016</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_2016</span><span class="p">))</span> </pre></div> </div> @@ -3071,7 +8307,7 @@ hr_q \cdot n - hr_d \cdot (n - m) <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">heartbeats_4year</span> <span class="o">=</span> <span class="n">quarterly_count</span> <span class="o">*</span> <span class="mi">16</span> <span class="o">-</span> <span class="n">leap_day_count</span> <span class="o">*</span> <span class="p">(</span><span class="mi">16</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">heartbeats_4year</span> <span class="o">=</span> <span class="n">quarterly_count</span> <span class="o">*</span> <span class="mi">16</span> <span class="o">-</span> <span class="n">leap_day_count</span> <span class="o">*</span> <span class="p">(</span><span class="mi">16</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="n">heartbeats_4year</span> </pre></div> @@ -3111,11 +8347,11 @@ hr_q \cdot n - hr_d \cdot (n - m) <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">four_year_periods</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">//</span> <span class="n">heartbeats_4year</span> +<div class=" highlight hl-ipython3"><pre><span class="n">four_year_periods</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">//</span> <span class="n">heartbeats_4year</span> <span class="n">remaining_4y</span> <span class="o">=</span> <span class="n">remaining_2016</span> <span class="o">-</span> <span class="n">four_year_periods</span> <span class="o">*</span> <span class="n">heartbeats_4year</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Four year periods remaining: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">four_year_periods</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats after 4 year periods: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_4y</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Four year periods remaining: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">four_year_periods</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats after 4 year periods: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_4y</span><span class="p">))</span> </pre></div> </div> @@ -3153,15 +8389,15 @@ Remaining heartbeats after 4 year periods: 48041640 <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">remaining_leap</span> <span class="o">=</span> <span class="n">remaining_4y</span> <span class="o">-</span> <span class="n">leap_day_count</span> -<span class="c1"># Ignore leap day in the data set</span> +<div class=" highlight hl-ipython3"><pre><span class="n">remaining_leap</span> <span class="o">=</span> <span class="n">remaining_4y</span> <span class="o">-</span> <span class="n">leap_day_count</span> +<span class="c"># Ignore leap day in the data set</span> <span class="n">heartbeats_quarter</span> <span class="o">=</span> <span class="n">hr_df_full</span><span class="p">[(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> - <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">!=</span> <span class="mi">29</span><span class="p">)][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> + <span class="p">(</span><span class="n">hr_df_full</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span> <span class="o">!=</span> <span class="mi">29</span><span class="p">)][</span><span class="s">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="n">quarters_left</span> <span class="o">=</span> <span class="n">remaining_leap</span> <span class="o">//</span> <span class="n">heartbeats_quarter</span> <span class="n">remaining_year</span> <span class="o">=</span> <span class="n">remaining_leap</span> <span class="o">-</span> <span class="n">quarters_left</span> <span class="o">*</span> <span class="n">heartbeats_quarter</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Quarters left starting 2068: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quarters_left</span><span class="p">))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Remaining heartbeats after that: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_year</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Quarters left starting 2068: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">quarters_left</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Remaining heartbeats after that: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">remaining_year</span><span class="p">))</span> </pre></div> </div> @@ -3199,7 +8435,7 @@ Remaining heartbeats after that: 4760716 <div class="prompt input_prompt">In&nbsp;[13]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span> <span class="n">base</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2070</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">minutes_left</span> <span class="o">=</span> <span class="n">remaining_year</span> <span class="o">//</span> <span class="n">minute_mean</span> @@ -3247,7 +8483,7 @@ Remaining heartbeats after that: 4760716 MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -3287,13 +8523,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> -<span class="n">tweets</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;tweets.csv&#39;</span><span class="p">)</span> +<span class="n">tweets</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;tweets.csv&#39;</span><span class="p">)</span> <span class="n">text</span> <span class="o">=</span> <span class="n">tweets</span><span class="o">.</span><span class="n">text</span> -<span class="c1"># Don&#39;t include tweets in reply to or mentioning people</span> -<span class="n">replies</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> +<span class="c"># Don&#39;t include tweets in reply to or mentioning people</span> +<span class="n">replies</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="s">&#39;@&#39;</span><span class="p">)</span> <span class="n">text_norep</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="o">~</span><span class="n">replies</span><span class="p">]</span> </pre></div> @@ -3317,7 +8553,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">nltk.tokenize</span> <span class="k">import</span> <span class="n">TweetTokenizer</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">nltk.tokenize</span> <span class="k">import</span> <span class="n">TweetTokenizer</span> <span class="n">tknzr</span> <span class="o">=</span> <span class="n">TweetTokenizer</span><span class="p">()</span> <span class="n">tokens</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">tknzr</span><span class="o">.</span><span class="n">tokenize</span><span class="p">)</span> @@ -3346,12 +8582,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">reduce</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">reduce</span> -<span class="c1"># Get all possible words</span> +<span class="c"># Get all possible words</span> <span class="n">all_words</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="n">tokens</span><span class="p">,</span> <span class="p">[])</span> <span class="n">unique_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_words</span><span class="p">)</span> -<span class="n">actual_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;.&#39;</span> <span class="k">else</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span><span class="p">])</span> +<span class="n">actual_words</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;.&#39;</span> <span class="k">else</span> <span class="k">None</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span><span class="p">])</span> <span class="n">word_dist</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="nb">iter</span><span class="p">(</span><span class="n">actual_words</span><span class="p">):</span> @@ -3380,12 +8616,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="n">hashtags</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">&#39;#&#39;</span><span class="p">)</span> +<span class="n">hashtags</span> <span class="o">=</span> <span class="n">text_norep</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">)</span> <span class="n">bins</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> -<span class="n">hashtags</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span> +<span class="n">hashtags</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span> </pre></div> </div> @@ -3517,7 +8753,7 @@ AElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">mle</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">mle</span> <span class="o">=</span> <span class="n">hashtags</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="n">mle</span> </pre></div> @@ -3557,12 +8793,12 @@ AElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">hashtags</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">all_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;#&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">hashtags</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">all_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">]</span> <span class="n">n_hashtags</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> -<span class="n">unique_hashtags</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;#&#39;</span><span class="p">]))</span> -<span class="n">hashtag_dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;hashtags&#39;</span><span class="p">:</span> <span class="n">unique_hashtags</span><span class="p">,</span> - <span class="s1">&#39;prob&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">all_words</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">/</span> <span class="n">n_hashtags</span> +<span class="n">unique_hashtags</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">unique_words</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">]))</span> +<span class="n">hashtag_dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">&#39;hashtags&#39;</span><span class="p">:</span> <span class="n">unique_hashtags</span><span class="p">,</span> + <span class="s">&#39;prob&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">all_words</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="o">/</span> <span class="n">n_hashtags</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">unique_hashtags</span><span class="p">]})</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtag_dist</span><span class="p">)</span> </pre></div> @@ -3615,12 +8851,12 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="k">def</span> <span class="nf">multinom_sim</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">vals</span><span class="p">,</span> <span class="n">probs</span><span class="p">):</span> <span class="n">occurrences</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">probs</span><span class="p">)</span> <span class="n">results</span> <span class="o">=</span> <span class="n">occurrences</span> <span class="o">*</span> <span class="n">vals</span> - <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">results</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">])</span> + <span class="k">return</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">results</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">])</span> <span class="k">def</span> <span class="nf">sim_n_hashtags</span><span class="p">(</span><span class="n">hashtag_freq</span><span class="p">):</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">poisson</span><span class="p">(</span><span class="n">hashtag_freq</span><span class="p">)</span> @@ -3630,7 +8866,7 @@ z: .17</code></pre> <span class="k">def</span> <span class="nf">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">):</span> <span class="n">probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">first_word_dist</span><span class="o">.</span><span class="n">values</span><span class="p">)</span> - <span class="k">return</span> <span class="n">multinom_sim</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_word_dist</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()[</span><span class="s1">&#39;index&#39;</span><span class="p">],</span> <span class="n">probs</span><span class="p">)</span> + <span class="k">return</span> <span class="n">multinom_sim</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_word_dist</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()[</span><span class="s">&#39;index&#39;</span><span class="p">],</span> <span class="n">probs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">sim_next_word</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">):</span> <span class="n">dist</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">word_dist</span><span class="p">[</span><span class="n">current</span><span class="p">])</span> @@ -3658,14 +8894,14 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> <span class="n">second</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">third</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">second</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">fourth</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">third</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">fifth</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">fourth</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> <span class="n">hashtag</span> <span class="o">=</span> <span class="n">sim_hashtags</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hashtag_dist</span><span class="p">)</span> -<span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">third</span><span class="p">,</span> <span class="n">fourth</span><span class="p">,</span> <span class="n">fifth</span><span class="p">,</span> <span class="n">hashtag</span><span class="p">))</span> +<span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">third</span><span class="p">,</span> <span class="n">fourth</span><span class="p">,</span> <span class="n">fifth</span><span class="p">,</span> <span class="n">hashtag</span><span class="p">))</span> </pre></div> </div> @@ -3704,7 +8940,7 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">simulate_tweet</span><span class="p">():</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">simulate_tweet</span><span class="p">():</span> <span class="n">chars_remaining</span> <span class="o">=</span> <span class="mi">140</span> <span class="n">first</span> <span class="o">=</span> <span class="n">sim_first_word</span><span class="p">(</span><span class="n">first_word_dist</span><span class="p">)</span> <span class="n">n_hash</span> <span class="o">=</span> <span class="n">sim_n_hashtags</span><span class="p">(</span><span class="n">mle</span><span class="p">)</span> @@ -3714,13 +8950,13 @@ z: .17</code></pre> <span class="n">tweet</span> <span class="o">=</span> <span class="n">first</span> <span class="n">current</span> <span class="o">=</span> <span class="n">first</span> - <span class="k">while</span> <span class="n">chars_remaining</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">tweet</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;.&#39;</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span> + <span class="k">while</span> <span class="n">chars_remaining</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">tweet</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">hashtags</span><span class="p">)</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;.&#39;</span> <span class="ow">and</span> <span class="n">current</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;!&#39;</span><span class="p">:</span> <span class="n">current</span> <span class="o">=</span> <span class="n">sim_next_word</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">word_dist</span><span class="p">)</span> - <span class="n">tweet</span> <span class="o">+=</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">current</span> + <span class="n">tweet</span> <span class="o">+=</span> <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="n">current</span> <span class="n">tweet</span> <span class="o">=</span> <span class="n">tweet</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">tweet</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> - <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">tweet</span><span class="p">,</span> <span class="n">hashtags</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> + <span class="k">return</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">tweet</span><span class="p">,</span> <span class="n">hashtags</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> </pre></div> </div> @@ -3743,7 +8979,7 @@ z: .17</code></pre> <div class="prompt input_prompt">In&nbsp;[12]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span> <span class="nb">print</span><span class="p">(</span><span class="n">simulate_tweet</span><span class="p">())</span> <span class="nb">print</span><span class="p">()</span> </pre></div> @@ -3822,7 +9058,7 @@ Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -3839,18 +9075,18 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="c1"># Record how long it takes to run the notebook - I&#39;m curious.</span> +<span class="c"># Record how long it takes to run the notebook - I&#39;m curious.</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> <span class="n">start</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> -<span class="n">dataset</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;split_train.csv&#39;</span><span class="p">)</span> +<span class="n">dataset</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;split_train.csv&#39;</span><span class="p">)</span> <span class="n">dataset</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">ID</span> -<span class="n">X</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s1">&#39;TARGET&#39;</span><span class="p">,</span> <span class="s1">&#39;ID&#39;</span><span class="p">,</span> <span class="s1">&#39;ID.1&#39;</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> +<span class="n">X</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s">&#39;TARGET&#39;</span><span class="p">,</span> <span class="s">&#39;ID&#39;</span><span class="p">,</span> <span class="s">&#39;ID.1&#39;</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">TARGET</span> </pre></div> @@ -3864,7 +9100,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">y</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">y</span><span class="o">.</span><span class="n">unique</span><span class="p">()</span> </pre></div> </div> @@ -3893,7 +9129,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> </pre></div> </div> @@ -3935,7 +9171,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cols</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">columns</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cols</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">columns</span> <span class="n">b_class</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">cols</span><span class="p">:</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="p">[</span><span class="n">c</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">())</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> @@ -3980,13 +9216,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># First we need to `binarize` the data to 0-1; some of the labels are {0, 1},</span> -<span class="c1"># some are {0, 3}, etc.</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># First we need to `binarize` the data to 0-1; some of the labels are {0, 1},</span> +<span class="c"># some are {0, 3}, etc.</span> <span class="kn">from</span> <span class="nn">sklearn.preprocessing</span> <span class="k">import</span> <span class="n">binarize</span> <span class="n">X_bin</span> <span class="o">=</span> <span class="n">binarize</span><span class="p">(</span><span class="n">X</span><span class="p">[</span><span class="n">b_class</span><span class="p">])</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">X_bin</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b_class</span><span class="p">))]</span> -<span class="n">acc_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s2">&quot;Accuracy&quot;</span><span class="p">:</span> <span class="n">accuracy</span><span class="p">},</span> <span class="n">index</span><span class="o">=</span><span class="n">b_class</span><span class="p">)</span> +<span class="n">acc_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">&quot;Accuracy&quot;</span><span class="p">:</span> <span class="n">accuracy</span><span class="p">},</span> <span class="n">index</span><span class="o">=</span><span class="n">b_class</span><span class="p">)</span> <span class="n">acc_df</span><span class="o">.</span><span class="n">describe</span><span class="p">()</span> </pre></div> @@ -4069,10 +9305,10 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">unsat</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Satisfied customers: </span><span class="si">{}</span><span class="s2">; Unsatisfied customers: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">-</span> <span class="n">unsat</span><span class="p">,</span> <span class="n">unsat</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">unsat</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Satisfied customers: {}; Unsatisfied customers: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">-</span> <span class="n">unsat</span><span class="p">,</span> <span class="n">unsat</span><span class="p">))</span> <span class="n">naive_guess</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)))</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Naive guess accuracy: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">))</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Naive guess accuracy: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">))</span> </pre></div> </div> @@ -4119,7 +9355,7 @@ Naive guess accuracy: 0.9608561656706882 <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.naive_bayes</span> <span class="k">import</span> <span class="n">GaussianNB</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">sklearn.naive_bayes</span> <span class="k">import</span> <span class="n">GaussianNB</span> <span class="kn">from</span> <span class="nn">sklearn.decomposition</span> <span class="k">import</span> <span class="n">PCA</span> <span class="n">X_no_bin</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">b_class</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> @@ -4133,9 +9369,9 @@ Naive guess accuracy: 0.9608561656706882 <span class="k">return</span> <span class="n">gnb</span><span class="o">.</span><span class="n">score</span><span class="p">(</span><span class="n">X_xform</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="n">dim_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">21</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">();</span> </pre></div> @@ -4410,7 +9646,7 @@ rkJggg== <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">evaluate_gnb_full</span><span class="p">(</span><span class="n">dims</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">evaluate_gnb_full</span><span class="p">(</span><span class="n">dims</span><span class="p">):</span> <span class="n">pca</span> <span class="o">=</span> <span class="n">PCA</span><span class="p">(</span><span class="n">n_components</span><span class="o">=</span><span class="n">dims</span><span class="p">)</span> <span class="n">X_xform</span> <span class="o">=</span> <span class="n">pca</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> @@ -4419,9 +9655,9 @@ rkJggg== <span class="k">return</span> <span class="n">gnb</span><span class="o">.</span><span class="n">score</span><span class="p">(</span><span class="n">X_xform</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="n">dim_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">21</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">dim_range</span><span class="p">,</span> <span class="p">[</span><span class="n">evaluate_gnb</span><span class="p">(</span><span class="n">dim</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">dim_range</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Gaussian NB Accuracy&quot;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">naive_guess</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">&quot;Inverse Naive Guess&quot;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s">&#39;k&#39;</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">();</span> </pre></div> @@ -4696,8 +9932,8 @@ rkJggg== <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Running time: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Running time: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> </pre></div> </div> @@ -4725,15 +9961,15 @@ rkJggg== <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="Appendix">Appendix<a class="anchor-link" href="#Appendix">&#182;</a></h1><p>Code used to split the initial training data:</p> -<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.cross_validation</span> <span class="kn">import</span> <span class="n">train_test_split</span> -<span class="n">data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;train.csv&#39;</span><span class="p">)</span> +<div class="highlight"><pre><span class="kn">from</span> <span class="nn">sklearn.cross_validation</span> <span class="kn">import</span> <span class="n">train_test_split</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">&#39;train.csv&#39;</span><span class="p">)</span> <span class="n">data</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">ID</span> <span class="n">data_train</span><span class="p">,</span> <span class="n">data_validate</span> <span class="o">=</span> <span class="n">train_test_split</span><span class="p">(</span> <span class="n">data</span><span class="p">,</span> <span class="n">train_size</span><span class="o">=.</span><span class="mi">7</span><span class="p">)</span> -<span class="n">data_train</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s1">&#39;split_train.csv&#39;</span><span class="p">)</span> -<span class="n">data_validate</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s1">&#39;split_validate.csv&#39;</span><span class="p">)</span> +<span class="n">data_train</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s">&#39;split_train.csv&#39;</span><span class="p">)</span> +<span class="n">data_validate</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="s">&#39;split_validate.csv&#39;</span><span class="p">)</span> </pre></div> </div> @@ -4744,7 +9980,7 @@ rkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -4776,12 +10012,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[19]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> <span class="kn">from</span> <span class="nn">Quandl</span> <span class="k">import</span> <span class="n">get</span> <span class="k">as</span> <span class="n">qget</span> <span class="o">%</span><span class="k">matplotlib</span> inline -<span class="n">api_key</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> +<span class="n">api_key</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="n">profitability</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">p</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="mi">1000</span><span class="o">*</span><span class="n">p</span> <span class="o">/</span> <span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="n">i</span><span class="o">*</span><span class="n">d</span><span class="p">)</span> @@ -4805,15 +10041,15 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <span class="n">expected_close</span> <span class="o">=</span> <span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">]</span> <span class="o">*</span> <span class="n">expected</span> <span class="n">todays_purchase</span> <span class="o">=</span> <span class="n">daily_investment</span><span class="p">(</span><span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">],</span> <span class="n">expected_close</span><span class="p">,</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">day</span><span class="p">])</span> <span class="n">invested</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">invested</span><span class="p">,</span> <span class="n">todays_purchase</span> <span class="o">+</span> <span class="n">bias</span><span class="p">)</span> - <span class="c1"># expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()</span> + <span class="c"># expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()</span> <span class="n">day</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">profitable</span> <span class="o">=</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span> \ <span class="ow">or</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">open_vals</span><span class="p">[</span><span class="n">day</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span> <span class="n">shares</span> <span class="o">=</span> <span class="p">(</span><span class="n">invested</span> <span class="o">/</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> - <span class="c1"># Make sure we can&#39;t see into the future - we know either today&#39;s close or tomorrow&#39;s open</span> - <span class="c1"># will be profitable, but we need to check which one.</span> + <span class="c"># Make sure we can&#39;t see into the future - we know either today&#39;s close or tomorrow&#39;s open</span> + <span class="c"># will be profitable, but we need to check which one.</span> <span class="k">if</span> <span class="n">is_profitable</span><span class="p">(</span><span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">invested</span><span class="p">,</span> <span class="n">open_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">invested</span><span class="p">)]):</span> <span class="n">ending_price</span> <span class="o">=</span> <span class="n">close_vals</span><span class="p">[</span><span class="n">day</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> @@ -4826,21 +10062,21 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <span class="n">ticker_info</span> <span class="o">=</span> <span class="n">qget</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start</span><span class="p">,</span> <span class="n">api_key</span><span class="o">=</span><span class="n">api_key</span><span class="p">)</span> <span class="n">evaluation_times</span> <span class="o">=</span> <span class="n">ticker_info</span><span class="p">[:</span><span class="n">end</span><span class="p">]</span><span class="o">.</span><span class="n">index</span> - <span class="c1"># Handle Google vs. YFinance data</span> - <span class="k">if</span> <span class="s2">&quot;Adjusted Close&quot;</span> <span class="ow">in</span> <span class="n">ticker_info</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span> - <span class="n">close_column</span> <span class="o">=</span> <span class="s2">&quot;Adjusted Close&quot;</span> + <span class="c"># Handle Google vs. YFinance data</span> + <span class="k">if</span> <span class="s">&quot;Adjusted Close&quot;</span> <span class="ow">in</span> <span class="n">ticker_info</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span> + <span class="n">close_column</span> <span class="o">=</span> <span class="s">&quot;Adjusted Close&quot;</span> <span class="k">else</span><span class="p">:</span> - <span class="n">close_column</span> <span class="o">=</span> <span class="s2">&quot;Close&quot;</span> + <span class="n">close_column</span> <span class="o">=</span> <span class="s">&quot;Close&quot;</span> - <span class="n">sim</span> <span class="o">=</span> <span class="p">{</span><span class="n">d</span><span class="p">:</span> <span class="n">simulate_day</span><span class="p">(</span><span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="s2">&quot;Open&quot;</span><span class="p">],</span> <span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="n">close_column</span><span class="p">],</span> + <span class="n">sim</span> <span class="o">=</span> <span class="p">{</span><span class="n">d</span><span class="p">:</span> <span class="n">simulate_day</span><span class="p">(</span><span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="s">&quot;Open&quot;</span><span class="p">],</span> <span class="n">ticker_info</span><span class="p">[</span><span class="n">d</span><span class="p">:][</span><span class="n">close_column</span><span class="p">],</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">evaluation_times</span><span class="p">}</span> <span class="n">sim_series</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">sim</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">()</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;profit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;max&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;days&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;score&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">profitability</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span> - <span class="n">result</span><span class="p">[</span><span class="s2">&quot;investments&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;profit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;max&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;days&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;score&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">profitability</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span> + <span class="n">result</span><span class="p">[</span><span class="s">&quot;investments&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sim_series</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">return</span> <span class="n">result</span> @@ -4875,7 +10111,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s2">&quot;YAHOO/FB&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/AAPL&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&quot;YAHOO/FB&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/AAPL&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> </pre></div> </div> @@ -4888,9 +10124,9 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -5362,9 +10598,9 @@ kiSpNScYJEmSJElSa04wSJIkSZKk1pxgkCRJkiRJrf1/uiw9D8O0d6EAAAAASUVORK5CYII= <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">fang_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -7001,7 +12237,7 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[13]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s2">&quot;YAHOO/X&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/CAT&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s2">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&quot;YAHOO/X&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/CAT&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/NFLX&quot;</span><span class="p">,</span> <span class="s">&quot;YAHOO/GOOG&quot;</span><span class="p">])</span> </pre></div> </div> @@ -7014,9 +12250,9 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[14]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -7502,9 +12738,9 @@ JEmSJEnSwGwwSJIkSZKkgdlgkCRJkiRJA7PBIEmSJEmSBvb/AfKAew4+oiojAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[15]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cyclic_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -9287,7 +14523,7 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[21]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s1">&#39;YAHOO/REGN&#39;</span><span class="p">,</span> <span class="s1">&#39;YAHOO/CELG&#39;</span><span class="p">,</span> <span class="s1">&#39;GOOG/NASDAQ_BIB&#39;</span><span class="p">,</span> <span class="s1">&#39;GOOG/NASDAQ_IBB&#39;</span><span class="p">])</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span> <span class="o">=</span> <span class="n">simulate_tickers</span><span class="p">([</span><span class="s">&#39;YAHOO/REGN&#39;</span><span class="p">,</span> <span class="s">&#39;YAHOO/CELG&#39;</span><span class="p">,</span> <span class="s">&#39;GOOG/NASDAQ_BIB&#39;</span><span class="p">,</span> <span class="s">&#39;GOOG/NASDAQ_IBB&#39;</span><span class="p">])</span> </pre></div> </div> @@ -9300,9 +14536,9 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[22]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;days&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">hist</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Distribution of Days Until Profitability&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -9853,9 +15089,9 @@ WKBTQVcCAAAAAElFTkSuQmCC <div class="prompt input_prompt">In&nbsp;[23]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s1">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">biotech_df</span><span class="o">.</span><span class="n">xs</span><span class="p">(</span><span class="s">&#39;score&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span> <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> -<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s2">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s">&quot;Profitability score over time&quot;</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">);</span> </pre></div> </div> @@ -11617,7 +16853,7 @@ JBKJRCJrRTQiRCKRSCQSiUQikUgkElkr/h9yZ17EmpnoFwAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -11684,7 +16920,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="k">using</span> <span class="n">Quandl</span> +<div class=" highlight hl-julia"><pre><span class="k">using</span> <span class="n">Quandl</span> <span class="n">api_key</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="n">daily_investment</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_open</span><span class="p">,</span> <span class="n">current_close</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> <span class="c"># We&#39;re not going to safeguard against divide by 0 - that&#39;s the user&#39;s responsibility</span> @@ -11714,7 +16950,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">is_profitable</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_price</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">is_profitable</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">current_price</span><span class="p">,</span> <span class="n">purchase_history</span><span class="p">,</span> <span class="n">open_history</span><span class="p">)</span> <span class="n">shares</span> <span class="o">=</span> <span class="n">sum</span><span class="p">(</span><span class="n">purchase_history</span> <span class="o">./</span> <span class="n">open_history</span><span class="p">)</span> <span class="k">return</span> <span class="n">current_price</span><span class="o">*</span><span class="n">shares</span> <span class="o">&gt;</span> <span class="n">sum</span><span class="p">(</span><span class="n">purchase_history</span><span class="p">)</span> <span class="k">end</span> @@ -11749,8 +16985,8 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <span class="n">leverages</span> <span class="o">=</span> <span class="p">[</span><span class="n">sum</span><span class="p">(</span><span class="n">investments</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">length</span><span class="p">(</span><span class="n">investments</span><span class="p">)]</span> <span class="n">max_leverage</span> <span class="o">=</span> <span class="n">maximum</span><span class="p">(</span><span class="n">leverages</span><span class="p">)</span> <span class="o">/</span> <span class="n">investments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">println</span><span class="p">(</span><span class="s">&quot;Max leverage: </span><span class="si">$(max_leverage)</span><span class="s">&quot;</span><span class="p">)</span> - <span class="n">println</span><span class="p">(</span><span class="s">&quot;Days invested: </span><span class="si">$(length(investments))</span><span class="s">&quot;</span><span class="p">)</span> - <span class="n">println</span><span class="p">(</span><span class="s">&quot;Profit: </span><span class="si">$profit</span><span class="s">&quot;</span><span class="p">)</span> + <span class="n">println</span><span class="p">(</span><span class="s">&quot;Days invested: </span><span class="si">$</span><span class="s">(length(investments))&quot;</span><span class="p">)</span> + <span class="n">println</span><span class="p">(</span><span class="s">&quot;Profit: </span><span class="si">$</span><span class="s">profit&quot;</span><span class="p">)</span> <span class="k">end</span><span class="p">;</span> </pre></div> @@ -11777,7 +17013,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i}) <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.01</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.01</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">sim_summary</span><span class="p">(</span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span><span class="p">)</span> </pre></div> @@ -11820,7 +17056,7 @@ Profit: 0.6894803101560001 <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span> <span class="o">=</span> <span class="n">simulate</span><span class="p">(</span><span class="s">&quot;YAHOO/LMT&quot;</span><span class="p">,</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2015</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">29</span><span class="p">),</span> <span class="mi">100</span><span class="p">,</span> <span class="mf">1.02</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">sim_summary</span><span class="p">(</span><span class="n">investments</span><span class="p">,</span> <span class="n">profit</span><span class="p">)</span> </pre></div> @@ -11880,13 +17116,13 @@ Profit: 0.08304813163696423 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">pickle</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">pickle</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">figure</span><span class="p">,</span> <span class="n">show</span> @@ -12153,7 +17389,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">))</span> <span class="n">forecasts_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">)</span> </pre></div> @@ -12167,24 +17403,24 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cities</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;binghamton&#39;</span><span class="p">,</span> <span class="s1">&#39;cary&#39;</span><span class="p">,</span> <span class="s1">&#39;nyc&#39;</span><span class="p">,</span> <span class="s1">&#39;seattle&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cities</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;binghamton&#39;</span><span class="p">,</span> <span class="s">&#39;cary&#39;</span><span class="p">,</span> <span class="s">&#39;nyc&#39;</span><span class="p">,</span> <span class="s">&#39;seattle&#39;</span><span class="p">]</span> <span class="n">city_colors</span> <span class="o">=</span> <span class="p">{</span><span class="n">cities</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">Palette</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)}</span> <span class="k">def</span> <span class="nf">safe_cover</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;cloudCover&#39;</span><span class="p">]</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;cloudCover&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> - <span class="c1"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> + <span class="c"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span> - <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s1">&#39;ignore&#39;</span><span class="p">)</span> + <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">cloud_cover_vals</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> </pre></div> @@ -12198,23 +17434,23 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> <span class="k">def</span> <span class="nf">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="n">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">month</span><span class="p">)</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="n">months</span> <span class="o">=</span> <span class="p">[</span> - <span class="p">(</span><span class="s1">&#39;July&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;August&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;September&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;October&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> - <span class="p">(</span><span class="s1">&#39;November&#39;</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span> + <span class="p">(</span><span class="s">&#39;July&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;August&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;September&#39;</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;October&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> + <span class="p">(</span><span class="s">&#39;November&#39;</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span> <span class="p">]</span> <span class="k">for</span> <span class="n">month</span><span class="p">,</span> <span class="n">month_id</span> <span class="ow">in</span> <span class="n">months</span><span class="p">:</span> <span class="n">month_averages</span> <span class="o">=</span> <span class="p">{</span><span class="n">city</span><span class="p">:</span> <span class="n">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month_id</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">}</span> - <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> Average Cloud Cover&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> - <span class="n">y_axis_label</span><span class="o">=</span><span class="s1">&#39;Cloud Cover Percentage&#39;</span><span class="p">)</span> + <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&quot;{} Average Cloud Cover&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">y_axis_label</span><span class="o">=</span><span class="s">&#39;Cloud Cover Percentage&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">month_averages</span><span class="p">[</span><span class="n">city</span><span class="p">]],</span> <span class="n">legend</span><span class="o">=</span><span class="n">city</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">city_colors</span><span class="p">[</span><span class="n">city</span><span class="p">])</span> @@ -12403,21 +17639,21 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;precipProbability&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;precipProbability&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_precip</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">forecasts_df</span><span class="p">[</span><span class="n">city</span><span class="p">][</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_vals</span><span class="p">)))</span> - <span class="c1"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> + <span class="c"># Ignore an issue with nanmean having all NaN values. We&#39;ll discuss the data issues below.</span> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span> - <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s1">&#39;ignore&#39;</span><span class="p">)</span> + <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">precip_vals</span><span class="p">),</span> <span class="n">precip_samples</span> <span class="k">def</span> <span class="nf">city_avg_precip</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> @@ -12425,9 +17661,9 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="k">for</span> <span class="n">month</span><span class="p">,</span> <span class="n">month_id</span> <span class="ow">in</span> <span class="n">months</span><span class="p">:</span> <span class="n">month_averages</span> <span class="o">=</span> <span class="p">{</span><span class="n">city</span><span class="p">:</span> <span class="n">city_avg_cc</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">month_id</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">}</span> - <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> Average Precipitation Chance&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> - <span class="n">y_axis_label</span><span class="o">=</span><span class="s1">&#39;Precipitation Chance Percentage&#39;</span><span class="p">)</span> + <span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&quot;{} Average Precipitation Chance&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">month</span><span class="p">),</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">y_axis_label</span><span class="o">=</span><span class="s">&#39;Precipitation Chance Percentage&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">city</span> <span class="ow">in</span> <span class="n">cities</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">month_averages</span><span class="p">[</span><span class="n">city</span><span class="p">]],</span> <span class="n">legend</span><span class="o">=</span><span class="n">city</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">city_colors</span><span class="p">[</span><span class="n">city</span><span class="p">])</span> @@ -12616,13 +17852,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">figure</span><span class="p">,</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">show</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="k">import</span> <span class="n">figure</span><span class="p">,</span> <span class="n">output_notebook</span><span class="p">,</span> <span class="n">show</span> <span class="kn">from</span> <span class="nn">bokeh.palettes</span> <span class="k">import</span> <span class="n">PuBuGn9</span> <span class="k">as</span> <span class="n">Palette</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> @@ -12882,7 +18118,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">))</span> +<div class=" highlight hl-ipython3"><pre><span class="n">city_forecasts</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">))</span> <span class="n">forecast_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">)</span> </pre></div> @@ -12896,31 +18132,31 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cary_forecast</span> <span class="o">=</span> <span class="n">forecast_df</span><span class="p">[</span><span class="s1">&#39;cary&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="n">cary_forecast</span> <span class="o">=</span> <span class="n">forecast_df</span><span class="p">[</span><span class="s">&#39;cary&#39;</span><span class="p">]</span> <span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2016</span><span class="p">)</span> <span class="n">months</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">12</span><span class="p">)</span> -<span class="n">months_str</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;July&#39;</span><span class="p">,</span> <span class="s1">&#39;August&#39;</span><span class="p">,</span> <span class="s1">&#39;September&#39;</span><span class="p">,</span> <span class="s1">&#39;October&#39;</span><span class="p">,</span> <span class="s1">&#39;November&#39;</span><span class="p">]</span> +<span class="n">months_str</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;July&#39;</span><span class="p">,</span> <span class="s">&#39;August&#39;</span><span class="p">,</span> <span class="s">&#39;September&#39;</span><span class="p">,</span> <span class="s">&#39;October&#39;</span><span class="p">,</span> <span class="s">&#39;November&#39;</span><span class="p">]</span> <span class="k">def</span> <span class="nf">safe_cover</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;cloudCover&#39;</span><span class="p">]</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;cloudCover&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;cloudCover&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">cloud_cover_vals</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> <span class="n">monthly_cover_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_avg_cloudcover</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Average Cloud Cover&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Average Cloud Cover&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_cover_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> @@ -12984,11 +18220,11 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">monthly_cloudy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">monthly_cloudy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">cloud_cover_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_cover</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">cloud_cover_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">cloud_cover_vals</span><span class="p">)))</span> <span class="n">cloudy_days</span> <span class="o">=</span> <span class="p">[</span><span class="n">cover</span> <span class="o">&gt;</span> <span class="o">.</span><span class="mi">5</span> <span class="k">for</span> <span class="n">cover</span> <span class="ow">in</span> <span class="n">cloud_cover_vals</span><span class="p">]</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">cloudy_days</span><span class="p">),</span> <span class="n">cloud_cover_samples</span> @@ -12996,16 +18232,16 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">monthly_days_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_cloudy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> <span class="n">monthly_cover_samples</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_cloudy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Cloudy Days&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Cloudy Days&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_days_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Cloud Cover Samples&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Cloud Cover Samples&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_cover_samples</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> @@ -13100,25 +18336,25 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s1">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> - <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s1">&#39;precipProbability&#39;</span><span class="p">]</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">safe_precip</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="k">if</span> <span class="n">frame</span> <span class="ow">and</span> <span class="s">&#39;precipProbability&#39;</span> <span class="ow">in</span> <span class="n">frame</span><span class="p">:</span> + <span class="k">return</span> <span class="n">frame</span><span class="p">[</span><span class="s">&#39;precipProbability&#39;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">monthly_avg_precip</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_vals</span><span class="p">)))</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nanmean</span><span class="p">(</span><span class="n">precip_vals</span><span class="p">),</span> <span class="n">precip_samples</span> <span class="n">monthly_avg_precip_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_avg_precip</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Average Precipitation Chance&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Average Precipitation Chance&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_avg_precip_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> @@ -13181,11 +18417,11 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">monthly_rainy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">monthly_rainy_days</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">):</span> <span class="n">dates</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DatetimeIndex</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> - <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">)</span> - <span class="n">precip_prob_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s1">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> + <span class="n">freq</span><span class="o">=</span><span class="s">&#39;D&#39;</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="s">&#39;left&#39;</span><span class="p">)</span> + <span class="n">precip_prob_vals</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">safe_precip</span><span class="p">(</span><span class="n">cary_forecast</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="s">&#39;currently&#39;</span><span class="p">]),</span> <span class="n">dates</span><span class="p">))</span> <span class="n">precip_prob_samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span><span class="p">,</span> <span class="n">precip_prob_vals</span><span class="p">)))</span> <span class="n">precip_days</span> <span class="o">=</span> <span class="p">[</span><span class="n">prob</span> <span class="o">&gt;</span> <span class="o">.</span><span class="mi">25</span> <span class="k">for</span> <span class="n">prob</span> <span class="ow">in</span> <span class="n">precip_prob_vals</span><span class="p">]</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">precip_days</span><span class="p">),</span> <span class="n">precip_prob_samples</span> @@ -13193,16 +18429,16 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">monthly_precip_days_vals</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_rainy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> <span class="n">monthly_precip_samples</span> <span class="o">=</span> <span class="p">[[</span><span class="n">monthly_rainy_days</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">months</span><span class="p">]</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Rainy Days&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Rainy Days&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">)</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_precip_days_vals</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">show</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">&#39;Monthly Rainy Days Samples&#39;</span><span class="p">,</span> +<span class="n">f</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Monthly Rainy Days Samples&#39;</span><span class="p">,</span> <span class="n">x_range</span><span class="o">=</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span> <span class="mi">2015</span><span class="p">),</span> - <span class="n">x_axis_label</span><span class="o">=</span><span class="s1">&#39;Year&#39;</span><span class="p">,</span> + <span class="n">x_axis_label</span><span class="o">=</span><span class="s">&#39;Year&#39;</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">months</span><span class="p">)):</span> <span class="n">f</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">years</span><span class="p">,</span> <span class="n">monthly_precip_samples</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">legend</span><span class="o">=</span><span class="n">months_str</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">Palette</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> @@ -13300,69 +18536,69 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="Generating-the-Forecast-file">Generating the Forecast file<a class="anchor-link" href="#Generating-the-Forecast-file">&#182;</a></h1><p>The following code was generates the file that was used throughout the blog post. Please note that I'm retrieving data for other cities to use in a future blog post, only Cary data was used for this post.</p> -<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> <span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="nb">reduce</span> <span class="kn">import</span> <span class="nn">requests</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span> -<span class="c1"># Coordinate data from http://itouchmap.com/latlong.html</span> +<span class="c"># Coordinate data from http://itouchmap.com/latlong.html</span> <span class="n">cary_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">35.79154</span><span class="p">,</span><span class="o">-</span><span class="mf">78.781117</span><span class="p">)</span> <span class="n">nyc_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">40.78306</span><span class="p">,</span><span class="o">-</span><span class="mf">73.971249</span><span class="p">)</span> <span class="n">seattle_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">47.60621</span><span class="p">,</span><span class="o">-</span><span class="mf">122.332071</span><span class="p">)</span> <span class="n">binghamton_loc</span> <span class="o">=</span> <span class="p">(</span><span class="mf">42.098687</span><span class="p">,</span><span class="o">-</span><span class="mf">75.917974</span><span class="p">)</span> <span class="n">cities</span> <span class="o">=</span> <span class="p">{</span> - <span class="s1">&#39;cary&#39;</span><span class="p">:</span> <span class="n">cary_loc</span><span class="p">,</span> - <span class="s1">&#39;nyc&#39;</span><span class="p">:</span> <span class="n">nyc_loc</span><span class="p">,</span> - <span class="s1">&#39;seattle&#39;</span><span class="p">:</span> <span class="n">seattle_loc</span><span class="p">,</span> - <span class="s1">&#39;binghamton&#39;</span><span class="p">:</span> <span class="n">binghamton_loc</span> + <span class="s">&#39;cary&#39;</span><span class="p">:</span> <span class="n">cary_loc</span><span class="p">,</span> + <span class="s">&#39;nyc&#39;</span><span class="p">:</span> <span class="n">nyc_loc</span><span class="p">,</span> + <span class="s">&#39;seattle&#39;</span><span class="p">:</span> <span class="n">seattle_loc</span><span class="p">,</span> + <span class="s">&#39;binghamton&#39;</span><span class="p">:</span> <span class="n">binghamton_loc</span> <span class="p">}</span> -<span class="n">apikey</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> <span class="c1"># My super-secret API Key</span> +<span class="n">apikey</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="c"># My super-secret API Key</span> <span class="k">def</span> <span class="nf">get_forecast</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">date</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> - <span class="n">forecast_base</span> <span class="o">=</span> <span class="s2">&quot;https://api.forecast.io/forecast/&quot;</span> + <span class="n">forecast_base</span> <span class="o">=</span> <span class="s">&quot;https://api.forecast.io/forecast/&quot;</span> <span class="k">if</span> <span class="n">date</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s1">&#39;/{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">)</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s">&#39;/{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">epoch</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s1">&#39;/{},{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">epoch</span><span class="p">)</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">forecast_base</span> <span class="o">+</span> <span class="n">apikey</span> <span class="o">+</span> <span class="s">&#39;/{},{},{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="n">epoch</span><span class="p">)</span> <span class="k">return</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="n">years</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span><span class="mi">2016</span><span class="p">)</span> -<span class="c1"># For datetimes, the 12 is for getting the weather at noon.</span> -<span class="c1"># We&#39;re doing this over midnight because we&#39;re more concerned</span> -<span class="c1"># with what people see, and people don&#39;t typically see the weather</span> -<span class="c1"># at midnight.</span> +<span class="c"># For datetimes, the 12 is for getting the weather at noon.</span> +<span class="c"># We&#39;re doing this over midnight because we&#39;re more concerned</span> +<span class="c"># with what people see, and people don&#39;t typically see the weather</span> +<span class="c"># at midnight.</span> <span class="n">dt_indices</span> <span class="o">=</span> <span class="p">[</span><span class="n">pd</span><span class="o">.</span><span class="n">date_range</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">12</span><span class="p">))</span> <span class="k">for</span> <span class="n">year</span> <span class="ow">in</span> <span class="n">years</span><span class="p">]</span> <span class="n">dt_merge</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">dt_indices</span><span class="p">)</span> -<span class="c1"># Because we have to pay a little bit to use the API, we use for loops here</span> -<span class="c1"># instead of a comprehension - if something breaks, we want to preserve the</span> -<span class="c1"># data already retrieved</span> +<span class="c"># Because we have to pay a little bit to use the API, we use for loops here</span> +<span class="c"># instead of a comprehension - if something breaks, we want to preserve the</span> +<span class="c"># data already retrieved</span> <span class="n">city_forecasts</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">city</span><span class="p">,</span> <span class="n">loc</span> <span class="ow">in</span> <span class="n">cities</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> - <span class="k">print</span><span class="p">(</span><span class="s2">&quot;Retrieving data for {} starting at {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> - <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> + <span class="k">print</span><span class="p">(</span><span class="s">&quot;Retrieving data for {} starting at {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> + <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> <span class="k">for</span> <span class="n">dt</span> <span class="ow">in</span> <span class="n">dt_merge</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">city_forecasts</span><span class="p">[(</span><span class="n">city</span><span class="p">,</span> <span class="n">dt</span><span class="p">)]</span> <span class="o">=</span> <span class="n">get_forecast</span><span class="p">(</span><span class="o">*</span><span class="n">loc</span><span class="p">,</span> <span class="n">dt</span><span class="p">)</span> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="n">city_forecasts</span><span class="p">[(</span><span class="n">city</span><span class="p">,</span> <span class="n">dt</span><span class="p">)]</span> <span class="o">=</span> <span class="bp">None</span> -<span class="k">print</span><span class="p">(</span><span class="s2">&quot;End forecast retrieval: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> +<span class="k">print</span><span class="p">(</span><span class="s">&quot;End forecast retrieval: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&quot;%I:%M:%S %p&quot;</span><span class="p">)))</span> <span class="kn">import</span> <span class="nn">pickle</span> -<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">))</span> +<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">city_forecasts</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;city_forecasts.p&#39;</span><span class="p">,</span> <span class="s">&#39;wb&#39;</span><span class="p">))</span> -<span class="c1">### Output:</span> -<span class="c1"># Retrieving data for binghamton starting at 05:13:42 PM</span> -<span class="c1"># Retrieving data for seattle starting at 05:30:51 PM</span> -<span class="c1"># Retrieving data for nyc starting at 05:48:30 PM</span> -<span class="c1"># Retrieving data for cary starting at 06:08:32 PM</span> -<span class="c1"># End forecast retrieval: 06:25:21 PM</span> +<span class="c">### Output:</span> +<span class="c"># Retrieving data for binghamton starting at 05:13:42 PM</span> +<span class="c"># Retrieving data for seattle starting at 05:30:51 PM</span> +<span class="c"># Retrieving data for nyc starting at 05:48:30 PM</span> +<span class="c"># Retrieving data for cary starting at 06:08:32 PM</span> +<span class="c"># End forecast retrieval: 06:25:21 PM</span> </pre></div> </div> @@ -13372,13 +18608,13 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">requests</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">requests</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">dateutil</span> <span class="k">import</span> <span class="n">parser</span> <span class="k">as</span> <span class="n">dtparser</span> @@ -13413,26 +18649,26 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">ArticleListParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> +<div class=" highlight hl-ipython3"><pre><span class="k">class</span> <span class="nc">ArticleListParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Given a web page with articles on it, parse out the article links&quot;&quot;&quot;</span> <span class="n">articles</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> - <span class="c1">#if tag == &#39;div&#39; and (&quot;id&quot;, &quot;author_articles_wrapper&quot;) in attrs:</span> - <span class="c1"># self.fetch_links = True</span> - <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;a&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">,</span> <span class="s1">&#39;dashboard_article_link&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> - <span class="n">href</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;href&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> + <span class="c">#if tag == &#39;div&#39; and (&quot;id&quot;, &quot;author_articles_wrapper&quot;) in attrs:</span> + <span class="c"># self.fetch_links = True</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;a&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;class&#39;</span><span class="p">,</span> <span class="s">&#39;dashboard_article_link&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> + <span class="n">href</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;href&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="bp">self</span><span class="o">.</span><span class="n">articles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">href</span><span class="p">)</span> -<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;http://seekingalpha.com/author/wall-street-breakfast/articles&quot;</span> -<span class="n">article_page_urls</span> <span class="o">=</span> <span class="p">[</span><span class="n">base_url</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">)]</span> +<span class="n">base_url</span> <span class="o">=</span> <span class="s">&quot;http://seekingalpha.com/author/wall-street-breakfast/articles&quot;</span> +<span class="n">article_page_urls</span> <span class="o">=</span> <span class="p">[</span><span class="n">base_url</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">base_url</span> <span class="o">+</span> <span class="s">&#39;/{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">)]</span> <span class="n">global_articles</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">page</span> <span class="ow">in</span> <span class="n">article_page_urls</span><span class="p">:</span> - <span class="c1"># We need to switch the user agent, as SA blocks the standard requests agent</span> + <span class="c"># We need to switch the user agent, as SA blocks the standard requests agent</span> <span class="n">articles_html</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> - <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> + <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArticleListParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">articles_html</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="n">global_articles</span> <span class="o">+=</span> <span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">articles</span><span class="p">)</span> @@ -13448,25 +18684,25 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">ArticleReturnParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> - <span class="s2">&quot;Given an article, parse out the futures returns in it&quot;</span> +<div class=" highlight hl-ipython3"><pre><span class="k">class</span> <span class="nc">ArticleReturnParser</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span> + <span class="s">&quot;Given an article, parse out the futures returns in it&quot;</span> - <span class="n">record_font_tags</span> <span class="o">=</span> <span class="kc">False</span> - <span class="n">in_font_tag</span> <span class="o">=</span> <span class="kc">False</span> + <span class="n">record_font_tags</span> <span class="o">=</span> <span class="k">False</span> + <span class="n">in_font_tag</span> <span class="o">=</span> <span class="k">False</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span> - <span class="c1"># data = {} # See __init__</span> + <span class="c"># data = {} # See __init__</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> - <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;span&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;itemprop&#39;</span><span class="p">,</span> <span class="s1">&#39;datePublished&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> - <span class="n">date_string</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;content&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> + <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;span&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;itemprop&#39;</span><span class="p">,</span> <span class="s">&#39;datePublished&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span> + <span class="n">date_string</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;content&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="n">date</span> <span class="o">=</span> <span class="n">dtparser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">date_string</span><span class="p">)</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span> - <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;font&#39;</span> + <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;font&#39;</span> <span class="k">def</span> <span class="nf">safe_float</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> @@ -13475,43 +18711,43 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">NaN</span> <span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span> - <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="s2">&quot;Futures at 6&quot;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="o">=</span> <span class="kc">True</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="s">&quot;Futures at 6&quot;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="o">=</span> <span class="k">True</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">record_font_tags</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;DOW&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;DOW&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;S&amp;P&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;S&amp;P&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;NASDAQ&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;NASDAQ&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;Crude&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;Crude&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;Gold&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s">&#39;Gold&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">safe_float</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">handle_endtag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> - <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="kc">False</span> + <span class="bp">self</span><span class="o">.</span><span class="n">in_font_tag</span> <span class="o">=</span> <span class="k">False</span> <span class="k">def</span> <span class="nf">retrieve_data</span><span class="p">(</span><span class="n">url</span><span class="p">):</span> - <span class="n">sa</span> <span class="o">=</span> <span class="s2">&quot;http://seekingalpha.com&quot;</span> + <span class="n">sa</span> <span class="o">=</span> <span class="s">&quot;http://seekingalpha.com&quot;</span> <span class="n">article_html</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sa</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span> - <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> + <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s">&quot;Wget/1.13.4&quot;</span><span class="p">})</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArticleReturnParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> - <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">url</span><span class="p">})</span> - <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">})</span> + <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&quot;url&quot;</span><span class="p">:</span> <span class="n">url</span><span class="p">})</span> + <span class="n">parser</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&quot;text&quot;</span><span class="p">:</span> <span class="n">article_html</span><span class="o">.</span><span class="n">text</span><span class="p">})</span> <span class="k">return</span> <span class="n">parser</span><span class="o">.</span><span class="n">data</span> -<span class="c1"># This copy **MUST** be in place. I&#39;m not sure why,</span> -<span class="c1"># as you&#39;d think that the data being returned would already</span> -<span class="c1"># represent a different memory location. Even so, it blows up</span> -<span class="c1"># if you don&#39;t do this.</span> +<span class="c"># This copy **MUST** be in place. I&#39;m not sure why,</span> +<span class="c"># as you&#39;d think that the data being returned would already</span> +<span class="c"># represent a different memory location. Even so, it blows up</span> +<span class="c"># if you don&#39;t do this.</span> <span class="n">article_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">global_articles</span><span class="p">))</span> <span class="n">article_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="p">(</span><span class="n">retrieve_data</span><span class="p">(</span><span class="n">url</span><span class="p">))</span> <span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">article_list</span><span class="p">]</span> -<span class="c1"># If there&#39;s an issue downloading the article, drop it.</span> +<span class="c"># If there&#39;s an issue downloading the article, drop it.</span> <span class="n">article_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">article_data</span><span class="p">)</span><span class="o">.</span><span class="n">dropna</span><span class="p">()</span> </pre></div> @@ -13535,12 +18771,12 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># article_df is sorted by date, so we get the first row.</span> -<span class="n">start_date</span> <span class="o">=</span> <span class="n">article_df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="s1">&#39;date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;date&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> -<span class="n">SPY</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/NYSE_SPY&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">DJIA</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/AMS_DIA&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">RUSS</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/AMEX_IWM&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> -<span class="n">NASDAQ</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;GOOG/EPA_QQQ&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<div class=" highlight hl-ipython3"><pre><span class="c"># article_df is sorted by date, so we get the first row.</span> +<span class="n">start_date</span> <span class="o">=</span> <span class="n">article_df</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="s">&#39;date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;date&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> +<span class="n">SPY</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/NYSE_SPY&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">DJIA</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/AMS_DIA&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">RUSS</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/AMEX_IWM&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> +<span class="n">NASDAQ</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;GOOG/EPA_QQQ&quot;</span><span class="p">,</span> <span class="n">trim_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">)</span> </pre></div> </div> @@ -13564,14 +18800,14 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">calculate_opening_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="c1"># I&#39;m not a huge fan of the appending for loop,</span> - <span class="c1"># but it&#39;s a bit verbose for a comprehension</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">calculate_opening_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="c"># I&#39;m not a huge fan of the appending for loop,</span> + <span class="c"># but it&#39;s a bit verbose for a comprehension</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="p">)):</span> <span class="n">date</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> - <span class="n">prior_close</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;Close&#39;</span><span class="p">]</span> - <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Open&#39;</span><span class="p">]</span> + <span class="n">prior_close</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> + <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Open&#39;</span><span class="p">]</span> <span class="n">data</span><span class="p">[</span><span class="n">date</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">open_val</span> <span class="o">-</span> <span class="n">prior_close</span><span class="p">)</span> <span class="o">/</span> <span class="n">prior_close</span> <span class="k">return</span> <span class="n">data</span> @@ -13582,8 +18818,8 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">NASDAQ_open_ret</span> <span class="o">=</span> <span class="n">calculate_opening_ret</span><span class="p">(</span><span class="n">NASDAQ</span><span class="p">)</span> <span class="k">def</span> <span class="nf">signs_match</span><span class="p">(</span><span class="n">list_1</span><span class="p">,</span> <span class="n">list_2</span><span class="p">):</span> - <span class="c1"># This is a surprisingly difficult task - we have to match</span> - <span class="c1"># up the dates in order to check if opening returns actually match</span> + <span class="c"># This is a surprisingly difficult task - we have to match</span> + <span class="c"># up the dates in order to check if opening returns actually match</span> <span class="n">index_dict_dt</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">():</span> <span class="n">list_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">list_2</span><span class="o">.</span><span class="n">keys</span><span class="p">()}</span> <span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span> @@ -13599,26 +18835,26 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> - <span class="c1">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> + <span class="c">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> <span class="k">return</span> <span class="n">matches</span> <span class="n">prediction_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">matches_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">count_dict</span> <span class="o">=</span> <span class="p">{}</span> -<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_open_ret</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_open_ret</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_open_ret</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_open_ret</span><span class="p">}</span> -<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;SPY&quot;</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">]</span> -<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Crude&quot;</span><span class="p">,</span> <span class="s2">&quot;Gold&quot;</span><span class="p">,</span> <span class="s2">&quot;DOW&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s2">&quot;S&amp;P&quot;</span><span class="p">]</span> +<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_open_ret</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_open_ret</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_open_ret</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_open_ret</span><span class="p">}</span> +<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SPY&quot;</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">]</span> +<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Crude&quot;</span><span class="p">,</span> <span class="s">&quot;Gold&quot;</span><span class="p">,</span> <span class="s">&quot;DOW&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s">&quot;S&amp;P&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">indices</span><span class="p">:</span> - <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s1">&#39;date&#39;</span><span class="p">]],</span> + <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s">&#39;date&#39;</span><span class="p">]],</span> <span class="n">index_dict</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">count_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">prediction_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Articles Checked: &quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Articles Checked: &quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">count_dict</span><span class="p">))</span> <span class="nb">print</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">prediction_dict</span><span class="p">))</span> </pre></div> @@ -13677,14 +18913,14 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">calculate_closing_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> - <span class="c1"># I&#39;m not a huge fan of the appending for loop,</span> - <span class="c1"># but it&#39;s a bit verbose for a comprehension</span> +<div class=" highlight hl-ipython3"><pre><span class="k">def</span> <span class="nf">calculate_closing_ret</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> + <span class="c"># I&#39;m not a huge fan of the appending for loop,</span> + <span class="c"># but it&#39;s a bit verbose for a comprehension</span> <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="p">)):</span> <span class="n">date</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> - <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Open&#39;</span><span class="p">]</span> - <span class="n">close_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">&#39;Close&#39;</span><span class="p">]</span> + <span class="n">open_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Open&#39;</span><span class="p">]</span> + <span class="n">close_val</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&#39;Close&#39;</span><span class="p">]</span> <span class="n">data</span><span class="p">[</span><span class="n">date</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">close_val</span> <span class="o">-</span> <span class="n">open_val</span><span class="p">)</span> <span class="o">/</span> <span class="n">open_val</span> <span class="k">return</span> <span class="n">data</span> @@ -13695,8 +18931,8 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <span class="n">NASDAQ_close_ret</span> <span class="o">=</span> <span class="n">calculate_closing_ret</span><span class="p">(</span><span class="n">NASDAQ</span><span class="p">)</span> <span class="k">def</span> <span class="nf">signs_match</span><span class="p">(</span><span class="n">list_1</span><span class="p">,</span> <span class="n">list_2</span><span class="p">):</span> - <span class="c1"># This is a surprisingly difficult task - we have to match</span> - <span class="c1"># up the dates in order to check if opening returns actually match</span> + <span class="c"># This is a surprisingly difficult task - we have to match</span> + <span class="c"># up the dates in order to check if opening returns actually match</span> <span class="n">index_dict_dt</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">():</span> <span class="n">list_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">list_2</span><span class="o">.</span><span class="n">keys</span><span class="p">()}</span> <span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span> @@ -13712,28 +18948,28 @@ S&amp;P 0.604478 0.597015 0.811808 0.848708 <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">matches</span> <span class="o">+=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> - <span class="c1">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> + <span class="c">#print(&quot;{}&quot;.format(list_2[index_dt]))</span> <span class="k">return</span> <span class="n">matches</span> <span class="n">matches_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">count_dict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">prediction_dict</span> <span class="o">=</span> <span class="p">{}</span> -<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_close_ret</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_close_ret</span><span class="p">,</span> - <span class="s2">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_close_ret</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_close_ret</span><span class="p">}</span> -<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;SPY&quot;</span><span class="p">,</span> <span class="s2">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s2">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">]</span> -<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Crude&quot;</span><span class="p">,</span> <span class="s2">&quot;Gold&quot;</span><span class="p">,</span> <span class="s2">&quot;DOW&quot;</span><span class="p">,</span> <span class="s2">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s2">&quot;S&amp;P&quot;</span><span class="p">]</span> +<span class="n">index_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;SPY&quot;</span><span class="p">:</span> <span class="n">SPY_close_ret</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">:</span> <span class="n">DJIA_close_ret</span><span class="p">,</span> + <span class="s">&quot;RUSS&quot;</span><span class="p">:</span> <span class="n">RUSS_close_ret</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">:</span> <span class="n">NASDAQ_close_ret</span><span class="p">}</span> +<span class="n">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SPY&quot;</span><span class="p">,</span> <span class="s">&quot;DJIA&quot;</span><span class="p">,</span> <span class="s">&quot;RUSS&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">]</span> +<span class="n">futures</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Crude&quot;</span><span class="p">,</span> <span class="s">&quot;Gold&quot;</span><span class="p">,</span> <span class="s">&quot;DOW&quot;</span><span class="p">,</span> <span class="s">&quot;NASDAQ&quot;</span><span class="p">,</span> <span class="s">&quot;S&amp;P&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">indices</span><span class="p">:</span> - <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s1">&#39;date&#39;</span><span class="p">]],</span> + <span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">signs_match</span><span class="p">(</span><span class="n">article_df</span><span class="p">[[</span><span class="n">future</span><span class="p">,</span> <span class="s">&#39;date&#39;</span><span class="p">]],</span> <span class="n">index_dict</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">count_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> <span class="n">prediction_dict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">future</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">matches_dict</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">future</span><span class="p">])</span> <span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="n">futures</span><span class="p">}</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Articles Checked:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Articles Checked:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">count_dict</span><span class="p">))</span> <span class="nb">print</span><span class="p">()</span> -<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s">&quot;Prediction Accuracy:&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">prediction_dict</span><span class="p">))</span> </pre></div> @@ -13795,7 +19031,7 @@ S&amp;P 0.585821 0.608209 0.535055 0.535055 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. Because these are all very similar, we decided to demonstrate all 3 products at once.</p> <p>What follows below is a notebook demonstrating the usage of <a href="http://julialang.com">Julia</a> for Monte-Carlo simulation of some exotic products.</p> <p> @@ -13804,7 +19040,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="k">using</span> <span class="n">Gadfly</span> +<div class=" highlight hl-julia"><pre><span class="k">using</span> <span class="n">Gadfly</span> </pre></div> </div> @@ -13840,10 +19076,10 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">S0</span> <span class="o">=</span> <span class="mf">102.2</span> +<div class=" highlight hl-julia"><pre><span class="n">S0</span> <span class="o">=</span> <span class="mf">102.2</span> <span class="n">nominal</span> <span class="o">=</span> <span class="mi">100</span> <span class="n">q</span> <span class="o">=</span> <span class="mf">2.84</span> <span class="o">/</span> <span class="mi">100</span> -<span class="n">σ</span> <span class="o">=</span> <span class="mf">15.37</span> <span class="o">/</span> <span class="mi">100</span> +<span class="err">σ</span> <span class="o">=</span> <span class="mf">15.37</span> <span class="o">/</span> <span class="mi">100</span> <span class="n">term</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">.</span><span class="mi">49</span><span class="p">,</span> <span class="o">.</span><span class="mi">9</span><span class="p">,</span> <span class="mf">1.21</span><span class="p">,</span> <span class="mf">1.45</span><span class="p">,</span> <span class="mf">1.69</span><span class="p">]</span> <span class="o">/</span> <span class="mi">100</span> <span class="o">+</span> <span class="mi">1</span> <span class="c">###</span> @@ -13896,7 +19132,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">simulate_gbm</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">simulate_gbm</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="c"># Set the initial state</span> <span class="n">m</span> <span class="o">=</span> <span class="n">length</span><span class="p">(</span><span class="n">S0</span><span class="p">)</span> <span class="n">t</span> <span class="o">=</span> <span class="n">T</span> <span class="o">/</span> <span class="n">n</span> @@ -13905,7 +19141,7 @@ Because these are all very similar, we decided to demonstrate all 3 products at <span class="c"># Build out all states</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> - <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">((</span><span class="n">μ</span> <span class="o">-</span> <span class="n">σ</span><span class="o">^</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">t</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">*</span> <span class="n">σ</span> <span class="o">.*</span> <span class="n">randn</span><span class="p">(</span><span class="n">m</span><span class="p">))</span> + <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">motion</span><span class="p">[:,</span><span class="n">i</span><span class="p">]</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">((</span><span class="err">μ</span> <span class="o">-</span> <span class="err">σ</span><span class="o">^</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">t</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">*</span> <span class="err">σ</span> <span class="o">.*</span> <span class="n">randn</span><span class="p">(</span><span class="n">m</span><span class="p">))</span> <span class="k">end</span> <span class="k">return</span> <span class="n">motion</span> @@ -13967,9 +19203,9 @@ Because these are all very similar, we decided to demonstrate all 3 products at <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">initial</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">initial</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="c"># Using μ=0, T=.25 for now, we&#39;ll use the proper values later</span> -<span class="n">motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">initial</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span> +<span class="n">motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">initial</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span> <span class="n">display_motion</span><span class="p">(</span><span class="n">motion</span><span class="p">,</span> <span class="o">.</span><span class="mi">25</span><span class="p">)</span> </pre></div> @@ -15575,7 +20811,7 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">forward_term</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">yearly_term</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">forward_term</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">yearly_term</span><span class="p">)</span> <span class="c"># It is assumed that we have a yearly term structure passed in, and starts at year 0</span> <span class="c"># This implies a nominal rate above 0 for the first year!</span> <span class="n">years</span> <span class="o">=</span> <span class="n">length</span><span class="p">(</span><span class="n">term</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="c"># because we start at 0</span> @@ -15605,14 +20841,14 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[6]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="c"># Example term structure taken from:</span> +<div class=" highlight hl-julia"><pre><span class="c"># Example term structure taken from:</span> <span class="c"># http://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yield</span> <span class="c"># Linear interpolation used years in-between periods, assuming real-dollar</span> <span class="c"># interest rates</span> <span class="n">forward_yield</span> <span class="o">=</span> <span class="n">forward_term</span><span class="p">(</span><span class="n">term</span><span class="p">)</span> <span class="n">calculated_term2</span> <span class="o">=</span> <span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">forward_yield</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Actual term[2]: </span><span class="si">$(term[2])</span><span class="s">; Calculated term[2]: </span><span class="si">$(calculated_term2)</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Actual term[2]: </span><span class="si">$</span><span class="s">(term[2]); Calculated term[2]: </span><span class="si">$(calculated_term2)</span><span class="s">&quot;</span><span class="p">)</span> </pre></div> </div> @@ -15649,11 +20885,11 @@ fig.select("#fig-3a6dd25ad25c4037a166889ee51bb151-element-20") <div class="prompt input_prompt">In&nbsp;[7]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">full_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">full_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="n">full_term</span> <span class="o">=</span> <span class="n">vcat</span><span class="p">(</span><span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">forward_yield</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">T</span> - <span class="n">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">full_term</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> - <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">full_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="err">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">full_term</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> + <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">full_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">full_motion</span> <span class="o">=</span> <span class="n">hcat</span><span class="p">(</span><span class="n">full_motion</span><span class="p">,</span> <span class="n">year_motion</span><span class="p">)</span> <span class="k">end</span> @@ -17210,14 +22446,14 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <div class="prompt input_prompt">In&nbsp;[8]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">full_simulation</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> +<div class=" highlight hl-julia"><pre><span class="n">full_simulation</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> <span class="n">forward</span> <span class="o">=</span> <span class="n">vcat</span><span class="p">(</span><span class="n">term</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">forward_term</span><span class="p">(</span><span class="n">term</span><span class="p">))</span> <span class="c"># And an S0 to kick things off.</span> <span class="n">final_motion</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="o">*</span> <span class="n">S0</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">T</span> - <span class="n">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">forward</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> - <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">final_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="n">μ</span><span class="p">,</span> <span class="n">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="err">μ</span> <span class="o">=</span> <span class="p">(</span><span class="n">forward</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">q</span><span class="p">)</span> + <span class="n">year_motion</span> <span class="o">=</span> <span class="n">simulate_gbm</span><span class="p">(</span><span class="n">final_motion</span><span class="p">[:,</span><span class="k">end</span><span class="p">],</span> <span class="err">μ</span><span class="p">,</span> <span class="err">σ</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">final_motion</span> <span class="o">=</span> <span class="n">hcat</span><span class="p">(</span><span class="n">final_motion</span><span class="p">,</span> <span class="n">year_motion</span><span class="p">)</span> <span class="k">end</span> <span class="k">return</span> <span class="n">final_motion</span> @@ -17226,7 +22462,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="n">tic</span><span class="p">()</span> <span class="n">full_simulation</span><span class="p">(</span><span class="n">S0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Time to run simulation: </span><span class="si">%.2f</span><span class="s">s&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Time to run simulation: %.2fs&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> </pre></div> </div> @@ -17271,7 +22507,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <div class="prompt input_prompt">In&nbsp;[9]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">strike</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">07</span> @@ -17285,7 +22521,7 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">t</span> <span class="n">price</span> <span class="o">=</span> <span class="n">year_prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> - <span class="k">if</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">call_barrier</span> + <span class="k">if</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">call_barrier</span> <span class="k">return</span> <span class="p">(</span><span class="n">nominal</span> <span class="o">+</span> <span class="n">coupon</span><span class="o">*</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">exp</span><span class="p">((</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="k">end</span><span class="p">])</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">t</span><span class="o">-</span><span class="n">i</span><span class="p">))</span> <span class="k">end</span> <span class="k">end</span> @@ -17315,13 +22551,13 @@ fig.select("#fig-0378e04b897742b597befd2e8e1c169e-element-20") <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">athena</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="p">(</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Athena note: \$</span><span class="si">%.2f</span><span class="s">, notional: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">,</span> <span class="n">nominal</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Athena note: \</span><span class="si">$</span><span class="s">%.2f, notional: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">,</span> <span class="n">nominal</span><span class="p">)</span> </pre></div> </div> @@ -17382,7 +22618,7 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <div class="prompt input_prompt">In&nbsp;[10]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">coupon_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">8</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">06</span> @@ -17395,9 +22631,9 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">t</span> <span class="n">price</span> <span class="o">=</span> <span class="n">year_prices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> - <span class="k">if</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">call_barrier</span> + <span class="k">if</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">call_barrier</span> <span class="k">return</span> <span class="p">(</span><span class="n">nominal</span> <span class="o">+</span> <span class="n">coupon</span> <span class="o">+</span> <span class="n">total_coupons</span><span class="p">)</span><span class="o">*</span><span class="n">exp</span><span class="p">((</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="k">end</span><span class="p">])</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">t</span><span class="o">-</span><span class="n">i</span><span class="p">))</span> - <span class="k">elseif</span> <span class="n">price</span> <span class="n">≥</span> <span class="n">coupon_barrier</span> + <span class="k">elseif</span> <span class="n">price</span> <span class="err">≥</span> <span class="n">coupon_barrier</span> <span class="n">total_coupons</span> <span class="o">=</span> <span class="n">total_coupons</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">coupon</span> <span class="k">else</span> <span class="n">total_coupons</span> <span class="o">*=</span> <span class="n">exp</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> @@ -17429,13 +22665,13 @@ Present value of Athena note: $95.00, notional: $100.00</pre> <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">phoenix_no_memory</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix without memory note: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix without memory note: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> </pre></div> </div> @@ -17482,7 +22718,7 @@ Present value of Phoenix without memory note: $97.44</pre> <div class="prompt input_prompt">In&nbsp;[11]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-julia"><pre><span></span><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> +<div class=" highlight hl-julia"><pre><span class="n">call_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="n">coupon_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">8</span> <span class="n">protection_barrier</span> <span class="o">=</span> <span class="n">S0</span> <span class="o">*</span> <span class="o">.</span><span class="mi">6</span> <span class="n">coupon</span> <span class="o">=</span> <span class="n">nominal</span> <span class="o">*</span> <span class="o">.</span><span class="mi">07</span> @@ -17536,14 +22772,14 @@ Present value of Phoenix without memory note: $97.44</pre> <span class="n">tic</span><span class="p">()</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">phoenix_with_memory</span><span class="p">()</span> <span class="n">time</span> <span class="o">=</span> <span class="n">toq</span><span class="p">()</span> - <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation </span><span class="si">%i</span><span class="s">: \$</span><span class="si">%.4f</span><span class="s">; Simulation time: </span><span class="si">%.2f</span><span class="s">s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> + <span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mean of simulation %i: \</span><span class="si">$</span><span class="s">%.4f; Simulation time: %.2fs</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">mean_payoffs</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">time</span><span class="p">)</span> <span class="k">end</span> <span class="n">final_mean</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">mean_payoffs</span><span class="p">)</span> -<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$num_simulations</span><span class="s"> simulations: </span><span class="si">$(mean(mean_payoffs))</span><span class="s">&quot;</span><span class="p">)</span> +<span class="n">println</span><span class="p">(</span><span class="s">&quot;Mean over </span><span class="si">$</span><span class="s">num_simulations simulations: </span><span class="si">$</span><span class="s">(mean(mean_payoffs))&quot;</span><span class="p">)</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">final_mean</span> <span class="o">*</span> <span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">prod</span><span class="p">(</span><span class="n">forward_structure</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">T</span><span class="p">))</span> -<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix with memory note: \$</span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> +<span class="p">@</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Present value of Phoenix with memory note: \</span><span class="si">$</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">pv</span><span class="p">)</span> </pre></div> </div> @@ -17574,7 +22810,7 @@ Present value of Phoenix with memory note: $100.09</pre> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University studying Financial Engineering, and want to give an overview of the projects I'm working on!</p> <p>To start things off, Columbia has been hosting a trading competition that @@ -17645,16 +22881,16 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[1]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">display</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">display</span> <span class="kn">import</span> <span class="nn">Quandl</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> -<span class="n">tickers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;XOM&#39;</span><span class="p">,</span> <span class="s1">&#39;CVX&#39;</span><span class="p">,</span> <span class="s1">&#39;CLB&#39;</span><span class="p">,</span> <span class="s1">&#39;OXY&#39;</span><span class="p">,</span> <span class="s1">&#39;SLB&#39;</span><span class="p">]</span> -<span class="n">market_ticker</span> <span class="o">=</span> <span class="s1">&#39;GOOG/NYSE_VOO&#39;</span> +<span class="n">tickers</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;XOM&#39;</span><span class="p">,</span> <span class="s">&#39;CVX&#39;</span><span class="p">,</span> <span class="s">&#39;CLB&#39;</span><span class="p">,</span> <span class="s">&#39;OXY&#39;</span><span class="p">,</span> <span class="s">&#39;SLB&#39;</span><span class="p">]</span> +<span class="n">market_ticker</span> <span class="o">=</span> <span class="s">&#39;GOOG/NYSE_VOO&#39;</span> <span class="n">lookback</span> <span class="o">=</span> <span class="mi">30</span> -<span class="n">d_col</span> <span class="o">=</span> <span class="s1">&#39;Close&#39;</span> +<span class="n">d_col</span> <span class="o">=</span> <span class="s">&#39;Close&#39;</span> -<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;YAHOO/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tick</span><span class="p">))[</span><span class="o">-</span><span class="n">lookback</span><span class="p">:]</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> +<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;YAHOO/{}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tick</span><span class="p">))[</span><span class="o">-</span><span class="n">lookback</span><span class="p">:]</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">market</span> <span class="o">=</span> <span class="n">Quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">market_ticker</span><span class="p">)</span> </pre></div> @@ -17678,7 +22914,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[2]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">returns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="n">tick</span><span class="p">][</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> +<div class=" highlight hl-ipython3"><pre><span class="n">returns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="n">tick</span><span class="p">][</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">display</span><span class="p">({</span><span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">})</span> </pre></div> @@ -17724,7 +22960,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[3]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">market_returns</span> <span class="o">=</span> <span class="n">market</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">market_returns</span> <span class="o">=</span> <span class="n">market</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span> <span class="n">sharpe</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="p">(</span><span class="n">ret</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span> <span class="o">-</span> <span class="n">market_returns</span><span class="p">[</span><span class="n">d_col</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">())</span> <span class="o">/</span> <span class="n">ret</span><span class="o">.</span><span class="n">std</span><span class="p">()</span> <span class="n">sharpes</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">sharpe</span><span class="p">(</span><span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">])</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> @@ -17772,7 +23008,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="prompt input_prompt">In&nbsp;[4]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="n">drawdown</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="n">ret</span><span class="o">.</span><span class="n">abs</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> +<div class=" highlight hl-ipython3"><pre><span class="n">drawdown</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ret</span><span class="p">:</span> <span class="n">ret</span><span class="o">.</span><span class="n">abs</span><span class="p">()</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="n">drawdowns</span> <span class="o">=</span> <span class="p">{</span><span class="n">tick</span><span class="p">:</span> <span class="n">drawdown</span><span class="p">(</span><span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">])</span> <span class="k">for</span> <span class="n">tick</span> <span class="ow">in</span> <span class="n">tickers</span><span class="p">}</span> <span class="n">display</span><span class="p">(</span><span class="n">drawdowns</span><span class="p">)</span> @@ -17825,25 +23061,25 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="prompt input_prompt">In&nbsp;[5]:</div> <div class="inner_cell"> <div class="input_area"> -<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<div class=" highlight hl-ipython3"><pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">scipy.optimize</span> <span class="k">import</span> <span class="n">minimize</span> -<span class="c1">#sharpe_limit = .1</span> +<span class="c">#sharpe_limit = .1</span> <span class="n">drawdown_limit</span> <span class="o">=</span> <span class="o">.</span><span class="mi">05</span> <span class="n">leverage</span> <span class="o">=</span> <span class="mi">250</span> -<span class="c1"># Use the map so we can guarantee we maintain the correct order</span> -<span class="c1"># sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound</span> +<span class="c"># Use the map so we can guarantee we maintain the correct order</span> +<span class="c"># sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound</span> <span class="n">dd_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">drawdowns</span><span class="p">[</span><span class="n">tick</span><span class="p">],</span> <span class="n">tickers</span><span class="p">)))</span> -<span class="n">returns_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">tickers</span><span class="p">)))</span> <span class="c1"># Because minimizing</span> +<span class="n">returns_a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">tick</span><span class="p">:</span> <span class="n">returns</span><span class="p">[</span><span class="n">tick</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">tickers</span><span class="p">)))</span> <span class="c"># Because minimizing</span> <span class="n">meets_sharpe</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">sharpe_a</span><span class="p">)</span> <span class="o">-</span> <span class="n">sharpe_limit</span> <span class="k">def</span> <span class="nf">meets_dd</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="n">portfolio</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">if</span> <span class="n">portfolio</span> <span class="o">&lt;</span> <span class="o">.</span><span class="mi">1</span><span class="p">:</span> - <span class="c1"># If there are no stocks in the portfolio,</span> - <span class="c1"># we can accidentally induce division by 0,</span> - <span class="c1"># or division by something small enough to cause infinity</span> + <span class="c"># If there are no stocks in the portfolio,</span> + <span class="c"># we can accidentally induce division by 0,</span> + <span class="c"># or division by something small enough to cause infinity</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">return</span> <span class="n">drawdown_limit</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">dd_a</span><span class="p">)</span> <span class="o">/</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> @@ -17853,41 +23089,41 @@ s.t.\ \ & \vec{1} \omega = 1\\ <span class="k">def</span> <span class="nf">within_leverage</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">leverage</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> -<span class="n">objective</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">returns_a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># Because we&#39;re minimizing</span> -<span class="n">bounds</span> <span class="o">=</span> <span class="p">((</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">),)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">)</span> +<span class="n">objective</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">returns_a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span> <span class="c"># Because we&#39;re minimizing</span> +<span class="n">bounds</span> <span class="o">=</span> <span class="p">((</span><span class="k">None</span><span class="p">,</span> <span class="k">None</span><span class="p">),)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">)</span> <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">tickers</span><span class="p">))</span> <span class="n">constraints</span> <span class="o">=</span> <span class="p">[</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;eq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">is_portfolio</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;eq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">is_portfolio</span> <span class="p">},</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;ineq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">within_leverage</span> - <span class="c1">#}, {</span> - <span class="c1"># &#39;type&#39;: &#39;ineq&#39;,</span> - <span class="c1"># &#39;fun&#39;: meets_sharpe</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;ineq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">within_leverage</span> + <span class="c">#}, {</span> + <span class="c"># &#39;type&#39;: &#39;ineq&#39;,</span> + <span class="c"># &#39;fun&#39;: meets_sharpe</span> <span class="p">},</span> <span class="p">{</span> - <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;ineq&#39;</span><span class="p">,</span> - <span class="s1">&#39;fun&#39;</span><span class="p">:</span> <span class="n">meets_dd</span> + <span class="s">&#39;type&#39;</span><span class="p">:</span> <span class="s">&#39;ineq&#39;</span><span class="p">,</span> + <span class="s">&#39;fun&#39;</span><span class="p">:</span> <span class="n">meets_dd</span> <span class="p">}</span> <span class="p">]</span> <span class="n">optimal</span> <span class="o">=</span> <span class="n">minimize</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="n">bounds</span><span class="p">,</span> <span class="n">constraints</span><span class="o">=</span><span class="n">constraints</span><span class="p">,</span> - <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;maxiter&#39;</span><span class="p">:</span> <span class="mi">500</span><span class="p">})</span> + <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;maxiter&#39;</span><span class="p">:</span> <span class="mi">500</span><span class="p">})</span> -<span class="c1"># Optimization time!</span> +<span class="c"># Optimization time!</span> <span class="n">display</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">message</span><span class="p">)</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Holdings: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">tickers</span><span class="p">,</span> <span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))))</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Holdings: {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">tickers</span><span class="p">,</span> <span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))))</span> -<span class="n">expected_return</span> <span class="o">=</span> <span class="n">optimal</span><span class="o">.</span><span class="n">fun</span> <span class="o">*</span> <span class="o">-</span><span class="mi">100</span> <span class="c1"># multiply by -100 to scale, and compensate for minimizing</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Expected Return: </span><span class="si">{:.3f}</span><span class="s2">%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_return</span><span class="p">))</span> +<span class="n">expected_return</span> <span class="o">=</span> <span class="n">optimal</span><span class="o">.</span><span class="n">fun</span> <span class="o">*</span> <span class="o">-</span><span class="mi">100</span> <span class="c"># multiply by -100 to scale, and compensate for minimizing</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Expected Return: {:.3f}%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_return</span><span class="p">))</span> <span class="n">expected_drawdown</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">dd_a</span><span class="p">)</span> <span class="o">/</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">optimal</span><span class="o">.</span><span class="n">x</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span> -<span class="n">display</span><span class="p">(</span><span class="s2">&quot;Expected Max Drawdown: </span><span class="si">{0:.2f}</span><span class="s2">%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_drawdown</span><span class="p">))</span> +<span class="n">display</span><span class="p">(</span><span class="s">&quot;Expected Max Drawdown: {0:.2f}%&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_drawdown</span><span class="p">))</span> -<span class="c1"># TODO: Calculate expected Sharpe</span> +<span class="c"># TODO: Calculate expected Sharpe</span> </pre></div> </div> diff --git a/guaranteed-money-maker.html b/guaranteed-money-maker.html index dd6a062..c28b38c 100644 --- a/guaranteed-money-maker.html +++ b/guaranteed-money-maker.html @@ -153,7 +153,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i})
In [1]:
-
using Quandl
+
using Quandl
 api_key = ""
 daily_investment = function(current_open, current_close, purchase_history, open_history)
     # We're not going to safeguard against divide by 0 - that's the user's responsibility
@@ -183,7 +183,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i})
 
In [2]:
-
is_profitable = function(current_price, purchase_history, open_history)
+
is_profitable = function(current_price, purchase_history, open_history)
     shares = sum(purchase_history ./ open_history)
     return current_price*shares > sum(purchase_history)
 end
@@ -218,8 +218,8 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i})
     leverages = [sum(investments[1:i]) for i=1:length(investments)]
     max_leverage = maximum(leverages) / investments[1]
     println("Max leverage: $(max_leverage)")
-    println("Days invested: $(length(investments))")
-    println("Profit: $profit")
+    println("Days invested: $(length(investments))")
+    println("Profit: $profit")
 end;
 
@@ -246,7 +246,7 @@ d_n &> \frac{o_n}{c_n - o_n} \sum_{i=1}^{n-1} d_i(1 - \frac{1}{o_i})
In [3]:
-
investments, profit = simulate("YAHOO/LMT", Date(2015, 11, 29), 100, 1.01, 10)
+
investments, profit = simulate("YAHOO/LMT", Date(2015, 11, 29), 100, 1.01, 10)
 sim_summary(investments, profit)
 
@@ -289,7 +289,7 @@ Profit: 0.6894803101560001
In [4]:
-
investments, profit = simulate("YAHOO/LMT", Date(2015, 11, 29), 100, 1.02, 10)
+
investments, profit = simulate("YAHOO/LMT", Date(2015, 11, 29), 100, 1.02, 10)
 sim_summary(investments, profit)
 
diff --git a/index.html b/index.html index d6b86f4..4cf8857 100644 --- a/index.html +++ b/index.html @@ -83,6 +83,8 @@

+
Wed 08 June 2016
+
Event Studies and Earnings Releases
Sun 15 May 2016
The Unfair Casino
Wed 06 April 2016
@@ -101,8 +103,6 @@
Complaining about the Weather
Sat 26 December 2015
Testing Cramer
-
Fri 27 November 2015
-
Autocallable Bonds
diff --git a/index2.html b/index2.html index b2b5810..ca596ec 100644 --- a/index2.html +++ b/index2.html @@ -83,6 +83,8 @@

- page 2

+
Fri 27 November 2015
+
Autocallable Bonds
Thu 19 November 2015
Welcome, and an algorithm
diff --git a/predicting-santander-customer-happiness.html b/predicting-santander-customer-happiness.html index 465ef22..871635f 100644 --- a/predicting-santander-customer-happiness.html +++ b/predicting-santander-customer-happiness.html @@ -103,18 +103,18 @@
In [1]:
-
import pandas as pd
+
import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 %matplotlib inline
 
-# Record how long it takes to run the notebook - I'm curious.
+# Record how long it takes to run the notebook - I'm curious.
 from datetime import datetime
 start = datetime.now()
 
-dataset = pd.read_csv('split_train.csv')
+dataset = pd.read_csv('split_train.csv')
 dataset.index = dataset.ID
-X = dataset.drop(['TARGET', 'ID', 'ID.1'], 1)
+X = dataset.drop(['TARGET', 'ID', 'ID.1'], 1)
 y = dataset.TARGET
 
@@ -128,7 +128,7 @@
In [2]:
-
y.unique()
+
y.unique()
 
@@ -157,7 +157,7 @@
In [3]:
-
len(X.columns)
+
len(X.columns)
 
@@ -199,7 +199,7 @@
In [4]:
-
cols = X.columns
+
cols = X.columns
 b_class = []
 for c in cols:
     if len(X[c].unique()) == 2:
@@ -244,13 +244,13 @@
 
In [5]:
-
# First we need to `binarize` the data to 0-1; some of the labels are {0, 1},
-# some are {0, 3}, etc.
+
# First we need to `binarize` the data to 0-1; some of the labels are {0, 1},
+# some are {0, 3}, etc.
 from sklearn.preprocessing import binarize
 X_bin = binarize(X[b_class])
 
 accuracy = [np.mean(X_bin[:,i] == y) for i in range(0, len(b_class))]
-acc_df = pd.DataFrame({"Accuracy": accuracy}, index=b_class)
+acc_df = pd.DataFrame({"Accuracy": accuracy}, index=b_class)
 acc_df.describe()
 
@@ -333,10 +333,10 @@
In [6]:
-
unsat = y[y == 1].count()
-print("Satisfied customers: {}; Unsatisfied customers: {}".format(len(y) - unsat, unsat))
+
unsat = y[y == 1].count()
+print("Satisfied customers: {}; Unsatisfied customers: {}".format(len(y) - unsat, unsat))
 naive_guess = np.mean(y == np.zeros(len(y)))
-print("Naive guess accuracy: {}".format(naive_guess))
+print("Naive guess accuracy: {}".format(naive_guess))
 
@@ -383,7 +383,7 @@ Naive guess accuracy: 0.9608561656706882
In [7]:
-
from sklearn.naive_bayes import GaussianNB
+
from sklearn.naive_bayes import GaussianNB
 from sklearn.decomposition import PCA
 
 X_no_bin = X.drop(b_class, 1)
@@ -397,9 +397,9 @@ Naive guess accuracy: 0.9608561656706882
     return gnb.score(X_xform, y)
 
 dim_range = np.arange(1, 21)
-plt.plot(dim_range, [evaluate_gnb(dim) for dim in dim_range], label="Gaussian NB Accuracy")
-plt.axhline(naive_guess, label="Naive Guess", c='k')
-plt.axhline(1 - naive_guess, label="Inverse Naive Guess", c='k')
+plt.plot(dim_range, [evaluate_gnb(dim) for dim in dim_range], label="Gaussian NB Accuracy")
+plt.axhline(naive_guess, label="Naive Guess", c='k')
+plt.axhline(1 - naive_guess, label="Inverse Naive Guess", c='k')
 plt.gcf().set_size_inches(12, 6)
 plt.legend();
 
@@ -674,7 +674,7 @@ rkJggg==
In [8]:
-
def evaluate_gnb_full(dims):
+
def evaluate_gnb_full(dims):
     pca = PCA(n_components=dims)
     X_xform = pca.fit_transform(X)
     
@@ -683,9 +683,9 @@ rkJggg==
     return gnb.score(X_xform, y)
 
 dim_range = np.arange(1, 21)
-plt.plot(dim_range, [evaluate_gnb(dim) for dim in dim_range], label="Gaussian NB Accuracy")
-plt.axhline(naive_guess, label="Naive Guess", c='k')
-plt.axhline(1 - naive_guess, label="Inverse Naive Guess", c='k')
+plt.plot(dim_range, [evaluate_gnb(dim) for dim in dim_range], label="Gaussian NB Accuracy")
+plt.axhline(naive_guess, label="Naive Guess", c='k')
+plt.axhline(1 - naive_guess, label="Inverse Naive Guess", c='k')
 plt.gcf().set_size_inches(12, 6)
 plt.legend();
 
@@ -960,8 +960,8 @@ rkJggg==
In [9]:
-
end = datetime.now()
-print("Running time: {}".format(end - start))
+
end = datetime.now()
+print("Running time: {}".format(end - start))
 
@@ -989,15 +989,15 @@ rkJggg==

Appendix

Code used to split the initial training data:

-
from sklearn.cross_validation import train_test_split
-data = pd.read_csv('train.csv')
+
from sklearn.cross_validation import train_test_split
+data = pd.read_csv('train.csv')
 data.index = data.ID
 
 data_train, data_validate = train_test_split(
     data, train_size=.7)
 
-data_train.to_csv('split_train.csv')
-data_validate.to_csv('split_validate.csv')
+data_train.to_csv('split_train.csv')
+data_validate.to_csv('split_validate.csv')
 
diff --git a/profitability-using-the-investment-formula.html b/profitability-using-the-investment-formula.html index 78b2fc6..e665456 100644 --- a/profitability-using-the-investment-formula.html +++ b/profitability-using-the-investment-formula.html @@ -118,12 +118,12 @@
In [19]:
-
import numpy as np
+
import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 from Quandl import get as qget
 %matplotlib inline
-api_key = ''
+api_key = ''
 
 profitability = lambda p, i, m, d: 1000*p / (m + i*d)
 
@@ -147,15 +147,15 @@
         expected_close = open_vals[day] * expected
         todays_purchase = daily_investment(open_vals[day], expected_close, invested, open_vals[0:day])
         invested = np.append(invested, todays_purchase + bias)
-        # expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()
+        # expected_profit = expected_close * (invested / open_vals[0:len(invested)]).sum() - invested.sum()
         day += 1
         profitable = is_profitable(close_vals[day-1], invested, open_vals[0:len(invested)]) \
             or is_profitable(open_vals[day], invested, open_vals[0:len(invested)])
             
     shares = (invested / open_vals[0:len(invested)]).sum()
     
-    # Make sure we can't see into the future - we know either today's close or tomorrow's open
-    # will be profitable, but we need to check which one.
+    # Make sure we can't see into the future - we know either today's close or tomorrow's open
+    # will be profitable, but we need to check which one.
     if is_profitable(close_vals[day-1], invested, open_vals[0:len(invested)]):
         ending_price = close_vals[day-1]
     else:
@@ -168,21 +168,21 @@
     ticker_info = qget(name, trim_start=start, api_key=api_key)
     evaluation_times = ticker_info[:end].index
     
-    # Handle Google vs. YFinance data
-    if "Adjusted Close" in ticker_info.columns:
-        close_column = "Adjusted Close"
+    # Handle Google vs. YFinance data
+    if "Adjusted Close" in ticker_info.columns:
+        close_column = "Adjusted Close"
     else:
-        close_column = "Close"
+        close_column = "Close"
         
-    sim = {d: simulate_day(ticker_info[d:]["Open"], ticker_info[d:][close_column],
+    sim = {d: simulate_day(ticker_info[d:]["Open"], ticker_info[d:][close_column],
                        100, 1.02, 10) for d in evaluation_times}
     sim_series = pd.Series(sim)
     result = pd.DataFrame()
-    result["profit"] = sim_series.apply(lambda x: x[1])
-    result["max"] = sim_series.apply(lambda x: max(x[0]))
-    result["days"] = sim_series.apply(lambda x: len(x[0]))
-    result["score"] = sim_series.apply(lambda x: profitability(x[1], x[0][0], max(x[0]), len(x[0])))
-    result["investments"] = sim_series.apply(lambda x: x[0])
+    result["profit"] = sim_series.apply(lambda x: x[1])
+    result["max"] = sim_series.apply(lambda x: max(x[0]))
+    result["days"] = sim_series.apply(lambda x: len(x[0]))
+    result["score"] = sim_series.apply(lambda x: profitability(x[1], x[0][0], max(x[0]), len(x[0])))
+    result["investments"] = sim_series.apply(lambda x: x[0])
     
     return result
 
@@ -217,7 +217,7 @@
 
In [7]:
-
fang_df = simulate_tickers(["YAHOO/FB", "YAHOO/AAPL", "YAHOO/NFLX", "YAHOO/GOOG"])
+
fang_df = simulate_tickers(["YAHOO/FB", "YAHOO/AAPL", "YAHOO/NFLX", "YAHOO/GOOG"])
 
@@ -230,9 +230,9 @@
In [8]:
-
fang_df.xs('days', axis=1, level=1).hist()
+
fang_df.xs('days', axis=1, level=1).hist()
 plt.gcf().set_size_inches(18, 8);
-plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
+plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
 
@@ -704,9 +704,9 @@ kiSpNScYJEmSJElSa04wSJIkSZKk1pxgkCRJkiRJrf1/uiw9D8O0d6EAAAAASUVORK5CYII=
In [10]:
-
fang_df.xs('score', axis=1, level=1).plot()
+
fang_df.xs('score', axis=1, level=1).plot()
 plt.gcf().set_size_inches(18, 6)
-plt.gcf().suptitle("Profitability score over time", fontsize=18);
+plt.gcf().suptitle("Profitability score over time", fontsize=18);
 
@@ -2343,7 +2343,7 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC
In [13]:
-
cyclic_df = simulate_tickers(["YAHOO/X", "YAHOO/CAT", "YAHOO/NFLX", "YAHOO/GOOG"])
+
cyclic_df = simulate_tickers(["YAHOO/X", "YAHOO/CAT", "YAHOO/NFLX", "YAHOO/GOOG"])
 
@@ -2356,9 +2356,9 @@ EZIkSZIkSZIkSZIk6RIpIiRJkiRJkiRJkiRJ0iX+D91jLOlExGw8AAAAAElFTkSuQmCC
In [14]:
-
cyclic_df.xs('days', axis=1, level=1).hist()
+
cyclic_df.xs('days', axis=1, level=1).hist()
 plt.gcf().set_size_inches(18, 8);
-plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
+plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
 
@@ -2844,9 +2844,9 @@ JEmSJEnSwGwwSJIkSZKkgdlgkCRJkiRJA7PBIEmSJEmSBvb/AfKAew4+oiojAAAAAElFTkSuQmCC
In [15]:
-
cyclic_df.xs('score', axis=1, level=1).plot()
+
cyclic_df.xs('score', axis=1, level=1).plot()
 plt.gcf().set_size_inches(18, 6)
-plt.gcf().suptitle("Profitability score over time", fontsize=18);
+plt.gcf().suptitle("Profitability score over time", fontsize=18);
 
@@ -4629,7 +4629,7 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC
In [21]:
-
biotech_df = simulate_tickers(['YAHOO/REGN', 'YAHOO/CELG', 'GOOG/NASDAQ_BIB', 'GOOG/NASDAQ_IBB'])
+
biotech_df = simulate_tickers(['YAHOO/REGN', 'YAHOO/CELG', 'GOOG/NASDAQ_BIB', 'GOOG/NASDAQ_IBB'])
 
@@ -4642,9 +4642,9 @@ hUKhUCgUpor/A9AnO0PoIItTAAAAAElFTkSuQmCC
In [22]:
-
biotech_df.xs('days', axis=1, level=1).hist()
+
biotech_df.xs('days', axis=1, level=1).hist()
 plt.gcf().set_size_inches(18, 8);
-plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
+plt.gcf().suptitle("Distribution of Days Until Profitability", fontsize=18);
 
@@ -5195,9 +5195,9 @@ WKBTQVcCAAAAAElFTkSuQmCC
In [23]:
-
biotech_df.xs('score', axis=1, level=1).plot()
+
biotech_df.xs('score', axis=1, level=1).plot()
 plt.gcf().set_size_inches(18, 6)
-plt.gcf().suptitle("Profitability score over time", fontsize=18);
+plt.gcf().suptitle("Profitability score over time", fontsize=18);
 
diff --git a/tag/earnings.html b/tag/earnings.html new file mode 100644 index 0000000..3dde4b5 --- /dev/null +++ b/tag/earnings.html @@ -0,0 +1,123 @@ + + + + + + + + + + + earnings - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #earnings

+
+

#earnings

+
+
+
+
+ + +
+ + + + +
+
+

earnings

+
+
Wed 08 June 2016
+
Event Studies and Earnings Releases
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tag/event-study.html b/tag/event-study.html new file mode 100644 index 0000000..9d3c91e --- /dev/null +++ b/tag/event-study.html @@ -0,0 +1,123 @@ + + + + + + + + + + + event study - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #event study

+
+

#event study

+
+
+
+
+ + +
+ + + + +
+
+

event study

+
+
Wed 08 June 2016
+
Event Studies and Earnings Releases
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tags.html b/tags.html index 5966554..85f91f3 100644 --- a/tags.html +++ b/tags.html @@ -89,8 +89,12 @@
3 articles
data science
1 article
+
earnings
+
1 article
em
1 article
+
event study
+
1 article
finance
1 article
fitbit
diff --git a/testing-cramer.html b/testing-cramer.html index f1ef310..91d489d 100644 --- a/testing-cramer.html +++ b/testing-cramer.html @@ -4,7 +4,7 @@ - + @@ -92,7 +92,7 @@
In [1]:
-
import requests
+
import requests
 import pandas as pd
 import numpy as np
 from dateutil import parser as dtparser
@@ -127,26 +127,26 @@
 
In [2]:
-
class ArticleListParser(HTMLParser):
+
class ArticleListParser(HTMLParser):
     """Given a web page with articles on it, parse out the article links"""
     
     articles = []
     
     def handle_starttag(self, tag, attrs):
-        #if tag == 'div' and ("id", "author_articles_wrapper") in attrs:
-        #    self.fetch_links = True
-        if tag == 'a' and ('class', 'dashboard_article_link') in attrs:
-            href = list(filter(lambda x: x[0] == 'href', attrs))[0][1]
+        #if tag == 'div' and ("id", "author_articles_wrapper") in attrs:
+        #    self.fetch_links = True
+        if tag == 'a' and ('class', 'dashboard_article_link') in attrs:
+            href = list(filter(lambda x: x[0] == 'href', attrs))[0][1]
             self.articles.append(href)
             
-base_url = "http://seekingalpha.com/author/wall-street-breakfast/articles"
-article_page_urls = [base_url] + [base_url + '/{}'.format(i) for i in range(2, 20)]
+base_url = "http://seekingalpha.com/author/wall-street-breakfast/articles"
+article_page_urls = [base_url] + [base_url + '/{}'.format(i) for i in range(2, 20)]
 
 global_articles = []
 for page in article_page_urls:
-    # We need to switch the user agent, as SA blocks the standard requests agent
+    # We need to switch the user agent, as SA blocks the standard requests agent
     articles_html = requests.get(page,
-                                headers={"User-Agent": "Wget/1.13.4"})
+                                headers={"User-Agent": "Wget/1.13.4"})
     parser = ArticleListParser()
     parser.feed(articles_html.text)
     global_articles += (parser.articles)
@@ -162,25 +162,25 @@
 
In [3]:
-
class ArticleReturnParser(HTMLParser):
-    "Given an article, parse out the futures returns in it"
+
class ArticleReturnParser(HTMLParser):
+    "Given an article, parse out the futures returns in it"
     
-    record_font_tags = False
-    in_font_tag = False
+    record_font_tags = False
+    in_font_tag = False
     counter = 0
-    # data = {} # See __init__
+    # data = {} # See __init__
     
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.data = {}
     
     def handle_starttag(self, tag, attrs):
-        if tag == 'span' and ('itemprop', 'datePublished') in attrs:
-            date_string = list(filter(lambda x: x[0] == 'content', attrs))[0][1]
+        if tag == 'span' and ('itemprop', 'datePublished') in attrs:
+            date_string = list(filter(lambda x: x[0] == 'content', attrs))[0][1]
             date = dtparser.parse(date_string)
-            self.data['date'] = date
+            self.data['date'] = date
             
-        self.in_font_tag = tag == 'font'
+        self.in_font_tag = tag == 'font'
         
     def safe_float(self, string):
         try:
@@ -189,43 +189,43 @@
             return np.NaN
             
     def handle_data(self, content):
-        if not self.record_font_tags and "Futures at 6" in content:
-            self.record_font_tags = True
+        if not self.record_font_tags and "Futures at 6" in content:
+            self.record_font_tags = True
             
         if self.record_font_tags and self.in_font_tag:
             if self.counter == 0:
-                self.data['DOW'] = self.safe_float(content)
+                self.data['DOW'] = self.safe_float(content)
             elif self.counter == 1:
-                self.data['S&P'] = self.safe_float(content)
+                self.data['S&P'] = self.safe_float(content)
             elif self.counter == 2:
-                self.data['NASDAQ'] = self.safe_float(content)
+                self.data['NASDAQ'] = self.safe_float(content)
             elif self.counter == 3:
-                self.data['Crude'] = self.safe_float(content)
+                self.data['Crude'] = self.safe_float(content)
             elif self.counter == 4:
-                self.data['Gold'] = self.safe_float(content)
+                self.data['Gold'] = self.safe_float(content)
             
             self.counter += 1
             
     def handle_endtag(self, tag):
-        self.in_font_tag = False
+        self.in_font_tag = False
 
 def retrieve_data(url):
-    sa = "http://seekingalpha.com"
+    sa = "http://seekingalpha.com"
     article_html = requests.get(sa + url,
-                               headers={"User-Agent": "Wget/1.13.4"})
+                               headers={"User-Agent": "Wget/1.13.4"})
     parser = ArticleReturnParser()
     parser.feed(article_html.text)
-    parser.data.update({"url": url})
-    parser.data.update({"text": article_html.text})
+    parser.data.update({"url": url})
+    parser.data.update({"text": article_html.text})
     return parser.data
 
-# This copy **MUST** be in place. I'm not sure why,
-# as you'd think that the data being returned would already
-# represent a different memory location. Even so, it blows up
-# if you don't do this.
+# This copy **MUST** be in place. I'm not sure why,
+# as you'd think that the data being returned would already
+# represent a different memory location. Even so, it blows up
+# if you don't do this.
 article_list = list(set(global_articles))
 article_data = [copy(retrieve_data(url)) for url in article_list]
-# If there's an issue downloading the article, drop it.
+# If there's an issue downloading the article, drop it.
 article_df = pd.DataFrame.from_dict(article_data).dropna()
 
@@ -249,12 +249,12 @@
In [4]:
-
# article_df is sorted by date, so we get the first row.
-start_date = article_df.sort_values(by='date').iloc[0]['date'] - relativedelta(days=1)
-SPY = Quandl.get("GOOG/NYSE_SPY", trim_start=start_date)
-DJIA = Quandl.get("GOOG/AMS_DIA", trim_start=start_date)
-RUSS = Quandl.get("GOOG/AMEX_IWM", trim_start=start_date)
-NASDAQ = Quandl.get("GOOG/EPA_QQQ", trim_start=start_date)
+
# article_df is sorted by date, so we get the first row.
+start_date = article_df.sort_values(by='date').iloc[0]['date'] - relativedelta(days=1)
+SPY = Quandl.get("GOOG/NYSE_SPY", trim_start=start_date)
+DJIA = Quandl.get("GOOG/AMS_DIA", trim_start=start_date)
+RUSS = Quandl.get("GOOG/AMEX_IWM", trim_start=start_date)
+NASDAQ = Quandl.get("GOOG/EPA_QQQ", trim_start=start_date)
 
@@ -278,14 +278,14 @@
In [5]:
-
def calculate_opening_ret(frame):
-    # I'm not a huge fan of the appending for loop,
-    # but it's a bit verbose for a comprehension
+
def calculate_opening_ret(frame):
+    # I'm not a huge fan of the appending for loop,
+    # but it's a bit verbose for a comprehension
     data = {}
     for i in range(1, len(frame)):
         date = frame.iloc[i].name
-        prior_close = frame.iloc[i-1]['Close']
-        open_val = frame.iloc[i]['Open']
+        prior_close = frame.iloc[i-1]['Close']
+        open_val = frame.iloc[i]['Open']
         data[date] = (open_val - prior_close) / prior_close
         
     return data
@@ -296,8 +296,8 @@
 NASDAQ_open_ret = calculate_opening_ret(NASDAQ)
 
 def signs_match(list_1, list_2):
-    # This is a surprisingly difficult task - we have to match
-    # up the dates in order to check if opening returns actually match
+    # This is a surprisingly difficult task - we have to match
+    # up the dates in order to check if opening returns actually match
     index_dict_dt = {key.to_datetime(): list_2[key] for key in list_2.keys()}
     
     matches = []
@@ -313,26 +313,26 @@
                     matches += [1]
             else:
                 matches += [0]
-            #print("{}".format(list_2[index_dt]))
+            #print("{}".format(list_2[index_dt]))
     return matches
     
     
 prediction_dict = {}
 matches_dict = {}
 count_dict = {}
-index_dict = {"SPY": SPY_open_ret, "DJIA": DJIA_open_ret, "RUSS": RUSS_open_ret, "NASDAQ": NASDAQ_open_ret}
-indices = ["SPY", "DJIA", "RUSS", "NASDAQ"]
-futures = ["Crude", "Gold", "DOW", "NASDAQ", "S&P"]
+index_dict = {"SPY": SPY_open_ret, "DJIA": DJIA_open_ret, "RUSS": RUSS_open_ret, "NASDAQ": NASDAQ_open_ret}
+indices = ["SPY", "DJIA", "RUSS", "NASDAQ"]
+futures = ["Crude", "Gold", "DOW", "NASDAQ", "S&P"]
 for index in indices:
-    matches_dict[index] = {future: signs_match(article_df[[future, 'date']],
+    matches_dict[index] = {future: signs_match(article_df[[future, 'date']],
                                                index_dict[index]) for future in futures}
     count_dict[index] = {future: len(matches_dict[index][future]) for future in futures}
     prediction_dict[index] = {future: np.mean(matches_dict[index][future])
                               for future in futures}
-print("Articles Checked: ")
+print("Articles Checked: ")
 print(pd.DataFrame.from_dict(count_dict))
 print()
-print("Prediction Accuracy:")
+print("Prediction Accuracy:")
 print(pd.DataFrame.from_dict(prediction_dict))
 
@@ -391,14 +391,14 @@ S&P 0.604478 0.597015 0.811808 0.848708
In [6]:
-
def calculate_closing_ret(frame):
-    # I'm not a huge fan of the appending for loop,
-    # but it's a bit verbose for a comprehension
+
def calculate_closing_ret(frame):
+    # I'm not a huge fan of the appending for loop,
+    # but it's a bit verbose for a comprehension
     data = {}
     for i in range(0, len(frame)):
         date = frame.iloc[i].name
-        open_val = frame.iloc[i]['Open']
-        close_val = frame.iloc[i]['Close']
+        open_val = frame.iloc[i]['Open']
+        close_val = frame.iloc[i]['Close']
         data[date] = (close_val - open_val) / open_val
         
     return data
@@ -409,8 +409,8 @@ S&P     0.604478  0.597015  0.811808  0.848708
 NASDAQ_close_ret = calculate_closing_ret(NASDAQ)
 
 def signs_match(list_1, list_2):
-    # This is a surprisingly difficult task - we have to match
-    # up the dates in order to check if opening returns actually match
+    # This is a surprisingly difficult task - we have to match
+    # up the dates in order to check if opening returns actually match
     index_dict_dt = {key.to_datetime(): list_2[key] for key in list_2.keys()}
     
     matches = []
@@ -426,28 +426,28 @@ S&P     0.604478  0.597015  0.811808  0.848708
                     matches += [1]
             else:
                 matches += [0]
-            #print("{}".format(list_2[index_dt]))
+            #print("{}".format(list_2[index_dt]))
     return matches
     
     
 matches_dict = {}
 count_dict = {}
 prediction_dict = {}
-index_dict = {"SPY": SPY_close_ret, "DJIA": DJIA_close_ret,
-              "RUSS": RUSS_close_ret, "NASDAQ": NASDAQ_close_ret}
-indices = ["SPY", "DJIA", "RUSS", "NASDAQ"]
-futures = ["Crude", "Gold", "DOW", "NASDAQ", "S&P"]
+index_dict = {"SPY": SPY_close_ret, "DJIA": DJIA_close_ret,
+              "RUSS": RUSS_close_ret, "NASDAQ": NASDAQ_close_ret}
+indices = ["SPY", "DJIA", "RUSS", "NASDAQ"]
+futures = ["Crude", "Gold", "DOW", "NASDAQ", "S&P"]
 for index in indices:
-    matches_dict[index] = {future: signs_match(article_df[[future, 'date']],
+    matches_dict[index] = {future: signs_match(article_df[[future, 'date']],
                                                index_dict[index]) for future in futures}
     count_dict[index] = {future: len(matches_dict[index][future]) for future in futures}
     prediction_dict[index] = {future: np.mean(matches_dict[index][future])
                               for future in futures}
     
-print("Articles Checked:")
+print("Articles Checked:")
 print(pd.DataFrame.from_dict(count_dict))
 print()
-print("Prediction Accuracy:")
+print("Prediction Accuracy:")
 print(pd.DataFrame.from_dict(prediction_dict))
 
diff --git a/the-unfair-casino.html b/the-unfair-casino.html index ceba5a4..5540ca1 100644 --- a/the-unfair-casino.html +++ b/the-unfair-casino.html @@ -4,7 +4,7 @@ - + @@ -106,7 +106,7 @@
In [1]:
-
import numpy as np
+
import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 %matplotlib inline
@@ -114,8 +114,8 @@
 fair_1 = np.random.randint(1, 7, 10000)
 fair_2 = np.random.randint(1, 7, 10000)
 
-pd.Series(fair_1 + fair_2).plot(kind='hist', bins=11);
-plt.title('Fair Distribution');
+pd.Series(fair_1 + fair_2).plot(kind='hist', bins=11);
+plt.title('Fair Distribution');
 
@@ -316,7 +316,7 @@ D_2 = \left\{
In [2]:
-
def unfair_die(p_vals, n):
+
def unfair_die(p_vals, n):
     x = np.random.multinomial(1, p_vals, n)
     return x.nonzero()[1] + 1
 
@@ -326,8 +326,8 @@ D_2 = \left\{
 x1 = unfair_die(d1, 10000)
 x2 = unfair_die(d2, 10000)
 
-pd.Series(x1 + x2).plot(kind='hist', bins=11);
-plt.title('$D_1$ biased low, $D_2$ biased high');
+pd.Series(x1 + x2).plot(kind='hist', bins=11);
+plt.title('$D_1$ biased low, $D_2$ biased high');
 
@@ -519,14 +519,14 @@ D_2 = \left\{
In [3]:
-
d1 = [1/3, 1/12, 1/12, 1/12, 1/12, 1/3]
+
d1 = [1/3, 1/12, 1/12, 1/12, 1/12, 1/3]
 d2 = d1
 
 x1 = unfair_die(d1, 10000)
 x2 = unfair_die(d2, 10000)
 
-pd.Series(x1 + x2).plot(kind='hist', bins=11)
-plt.title("$D_1$ and $D_2$ biased to 1 and 6");
+pd.Series(x1 + x2).plot(kind='hist', bins=11)
+plt.title("$D_1$ and $D_2$ biased to 1 and 6");
 
@@ -742,22 +742,22 @@ and continue the next iteration.
In [5]:
-
import numpy as np
+
import numpy as np
 from numpy import polynomial
 
 def density_coef(d1_density, d2_density):
-    # Calculating the probabilities of each outcome was taken
-    # from this author: http://math.stackexchange.com/a/1710392/320784
+    # Calculating the probabilities of each outcome was taken
+    # from this author: http://math.stackexchange.com/a/1710392/320784
     d1_p = polynomial.Polynomial(d1_density)
     d2_p = polynomial.Polynomial(d2_density)
     coefs = (d1_p * d2_p).coef
     return coefs
 
 def score(x, d1_density, d2_density):
-    # We've now got the probabilities of each event, but we need
-    # to shift the array a bit so we can use the x values to actually
-    # index into it. This will allow us to do all the calculations
-    # incredibly quickly
+    # We've now got the probabilities of each event, but we need
+    # to shift the array a bit so we can use the x values to actually
+    # index into it. This will allow us to do all the calculations
+    # incredibly quickly
     coefs = density_coef(d1_density, d2_density)
     coefs = np.hstack((0, 0, coefs))
     return np.log(coefs[x]).sum()
@@ -783,24 +783,24 @@ and continue the next iteration.
 
In [6]:
-
def permute(d1_density, d2_density):
-    # To ensure we have legitimate densities, we will randomly
-    # increase one die face probability by `change`,
-    # and decrease one by `change`.
-    # This means there are something less than (1/`change`)^12 possibilities
-    # we are trying to search over.
+
def permute(d1_density, d2_density):
+    # To ensure we have legitimate densities, we will randomly
+    # increase one die face probability by `change`,
+    # and decrease one by `change`.
+    # This means there are something less than (1/`change`)^12 possibilities
+    # we are trying to search over.
     change = .01
     
     d1_index1, d1_index2 = np.random.randint(0, 6, 2)
     d2_index1, d2_index2 = np.random.randint(0, 6, 2)
     
-    # Also make sure to copy. I've had some weird aliasing issues
-    # in the past that made everything blow up.
+    # Also make sure to copy. I've had some weird aliasing issues
+    # in the past that made everything blow up.
     new_d1 = np.float64(np.copy(d1_density))
     new_d2 = np.float64(np.copy(d2_density))
     
-    # While this doesn't account for the possibility that some
-    # values go negative, in practice this never happens
+    # While this doesn't account for the possibility that some
+    # values go negative, in practice this never happens
     new_d1[d1_index1] += change
     new_d1[d1_index2] -= change
     new_d2[d2_index1] += change
@@ -829,28 +829,28 @@ and continue the next iteration.
 
In [7]:
-
def optimize(data, conv_count=10, max_iter=1e4):
+
def optimize(data, conv_count=10, max_iter=1e4):
     switch_failures = 0
     iter_count = 0
     
-    # Start with guessing fair dice
+    # Start with guessing fair dice
     cur_d1 = np.repeat(1/6, 6)
     cur_d2 = np.repeat(1/6, 6)
     cur_score = score(data, cur_d1, cur_d2)
     
-    # Keep track of our best guesses - may not be
-    # what we end with
+    # Keep track of our best guesses - may not be
+    # what we end with
     max_score = cur_score
     max_d1 = cur_d1
     max_d2 = cur_d2
     
-    # Optimization stops when we have failed to switch `conv_count`
-    # times (presumably because we have a great guess), or we reach
-    # the maximum number of iterations.
+    # Optimization stops when we have failed to switch `conv_count`
+    # times (presumably because we have a great guess), or we reach
+    # the maximum number of iterations.
     while switch_failures < conv_count and iter_count < max_iter:
         iter_count += 1
         if iter_count % (max_iter / 10) == 0:
-            print('Iteration: {}; Current score (higher is better): {}'.format(
+            print('Iteration: {}; Current score (higher is better): {}'.format(
                     iter_count, cur_score))
                 
         new_d1, new_d2 = permute(cur_d1, cur_d2)
@@ -862,19 +862,19 @@ and continue the next iteration.
             max_d2 = new_d2
             
         if new_score > cur_score:
-            # If the new permutation beats the old one,
-            # automatically select it.
+            # If the new permutation beats the old one,
+            # automatically select it.
             cur_score = new_score
             cur_d1 = new_d1
             cur_d2 = new_d2
             switch_failures = 0
         else:
-            # We didn't beat the current score, but allow
-            # for possibly switching anyways.
+            # We didn't beat the current score, but allow
+            # for possibly switching anyways.
             accept_prob = np.exp(new_score - cur_score)
             coin_toss = np.random.rand()
             if coin_toss < accept_prob:
-                # We randomly switch to the new distribution
+                # We randomly switch to the new distribution
                 cur_score = new_score
                 cur_d1 = new_d1
                 cur_d2 = new_d2
@@ -882,7 +882,7 @@ and continue the next iteration.
             else:
                 switch_failures += 1
             
-    # Return both our best guess, and the ending guess
+    # Return both our best guess, and the ending guess
     return max_d1, max_d2, cur_d1, cur_d2
 
@@ -908,7 +908,7 @@ and continue the next iteration.
In [8]:
-
import time
+
import time
 def simulate_casino(d1_dist, d2_dist, n=10000):
     d1_vals = unfair_die(d1_dist, n)
     d2_vals = unfair_die(d2_dist, n)
@@ -916,20 +916,20 @@ and continue the next iteration.
     start = time.perf_counter()
     max_d1, max_d2, final_d1, final_d2 = optimize(d1_vals + d2_vals)
     end = time.perf_counter()
-    print("Simulated Annealing time: {:.02f}s".format(end - start))
+    print("Simulated Annealing time: {:.02f}s".format(end - start))
     
     coef_range = np.arange(2, 13) - .5
     plt.subplot(221)
     plt.bar(coef_range, density_coef(d1_dist, d2_dist), width=1)
-    plt.title('True Distribution')
+    plt.title('True Distribution')
     
     plt.subplot(222)
     plt.hist(d1_vals + d2_vals, bins=11)
-    plt.title('Empirical Distribution')
+    plt.title('Empirical Distribution')
     
     plt.subplot(223)
     plt.bar(coef_range, density_coef(max_d1, max_d2), width=1)
-    plt.title('Recovered Distribution')
+    plt.title('Recovered Distribution')
     
     plt.gcf().set_size_inches(10, 10)
 
@@ -1310,7 +1310,7 @@ m+QFBkHwS1PQ018D5wD/PHxt/03H/cxXeHtR0jLn4qiSJEkNdH17UZIkaUUwdEmSJDVg6JIkSWrA
 
In [9]:
-
simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],
+
simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],
                 [1/3, 1/12, 1/12, 1/12, 1/12, 1/3])
 
@@ -1638,7 +1638,7 @@ jAU+qF/bLxXO081keTEiTnJpjhoRERHRgNLLixEREREjQoquiIiIiAak6IqIiIhoQIquiIiIiAak
In [10]:
-
simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],
+
simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],
                 [1/12, 1/12, 1/3, 1/3, 1/12, 1/12])
 
@@ -2012,7 +2012,7 @@ RK5CYII=
In [11]:
-
simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6))
+
simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6))
 
@@ -2403,7 +2403,7 @@ hoSz1PA0AAAAAElFTkSuQmCC
In [12]:
-
simulate_casino([1/9, 1/9, 1/9, 2/9, 2/9, 2/9],
+
simulate_casino([1/9, 1/9, 1/9, 2/9, 2/9, 2/9],
                 [1/9, 1/9, 1/9, 2/9, 2/9, 2/9],
                 n=250)
 
diff --git a/tick-tock.html b/tick-tock.html index 8a9ef8a..b0c971b 100644 --- a/tick-tock.html +++ b/tick-tock.html @@ -105,7 +105,7 @@
In [1]:
-
total_heartbeats = 2500000000
+
total_heartbeats = 2500000000
 
@@ -137,7 +137,7 @@
In [2]:
-
# Import all the OAuth secret information from a local file
+
# Import all the OAuth secret information from a local file
 from secrets import CLIENT_SECRET, CLIENT_ID, CALLBACK_URL
 
@@ -176,19 +176,19 @@ Application: Thank you, now give me all the data.
In [3]:
-
import urllib
+
import urllib
 
-FITBIT_URI = 'https://www.fitbit.com/oauth2/authorize'
+FITBIT_URI = 'https://www.fitbit.com/oauth2/authorize'
 params = {
-    # If we need more than one scope, must be a CSV string
-    'scope': 'heartrate',
-    'response_type': 'token',
-    'expires_in': 86400, # 1 day
-    'redirect_uri': CALLBACK_URL,
-    'client_id': CLIENT_ID
+    # If we need more than one scope, must be a CSV string
+    'scope': 'heartrate',
+    'response_type': 'token',
+    'expires_in': 86400, # 1 day
+    'redirect_uri': CALLBACK_URL,
+    'client_id': CLIENT_ID
 }
 
-request_url = FITBIT_URI + '?' + urllib.parse.urlencode(params)
+request_url = FITBIT_URI + '?' + urllib.parse.urlencode(params)
 
@@ -211,10 +211,10 @@ Application: Thank you, now give me all the data.
In [6]:
-
# The `response_url` variable contains the full URL that
-# FitBit sent back to us, but most importantly,
-# contains the token we need for authorization.
-access_token = dict(urllib.parse.parse_qsl(response_url))['access_token']
+
# The `response_url` variable contains the full URL that
+# FitBit sent back to us, but most importantly,
+# contains the token we need for authorization.
+access_token = dict(urllib.parse.parse_qsl(response_url))['access_token']
 
@@ -238,46 +238,46 @@ Application: Thank you, now give me all the data.
In [7]:
-
from requests_oauthlib import OAuth2Session
+
from requests_oauthlib import OAuth2Session
 import pandas as pd
 from datetime import datetime
 
 session = OAuth2Session(token={
-        'access_token': access_token,
-        'token_type': 'Bearer'
+        'access_token': access_token,
+        'token_type': 'Bearer'
     })
 
-format_str = '%Y-%m-%d'
+format_str = '%Y-%m-%d'
 start_date = datetime(2016, 1, 1)
 end_date = datetime(2016, 3, 31)
 dr = pd.date_range(start_date, end_date)
 
-url = 'https://api.fitbit.com/1/user/-/activities/heart/date/{0}/1d/1min.json'
+url = 'https://api.fitbit.com/1/user/-/activities/heart/date/{0}/1d/1min.json'
 hr_responses = [session.get(url.format(d.strftime(format_str))) for d in dr]
 
 def record_to_df(record):
-    if 'activities-heart' not in record:
-        return None
-    date_str = record['activities-heart'][0]['dateTime']
-    df = pd.DataFrame(record['activities-heart-intraday']['dataset'])
+    if 'activities-heart' not in record:
+        return None
+    date_str = record['activities-heart'][0]['dateTime']
+    df = pd.DataFrame(record['activities-heart-intraday']['dataset'])
         
-    df.index = df['time'].apply(
-        lambda x: datetime.strptime(date_str + ' ' + x, '%Y-%m-%d %H:%M:%S'))
+    df.index = df['time'].apply(
+        lambda x: datetime.strptime(date_str + ' ' + x, '%Y-%m-%d %H:%M:%S'))
     return df
 
 hr_dataframes = [record_to_df(record.json()) for record in hr_responses]
 hr_df_concat = pd.concat(hr_dataframes)
 
 
-# There are some minutes with missing data, so we need to correct that
+# There are some minutes with missing data, so we need to correct that
 full_daterange = pd.date_range(hr_df_concat.index[0],
                               hr_df_concat.index[-1],
-                              freq='min')
-hr_df_full = hr_df_concat.reindex(full_daterange, method='nearest')
+                              freq='min')
+hr_df_full = hr_df_concat.reindex(full_daterange, method='nearest')
 
-print("Heartbeats from {} to {}: {}".format(hr_df_full.index[0],
+print("Heartbeats from {} to {}: {}".format(hr_df_full.index[0],
                                             hr_df_full.index[-1],
-                                            hr_df_full['value'].sum()))
+                                            hr_df_full['value'].sum()))
 
@@ -325,9 +325,9 @@ hr_q \cdot n - hr_d \cdot (n-m)
In [8]:
-
quarterly_count = hr_df_full['value'].sum()
+
quarterly_count = hr_df_full['value'].sum()
 leap_day_count = hr_df_full[(hr_df_full.index.month == 2) &
-                            (hr_df_full.index.day == 29)]['value'].sum()
+                            (hr_df_full.index.day == 29)]['value'].sum()
 num_quarters = 96
 leap_days = 6
 
@@ -372,17 +372,17 @@ hr_q \cdot n - hr_d \cdot (n-m)
 
In [9]:
-
minute_mean = hr_df_full['value'].mean()
-# Don't you wish you knew?
-# birthday_minutes = ???
+
minute_mean = hr_df_full['value'].mean()
+# Don't you wish you knew?
+# birthday_minutes = ???
 
 birthday_heartbeats = birthday_minutes * minute_mean
 
 heartbeats_until_2016 = int(birthday_heartbeats + jan_92_jan_16)
 remaining_2016 = total_heartbeats - heartbeats_until_2016
 
-print("Heartbeats so far: {}".format(heartbeats_until_2016))
-print("Remaining heartbeats: {}".format(remaining_2016))
+print("Heartbeats so far: {}".format(heartbeats_until_2016))
+print("Remaining heartbeats: {}".format(remaining_2016))
 
@@ -430,7 +430,7 @@ hr_q \cdot n - hr_d \cdot (n - m)
In [10]:
-
heartbeats_4year = quarterly_count * 16 - leap_day_count * (16 - 1)
+
heartbeats_4year = quarterly_count * 16 - leap_day_count * (16 - 1)
 heartbeats_4year
 
@@ -470,11 +470,11 @@ hr_q \cdot n - hr_d \cdot (n - m)
In [11]:
-
four_year_periods = remaining_2016 // heartbeats_4year
+
four_year_periods = remaining_2016 // heartbeats_4year
 remaining_4y = remaining_2016 - four_year_periods * heartbeats_4year
 
-print("Four year periods remaining: {}".format(four_year_periods))
-print("Remaining heartbeats after 4 year periods: {}".format(remaining_4y))
+print("Four year periods remaining: {}".format(four_year_periods))
+print("Remaining heartbeats after 4 year periods: {}".format(remaining_4y))
 
@@ -512,15 +512,15 @@ Remaining heartbeats after 4 year periods: 48041640
In [12]:
-
remaining_leap = remaining_4y - leap_day_count
-# Ignore leap day in the data set
+
remaining_leap = remaining_4y - leap_day_count
+# Ignore leap day in the data set
 heartbeats_quarter = hr_df_full[(hr_df_full.index.month != 2) &
-                                (hr_df_full.index.day != 29)]['value'].sum()
+                                (hr_df_full.index.day != 29)]['value'].sum()
 quarters_left = remaining_leap // heartbeats_quarter
 remaining_year = remaining_leap - quarters_left * heartbeats_quarter
 
-print("Quarters left starting 2068: {}".format(quarters_left))
-print("Remaining heartbeats after that: {}".format(remaining_year))
+print("Quarters left starting 2068: {}".format(quarters_left))
+print("Remaining heartbeats after that: {}".format(remaining_year))
 
@@ -558,7 +558,7 @@ Remaining heartbeats after that: 4760716
In [13]:
-
from datetime import timedelta
+
from datetime import timedelta
 
 base = datetime(2070, 1, 1)
 minutes_left = remaining_year // minute_mean
diff --git a/tweet-like-me.html b/tweet-like-me.html
index b3b8771..05f9e34 100644
--- a/tweet-like-me.html
+++ b/tweet-like-me.html
@@ -4,7 +4,7 @@
         
         
         
-        
+        
         
         
 
@@ -126,13 +126,13 @@
 
In [1]:
-
import pandas as pd
+
import pandas as pd
 
-tweets = pd.read_csv('tweets.csv')
+tweets = pd.read_csv('tweets.csv')
 text = tweets.text
 
-# Don't include tweets in reply to or mentioning people
-replies = text.str.contains('@')
+# Don't include tweets in reply to or mentioning people
+replies = text.str.contains('@')
 text_norep = text.loc[~replies]
 
@@ -156,7 +156,7 @@
In [2]:
-
from nltk.tokenize import TweetTokenizer
+
from nltk.tokenize import TweetTokenizer
 tknzr = TweetTokenizer()
 tokens = text_norep.map(tknzr.tokenize)
 
@@ -185,12 +185,12 @@
 
In [3]:
-
from functools import reduce
+
from functools import reduce
 
-# Get all possible words
+# Get all possible words
 all_words = reduce(lambda x, y: x+y, tokens, [])
 unique_words = set(all_words)
-actual_words = set([x if x[0] != '.' else None for x in unique_words])
+actual_words = set([x if x[0] != '.' else None for x in unique_words])
 
 word_dist = {}
 for word in iter(actual_words):
@@ -219,12 +219,12 @@
 
In [4]:
-
import matplotlib.pyplot as plt
+
import matplotlib.pyplot as plt
 %matplotlib inline
 
-hashtags = text_norep.str.count('#')
+hashtags = text_norep.str.count('#')
 bins = hashtags.unique().max()
-hashtags.plot(kind='hist', bins=bins)
+hashtags.plot(kind='hist', bins=bins)
 
@@ -356,7 +356,7 @@ AElFTkSuQmCC
In [5]:
-
mle = hashtags.mean()
+
mle = hashtags.mean()
 mle
 
@@ -396,12 +396,12 @@ AElFTkSuQmCC
In [6]:
-
hashtags = [x for x in all_words if x[0] == '#']
+
hashtags = [x for x in all_words if x[0] == '#']
 n_hashtags = len(hashtags)
 
-unique_hashtags = list(set([x for x in unique_words if x[0] == '#']))
-hashtag_dist = pd.DataFrame({'hashtags': unique_hashtags,
-                             'prob': [all_words.count(h) / n_hashtags
+unique_hashtags = list(set([x for x in unique_words if x[0] == '#']))
+hashtag_dist = pd.DataFrame({'hashtags': unique_hashtags,
+                             'prob': [all_words.count(h) / n_hashtags
                                       for h in unique_hashtags]})
 len(hashtag_dist)
 
@@ -454,12 +454,12 @@ z: .17
In [7]:
-
import numpy as np
+
import numpy as np
 
 def multinom_sim(n, vals, probs):
     occurrences = np.random.multinomial(n, probs)
     results = occurrences * vals
-    return ' '.join(results[results != ''])
+    return ' '.join(results[results != ''])
 
 def sim_n_hashtags(hashtag_freq):
     return np.random.poisson(hashtag_freq)
@@ -469,7 +469,7 @@ z: .17
def sim_first_word(first_word_dist): probs = np.float64(first_word_dist.values) - return multinom_sim(1, first_word_dist.reset_index()['index'], probs) + return multinom_sim(1, first_word_dist.reset_index()['index'], probs) def sim_next_word(current, word_dist): dist = pd.Series(word_dist[current]) @@ -497,14 +497,14 @@ z: .17
In [8]:
-
first = sim_first_word(first_word_dist)
+
first = sim_first_word(first_word_dist)
 second = sim_next_word(first, word_dist)
 third = sim_next_word(second, word_dist)
 fourth = sim_next_word(third, word_dist)
 fifth = sim_next_word(fourth, word_dist)
 hashtag = sim_hashtags(1, hashtag_dist)
 
-' '.join((first, second, third, fourth, fifth, hashtag))
+' '.join((first, second, third, fourth, fifth, hashtag))
 
@@ -543,7 +543,7 @@ z: .17
In [9]:
-
def simulate_tweet():
+
def simulate_tweet():
     chars_remaining = 140
     first = sim_first_word(first_word_dist)
     n_hash = sim_n_hashtags(mle)
@@ -553,13 +553,13 @@ z: .17
tweet = first current = first - while chars_remaining > len(tweet) + len(hashtags) and current[0] != '.' and current[0] != '!': + while chars_remaining > len(tweet) + len(hashtags) and current[0] != '.' and current[0] != '!': current = sim_next_word(current, word_dist) - tweet += ' ' + current + tweet += ' ' + current tweet = tweet[:-2] + tweet[-1] - return ' '.join((tweet, hashtags)).strip() + return ' '.join((tweet, hashtags)).strip()
@@ -582,7 +582,7 @@ z: .17
In [12]:
-
for i in range(0, 20):
+
for i in range(0, 20):
     print(simulate_tweet())
     print()
 
diff --git a/welcome-and-an-algorithm.html b/welcome-and-an-algorithm.html index e6f56fd..ac5ec5a 100644 --- a/welcome-and-an-algorithm.html +++ b/welcome-and-an-algorithm.html @@ -4,7 +4,7 @@ - + @@ -157,16 +157,16 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
In [1]:
-
from IPython.display import display
+
from IPython.display import display
 import Quandl
 from datetime import datetime, timedelta
 
-tickers = ['XOM', 'CVX', 'CLB', 'OXY', 'SLB']
-market_ticker = 'GOOG/NYSE_VOO'
+tickers = ['XOM', 'CVX', 'CLB', 'OXY', 'SLB']
+market_ticker = 'GOOG/NYSE_VOO'
 lookback = 30
-d_col = 'Close'
+d_col = 'Close'
 
-data = {tick: Quandl.get('YAHOO/{}'.format(tick))[-lookback:] for tick in tickers}
+data = {tick: Quandl.get('YAHOO/{}'.format(tick))[-lookback:] for tick in tickers}
 market = Quandl.get(market_ticker)
 
@@ -190,7 +190,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
In [2]:
-
returns = {tick: data[tick][d_col].pct_change() for tick in tickers}
+
returns = {tick: data[tick][d_col].pct_change() for tick in tickers}
 
 display({tick: returns[tick].mean() for tick in tickers})
 
@@ -236,7 +236,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
In [3]:
-
market_returns = market.pct_change()
+
market_returns = market.pct_change()
 
 sharpe = lambda ret: (ret.mean() - market_returns[d_col].mean()) / ret.std()
 sharpes = {tick: sharpe(returns[tick]) for tick in tickers}
@@ -284,7 +284,7 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
 
In [4]:
-
drawdown = lambda ret: ret.abs().max()
+
drawdown = lambda ret: ret.abs().max()
 drawdowns = {tick: drawdown(returns[tick]) for tick in tickers}
 
 display(drawdowns)
@@ -337,25 +337,25 @@ s.t.\ \ & \vec{1} \omega = 1\\
 
In [5]:
-
import numpy as np
+
import numpy as np
 from scipy.optimize import minimize
 
-#sharpe_limit = .1
+#sharpe_limit = .1
 drawdown_limit = .05
 leverage = 250
 
-# Use the map so we can guarantee we maintain the correct order
-# sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound
+# Use the map so we can guarantee we maintain the correct order
+# sharpe_a = np.array(list(map(lambda tick: sharpes[tick], tickers))) * -1 # So we can write as upper-bound
 dd_a = np.array(list(map(lambda tick: drawdowns[tick], tickers)))
-returns_a = np.array(list(map(lambda tick: returns[tick].mean(), tickers))) # Because minimizing
+returns_a = np.array(list(map(lambda tick: returns[tick].mean(), tickers))) # Because minimizing
 
 meets_sharpe = lambda x: sum(abs(x) * sharpe_a) - sharpe_limit
 def meets_dd(x):
     portfolio = sum(abs(x))
     if portfolio < .1:
-        # If there are no stocks in the portfolio,
-        # we can accidentally induce division by 0,
-        # or division by something small enough to cause infinity
+        # If there are no stocks in the portfolio,
+        # we can accidentally induce division by 0,
+        # or division by something small enough to cause infinity
         return 0
     
     return drawdown_limit - sum(abs(x) * dd_a) / sum(abs(x))
@@ -365,41 +365,41 @@ s.t.\ \ & \vec{1} \omega = 1\\
 def within_leverage(x):
     return leverage - sum(abs(x))
 
-objective = lambda x: sum(x * returns_a) * -1 # Because we're minimizing
-bounds = ((None, None),) * len(tickers)
+objective = lambda x: sum(x * returns_a) * -1 # Because we're minimizing
+bounds = ((None, None),) * len(tickers)
 x = np.zeros(len(tickers))
 
 constraints = [
     {
-        'type': 'eq',
-        'fun': is_portfolio
+        'type': 'eq',
+        'fun': is_portfolio
     }, {
-        'type': 'ineq',
-        'fun': within_leverage
-    #}, {
-    #    'type': 'ineq',
-    #    'fun': meets_sharpe
+        'type': 'ineq',
+        'fun': within_leverage
+    #}, {
+    #    'type': 'ineq',
+    #    'fun': meets_sharpe
     }, {
-        'type': 'ineq',
-        'fun': meets_dd
+        'type': 'ineq',
+        'fun': meets_dd
     }
 ]
 
 optimal = minimize(objective, x, bounds=bounds, constraints=constraints,
-                  options={'maxiter': 500})
+                  options={'maxiter': 500})
 
-# Optimization time!
+# Optimization time!
 display(optimal.message)
 
-display("Holdings: {}".format(list(zip(tickers, optimal.x))))
+display("Holdings: {}".format(list(zip(tickers, optimal.x))))
 
-expected_return = optimal.fun * -100  # multiply by -100 to scale, and compensate for minimizing
-display("Expected Return: {:.3f}%".format(expected_return))
+expected_return = optimal.fun * -100  # multiply by -100 to scale, and compensate for minimizing
+display("Expected Return: {:.3f}%".format(expected_return))
 
 expected_drawdown = sum(abs(optimal.x) * dd_a) / sum(abs(optimal.x)) * 100
-display("Expected Max Drawdown: {0:.2f}%".format(expected_drawdown))
+display("Expected Max Drawdown: {0:.2f}%".format(expected_drawdown))
 
-# TODO: Calculate expected Sharpe
+# TODO: Calculate expected Sharpe