Wavelet Transform Modulus Maxima Demo

Decomposing signals created from financial cartoons


In [140]:
%matplotlib inline
from wtmm import wtmm
from wtmm.sample_data import financial_cartoon
from IPython.html.widgets import *
from matplotlib import pyplot as plt
import numpy as np

Let's generate some test data!


In [188]:
cartoon_t, cartoon_s = financial_cartoon(Iterations=5, Multifractal=False, plot=True)
print "cartoon's signal is {} in length".format(len(cartoon_s))


cartoon's signal is 730 in length

Interactive Example


In [189]:
interact(financial_cartoon, 
         Multifractal=CheckboxWidget(value=False), 
         Iterations=(0, 5, 1), 
         plot=True, 
         noise_type=DropdownWidget(values={'None': None, 'normal': 'Normal', 'Uniform': 'uniform'}, value=None),
         noise_level=0.5)


Out[189]:
<function wtmm.sample_data.financial_cartoon>

Run the Direct CWT


In [190]:
%%time
bifucations = wtmm(cartoon_s, width_step=0.25, max_scale=150, plot=True)


CPU times: user 5.53 s, sys: 62.5 ms, total: 5.6 s
Wall time: 5.62 s

Number of turning points found at this resolution


In [191]:
len(bifucations)


Out[191]:
159

In [182]:
# bifucations.pop((1, 594, 723))

Plot the results

Top (blue) -> original signal

Middle (yellow) -> piecewise vector representation

Bottom (red/blue/green alternating) -> groupings based on the piecewise vector


In [192]:
def build_extrema(bifucations, num):
    exts = set()
    for n, (_, _, v) in enumerate(bifucations.keys()):
        if len(exts) >= num:
            break
        if isinstance(v, tuple):
            exts.add(int(v[0]))
            exts.add(int(v[1]))
        else:
            exts.add(int(v))

    return sorted(exts)

def plot_results(sig_x, sig_y, bifucations, iterations):
    
    true_x, true_y = financial_cartoon(Iterations=iterations, Multifractal=False)
    
    bi_cnt = len(true_x) - 2
    
    offset_plot = (max(sig_y) - min(sig_y))/2
    end_pt = int(sig_x[-1])
    extremas = build_extrema(bifucations, bi_cnt)
    if extremas != 0:
        extremas.insert(0, 0)
    if extremas != len(sig_x) - 1:
        extremas.append(len(sig_x) - 1)
    num_extremas = len(extremas)
    lst_color = 'r'
    
    plt.figure(figsize=(14, 10))

    for n in xrange(num_extremas-1):
        st = extremas[n]
        end = extremas[n+1]+1
        if lst_color == 'r':
            lst_color = 'b'
        elif lst_color == 'b':
            lst_color = 'm'
        elif lst_color == 'm':
            lst_color = 'g'
        else:
            lst_color = 'r'

#         true_t, true_s = financial_cartoon(Iterations=max_res)
#         plt.plot(true_t, true_s - (pl_num*offset_plot), 'y')
        plt.plot(sig_x[st:end], sig_y[st:end], c=lst_color)
    
    lst_color = 'r'
    for n in xrange(len(true_x)-1):
        mask = (sig_x >= true_x[n]) & (sig_x <= true_x[n+1])
        if lst_color == 'r':
            lst_color = 'b'
        elif lst_color == 'b':
            lst_color = 'm'
        elif lst_color == 'm':
            lst_color = 'g'
        else:
            lst_color = 'r'

        plt.plot(sig_x[mask], sig_y[mask] + offset_plot, c=lst_color)
    
    plt.plot(true_x, true_y - offset_plot, 'b')
    print num_extremas, bi_cnt, len(true_x)
    if num_extremas > 20: 
        plt.plot(sig_x[extremas], sig_y[extremas], 'kx', ms=10.0, mew=1.0)
        plt.plot(true_x, true_y, 'ko', ms=10.0, mew=1.0, fillstyle='none')
    else:
        plt.plot(sig_x[extremas], sig_y[extremas], 'kx', ms=10.0, mew=1.5)
        plt.plot(true_x, true_y, 'ko', ms=10.0, mew=1.5, fillstyle='none')


#     plt.plot(sig_x, sig_y + (2*offset_plot), 'k')

    # extremas = sorted([t for num, t in bifucations.keys() if num < 10])
    # plt.plot([0] + extremas + [999], sig[[0] + extremas + [999]] + (2*offset_plot), 'y')
    # extremas = sorted([t for num, t in bifucations.keys() if num < 25])
    # plt.plot([0] + extremas + [999], sig[[0] + extremas + [999]] + (2*offset_plot), 'g')
    # plt.savefig('./example_clustering.png', dpi=5000)
    
    plt.ylim([-0.5,1.5])
    plt.show()

def presults(iterations=0):
    plot_results(cartoon_t, cartoon_s, bifucations, iterations)

interact(presults, iterations=(0,5,1))
    
# Top (blue) -> original signal
# Middle (yellow) -> piecewise vector representation
# Bottom (red/blue/green alternating) -> groupings based on the piecewise vector


10 8 10

In [187]:
build_extrema(bifucations, 2)


Out[187]:
[243, 432, 567]

In [141]:
(cartoon_t < 0.1) & (cartoon_t > 0.0)


Out[141]:
array([False,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False, False], dtype=bool)

In [ ]: