No Capitulo 18 do livro o autor explora a quantidade de informação (no sentido de entropia) que a série contém.
Primeiramente vamos condificar nossa série de retornos dos futuros de e-mini das seguintes maneiras: (a) pelo método binário, (b) pelo método quantílico, (c) com um z-score. Então vamos calcular a entropia de cada uma dessas séries
%matplotlib inline
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
e_mini = pd.read_excel("Documents\e-mini.xlsx", sheet_name="dados", index_col=0, parse_dates=True, header=0)


(a) Quantize the returns series using the binary method.
(b) Quantize the returns series using the quantile encoding, using 10 letters.
(c) Quantize the returns series using the sigma encoding, where
e_mini['retornos'] = e_mini['price'].pct_change()
e_mini['binary'] = np.sign(e_mini['retornos'])
q_1 = e_mini['retornos'].quantile(q=0.1)
q_2 = e_mini['retornos'].quantile(q=0.2)
q_3 = e_mini['retornos'].quantile(q=0.3)
q_4 = e_mini['retornos'].quantile(q=0.4)
q_5 = e_mini['retornos'].quantile(q=0.5)
q_6 = e_mini['retornos'].quantile(q=0.6)
q_7 = e_mini['retornos'].quantile(q=0.7)
q_8 = e_mini['retornos'].quantile(q=0.8)
q_9 = e_mini['retornos'].quantile(q=0.9)
q_max = max(e_mini['retornos'].fillna(0))
e_mini['quantile'] = e_mini['retornos'].apply(lambda x: 1 if x < q_1 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 2 if x < q_2 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 3 if x < q_3 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 4 if x < q_4 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 5 if x < q_5 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 6 if x < q_6 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 7 if x < q_7 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 8 if x < q_8 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 9 if x < q_9 else x )
e_mini['quantile'] = e_mini['quantile'].apply(lambda x: 10 if x < q_max else x )
e_mini['sigma'] = (e_mini['retornos'] - e_mini['retornos'].mean())/e_mini['retornos'].std()
print(e_mini.head())
price volume retornos binary quantile sigma
2000-01-04 1411.75 64048 NaN NaN NaN NaN
2000-01-05 1413.50 73121 0.001240 1.0 6.0 0.084087
2000-01-06 1404.00 67883 -0.006721 -1.0 2.0 -0.579149
2000-01-07 1459.75 60545 0.039708 1.0 10.0 3.289109
2000-01-10 1475.00 59343 0.010447 1.0 9.0 0.851208
A entropia de Shannon é definida como:

ou seja, dividi-se a série (x) nos valores que ela pode tomar A (x E A) e soma-se p(x)log2(p(x))
Então para a série binária a resposta é:
import numpy as np
p_1 = 0.54
p_minus1 = 0.45
H_binary = -p_1*np.log2(p_1)-p_minus1*np.log2(p_minus1)
H_binary = 0.99844
que resulta em H_binary = 0.99844 que significa dizer que a série binária praticamente não contém nenhum informação (serie o equivalente que saber que se der cara, chove com 50% de chance, se der coroa, chove com 50% de chance, e sabemos que choveu. provavelmente tinha dado cara ou coroa?)
Para a série quantilica, dividimos a probabilidade em 10 estados e, pela definição, cada estado tem 10% de chance de ocorrer, assim:
p_q = 0.1
H_quantil = -10*p_q*np.log2(p_q)
H_quantil = 3.321928094887362
e a entropia é já 3,21, bastante superior ao caso binário.
Já na série de z-score, precisamos definir em quantas classes vamos dividir, por simplicidade vamos dividir em cada desvio padrão de desvio da média.
Como o z-score "absoluto" da série varia de -8 até 12, teremos 20 classes, mas 4 dessas tem p(x) = 0 e vão contribuir com zero para a entropia
p_minus8 = 0.0001975894092
p_minus7 = 0.0005927682276
p_minus6 = 0.0003951788184
p_minus5 = 0.001185536455
p_minus4 = 0.003161430547
p_minus3 = 0.009484291642
p_minus2 = 0.04248172298
p_minus1 = 0.1606401897
p_0 = 0.5536455246
p_1 = 0.1859316341
p_2 = 0.02746492788
p_3 = 0.01027464928
p_4 = 0.002173483501
p_5 = 0.001383125864
p_6 = 0.0005927682276
p_7 = 0
p_8 = 0
p_9 =0
p_10 = 0.0001975894092
p_11 = 0
p_12 = 0.0001975894092
p = [p_minus8, p_minus7, p_minus6, p_minus5, p_minus4, p_minus3, p_minus2, p_minus1, p_0, p_1, p_2, p_3, p_4, p_5, p_6, p_10, p_12]
logs = np.log2(p)
H_sigma = -np.dot(p, logs)
e H_sigma = 1.9095522110063734
Curiosamente, a entropia da série com desvios padrão, apesar de contar maior número de classes contem menos informação que a série quantilica, esse resutlado decorre de a mairo parte da série de sigmas estar em uma das classes (desvio padrão = 0)