In [1]:
%matplotlib inline

In [1]:
import numpy as np
import pandas as pd

# 統計用ツール
import statsmodels.api as sm
import statsmodels.tsa.api as tsa
from patsy import dmatrices

#描画
import matplotlib.pyplot as plt
from pandas.tools.plotting import autocorrelation_plot

#株価
import pandas as pd
import pandas.io.data as web

#深層学習
import chainer
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

#k平均法
from sklearn.cluster import KMeans


---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-295c2c862fd0> in <module>()
     16 
     17 #深層学習
---> 18 import chainer
     19 from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
     20 from chainer import Link, Chain, ChainList

ImportError: No module named chainer

In [ ]:
import datetime

import numpy as np
import pandas as pd
import pandas.io.data as web
import quandl


def setdata(s, e, t='Adj Close'):
    start = datetime.datetime(s[0], s[1], s[2])
    end = datetime.datetime(e[0], e[1], e[2])
    N225 = web.DataReader('^N225', 'yahoo', start, end)[t]
    DJI = web.DataReader('^DJI', 'yahoo', start, end)[t]
    IXIC = web.DataReader('^IXIC', 'yahoo', start, end)[t]
    jpy = web.DataReader('DEXJPUS', 'fred')
    jpy = jpy.ix[start:end]
    usdjpy = quandl.get("BOE/XUDLJYD", start_date=start, end_date=end).assign(
                    USDJPY_roc = lambda df: df["Value"].pct_change()
                ).rename(columns={
                    "Value" : "USDJPY"
                })
    eurjpy = quandl.get("BOE/XUDLBK63", start_date=start, end_date=end).assign(
                    EURJPY_roc = lambda df: df["Value"].pct_change()
                ).rename(columns={
                    "Value" : "EURJPY"
                })
    gbpjpy = quandl.get("BOE/XUDLJYS", start_date=start, end_date=end).assign(
                    EURJPY_roc = lambda df: df["Value"].pct_change()
                ).rename(columns={
                    "Value" : "GBPJPY"
                })
    usdjpy = usdjpy["USDJPY"]
    eurjpy = eurjpy["EURJPY"]
    gbpjpy = gbpjpy["GBPJPY"]
    
    dataframe = pd.concat([N225, DJI, IXIC, usdjpy, eurjpy, gbpjpy], axis=1).dropna()
    
    datas = np.array(dataframe)
    target = datas.T[0]

    return datas, target

In [ ]:
s = (1990, 1, 1)
e = (2015, 9, 30)
t = 'Adj Close'
start = datetime.datetime(s[0], s[1], s[2])
end = datetime.datetime(e[0], e[1], e[2])
SaP = web.DataReader('GSPC', 'yahoo', start, end)[t]
N225 = web.DataReader('^N225', 'yahoo', start, end)[t]
DJI = web.DataReader('^DJI', 'yahoo', start, end)[t]
IXIC = web.DataReader('^IXIC', 'yahoo', start, end)[t]

In [ ]:
SaP = np.array([SaP[1:].values - SaP[:-1].values]).T*100

In [ ]:
kms = KMeans(n_clusters=3).fit_predict(SaP)

mean1 = SaP[kms == 0].mean()
var1 = SaP[kms == 0].var()
mean2 = SaP[kms == 1].mean()
var2 = SaP[kms == 1].var()
mean3 = SaP[kms == 2].mean()
var3 = SaP[kms == 2].var()

for t in range(100):
    f = SaP[t:t+20]

    v = np.array([])
    for i in range(20):
        v1 = np.round(np.exp(-1*(f[i] - mean1)**2/var1), 5)
        v2 = np.round(np.exp(-1*(f[i] - mean2)**2/var2), 5)
        v3 = np.round(np.exp(-1*(f[i] - mean3)**2/var3), 5)
        v = np.append(v, v1)
        v = np.append(v, v2)
        v = np.append(v, v3)

    if t != 0:
        fs = np.c_[fs, v]
    else:
        fs = np.array([v]).T

In [ ]:
class AE(Chain):
    def __init__(self):
        super(AE, self).__init__(
            l1 = L.Linear(60, 20),
            l2 = L.Linear(20, 60),
        )
    
    def __call__(self, x):
        bv, fv = self.fwd(x)
        loss = F.mean_squared_error(bv, x)
        return loss
    
    def fwd(self, x):
        fv = F.sigmoid(self.l1(x))
        bv = self.l2(fv)
        return bv, fv

In [ ]:
for i in range(1000):
    ft = np.array([fs[:,0]], dtype='float32')

    model = AE()
    optimizer = optimizers.SGD()
    optimizer.setup(model)

    n = 60
    bs = 5
    
    for j in range(10):
        x = Variable(ft)
        model.zerograds()
        loss = model(x)
        loss.backward()
        optimizer.weight_decay(0.0005)
        optimizer.update()
    
    if i != 0:
        Ft = model.fwd(x)[1].data
        Fs = np.append(Fs, Ft, axis=0)
    else:
        Fs = model.fwd(x)[1].data

In [ ]:
class CAR(Chain):
    def __init__(self, unit1, unit2, unit3, col_num):
        super(CAR, self).__init__(
            l1 = L.Linear(col_num, unit1),
            l2 = L.Linear(self.unit1, self.unit1),
            l3 = L.Linear(self.unit1, self.unit2),
            l4 = L.Linear(self.unit2, self.unit3),
            l5 = L.Linear(self.unit3, self.unit3),
            l6 = L.Linear(self.unit3, 1),
        )
    
    def __call__(self, x, y):
        fv = self.fwd(x, y)
        loss = F.mean_squared_error(fv, y)
        return loss
    
    def fwd(self, x, y):
        h1 = F.sigmoid(self.l1(x))
        h2 = F.sigmoid(self.l2(h1))
        h3 = F.sigmoid(self.l3(h2))
        h4 = F.sigmoid(self.l4(h3))
        h5 = F.sigmoid(self.l5(h4))
        h6 = self.l6(h5)
        return h6

In [ ]:
class RNN(chainer.Chain):
    def __init__(self):
        super(RNN, self).__init__(
            h = L.Linear(20, 1),
            u = L.Linear(1, 1),
        )
        
    def __call__(self, Fs):
        dUt = 0
        d_1 = Variable(np.zeros((1, 1), dtype=np.float32))
        old_grad = np.array([np.zeros(21)], dtype='float32')
        for i in range(len(Fs[:, 0])):
            x_k = Variable(np.array([Farray[i]], dtype=np.float32))
            d = F.tanh(self.h(x_k) + self.u(d_1))
            z = Variable(np.array([[Farray[i][-1]]], dtype=np.float32))
            R = F.forget(f, d, d_1, z)
            R.grad = np.array([np.ones(1, dtype=np.float32)])
            R.backward()
            d.backward()
            dRddt = d.grad
            dRddt_1 = d_1.grad
            if dRddt is None:
                dRddt = np.array([[0]])
            if dRddt_1 is None:
                dRddt_1 = np.array([[0]])
            grad = np.append(self.h.W.grad, self.h.b.grad)
            dUt += dRddt*grad + dRddt_1*old_grad
            
            d_1 = d
            old_grad = grad
        self.h.W.data += 0.1*np.array([dUt[0][:-1]])
        self.h.b.data += 0.1*np.array([dUt[0][-1]])
        print(dUt)
        return dUt

In [ ]:
class RNN(chainer.Chain):
    def __init__(self):
        super(RNN, self).__init__(
            W = Variable(np.ones((1, 20), dtype=np.float32)*np.random.normal()), 
            b = Variable(np.ones((1, 1), dtype=np.float32)), 
            u = Variable(np.ones((1, 1), dtype=np.float32)), 
        )
        
    def __call__(self, Fs ,rho_c):
        dUt = 0
        d_1 = Variable(np.zeros((1, 1), dtype=np.float32))
        
        old_grad = np.array([np.zeros(22)], dtype='float32')
        
        for i in range(len(Fs[:, 0])):
            x_k = Variable(np.array([Farray[i]], dtype=np.float32).T)
            D = F.forget(f1, x_k, self.W, self.u, d_1, self.b)
            d = Variable(D.data)
            
            z = Variable(np.array([[Farray[i][-1]]], dtype=np.float32))
            R = F.forget(f2, d, d_1, z)
            R.backward()
            
            dRddt = d.grad
            dRddt_1 = d_1.grad
            
            D.backward()
            grad = np.append(self.W.grad, self.b.grad)
            grad = np.append(grad, self.u.grad)
            dUt += dRddt*grad + dRddt_1*old_grad
            
            d_1 = d
            old_grad = grad
        
        self.W.data -= rho_c*np.array([dUt[0][:-2]])
        self.b.data -= rho_c*np.array([dUt[0][-2]])
        self.u.data -= rho_c*np.array([dUt[0][-1]])
        return dUt

In [ ]:
def f1(x_k, W, u, d_1, b):
    x = x_k.__rmatmul__(W) + u.__rmatmul__(d_1) + b
    
    return F.tanh(x)

def f2(d, d_1, z):
    c = 100
    
    R = d.__rmatmul__(z) - c*(d - d_1).__abs__()
    
    return R

In [ ]:
model = RNN()

Farray = Fs

c = 1
c0 = 10
dU = 0

rho = 1
while True:
    rho_c = min(rho, rho**(c0/c))
    
    x = Variable(Fs)
    dU = model(x, rho_c)
    
    c += 1
    if c == 1000:
        break
    
    if sum(abs(dU[0]) > 0.1) == 0:
        break

In [ ]:
dU

In [ ]:
while True:
    rho_c = min(rho, rho**(c0/c))
    
    x = Variable(Fs)
    dU = model(x, rho_c)
    
    c += 1
    if c == 1000:
        break
    
    if sum(abs(dU[0]) > 0.1) == 0:
        break

In [ ]:
dU

In [ ]:
for i in range(100):
    x = Variable(Fs)
    loss = model(x)

In [ ]:
loss

In [ ]:
s = Variable(np.array([[1]], dtype=np.float32))
t = Variable(np.array([[1]], dtype=np.float32).T)
j = Variable(np.array([[0.46143287]], dtype=np.float32).T)
R = F.forget(f, s, t, j)
R.backward()

s.grad

In [ ]:
t.grad

In [ ]:
j.grad

In [ ]:
h = t.__rmatmul__(s)

In [ ]:
h.data

In [ ]:
np.array([np.zeros(21)], dtype='float32')

In [ ]:
np.append(h.W.grad, h.b.grad)

In [ ]:
loss.grad

In [ ]:
x = Variable(np.array([-1, 0, 1], dtype=np.float32))
z = F.sin(x)
z.grad = np.ones(3, dtype=np.float32)
z.backward()
x.grad

In [ ]:
for i in range(100):
    Farray = Fs
    x = Variable(Fs)
    model.zerograds()
    loss = model(x)
    loss.backward()
    optimizer.update()
    print('epoch:', i)
    print('train mean loss={}'.format(loss_val))
    print(' - - - - - - - - - ')

In [ ]:
d = [0]

one = Variable(np.ones((1, 1), dtype=np.float32))

for i in range(1000):
    X = Variable(np.array([Farray[i]], dtype=np.float32))
    delta = np.tanh(model.W.data*X.data + model.u.data*d[-1] + model.b.data)
    d.append(delta[0][0])

In [ ]:
d

In [ ]: