Skip to content

Instantly share code, notes, and snippets.

@jee
Created October 4, 2018 02:46
Show Gist options
  • Select an option

  • Save jee/4cb18652f641b685b165495a2c77759a to your computer and use it in GitHub Desktop.

Select an option

Save jee/4cb18652f641b685b165495a2c77759a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"# Import\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"import matplotlib.pyplot as plt\n"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"# Import data\n",
"# data = pd.read_csv('01_data/data_stocks.csv')\n",
"\n",
"# Drop date variable\n",
"# data = data.drop(['DATE'], 1)\n",
"data = np.asarray([356.09, 350.82, 353.14, 358.56, 352.67, 349.44, 343.1, 339.48, 330.53, 326.72, 320.63, 320.51, 326.06, 326.43, 300.66, 300.69, 303.25, 303.26, 304.1, 300.38, 305.11, 307.96, 311.63, 307.0, 314.72, 319.91, 310.13, 313.47, 314.63, 313.71, 313.42, 316.96, 309.62, 307.62, 307.69, 304.44, 304.0, 306.69, 314.84, 314.12, 321.38, 335.74, 340.36, 342.17, 339.83, 342.15, 335.9, 329.07, 330.48, 327.87, 320.26, 314.22, 312.68, 313.21, 316.55, 320.4, 312.12, 314.62, 326.26, 333.1, 333.0, 339.03, 337.04, 339.9, 344.38, 348.02, 346.59, 353.51, 355.75, 349.13, 342.8, 339.86, 344.56, 345.22, 350.69, 354.14, 346.23, 338.74, 329.86, 340.83, 331.61, 307.87, 312.16, 318.35, 322.35, 328.26, 337.38, 336.17, 336.43, 341.1, 351.05, 355.68, 355.0, 348.73, 339.37, 329.1, 333.52, 331.7, 327.12, 329.79, 325.43, 336.86, 340.69, 331.87, 326.98, 323.24, 315.21, 312.5, 316.31, 313.5, 306.03, 299.48, 290.73, 260.39, 259.58, 252.46, 263.92, 270.19, 297.23, 302.39, 299.36, 300.39, 304.32, 298.81, 299.96, 294.34, 287.34, 294.2, 294.78, 294.87, 286.98, 282.77, 281.21, 281.14, 289.15, 295.62, 297.02, 302.32, 281.63, 288.19, 300.56, 303.38, 303.53, 308.55, 303.98, 298.28, 283.73, 285.19, 286.58, 279.32, 286.39, 280.71, 276.95, 278.0, 277.63, 281.32, 288.3, 286.65, 287.89, 296.27, 292.27, 309.83, 321.79, 320.81, 328.58, 346.49, 343.5, 352.68, 357.96, 364.12, 358.13, 358.19, 356.24, 342.13, 332.99, 334.67, 345.14, 351.56, 348.13, 347.31, 321.09, 305.31, 307.03, 313.26, 323.44, 318.5, 318.0, 314.42, 310.71, 316.62, 320.88, 318.77, 317.47, 299.18, 300.13, 302.06, 307.17, 301.52, 291.12, 298.0])\n",
"data = data.reshape(-1, 1)\n",
"# Dimensions of dataset\n",
"# n = data.shape[0]\n",
"n = 200\n",
"\n",
"# p = data.shape[1]\n",
"p = 1\n",
"\n",
"# Make data a np.array\n",
"#data = data.values"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"# Training and test data\n",
"train_start = 0\n",
"train_end = int(np.floor(0.8*n))\n",
"test_start = train_end + 1\n",
"test_end = n\n",
"data_train = data[np.arange(train_start, train_end), :]\n",
"data_test = data[np.arange(test_start, test_end), :]"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [],
"source": [
"# Scale data\n",
"scaler = MinMaxScaler(feature_range=(-1, 1))\n",
"scaler.fit(data_train)\n",
"data_train = scaler.transform(data_train)\n",
"data_test = scaler.transform(data_test)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"# Build X and y\n",
"X_train = data_train[:, 1:]\n",
"y_train = data_train[:, 0]\n",
"X_test = data_test[:, 1:]\n",
"y_test = data_test[:, 0]"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"# Number of stocks in training data\n",
"n_stocks = X_train.shape[1]"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Neurons\n",
"n_neurons_1 = 1024\n",
"n_neurons_2 = 512\n",
"n_neurons_3 = 256\n",
"n_neurons_4 = 128\n",
"\n",
"# Session\n",
"net = tf.InteractiveSession()\n",
"\n",
"# Placeholder\n",
"X = tf.placeholder(dtype=tf.float32, shape=[None, n_stocks])\n",
"Y = tf.placeholder(dtype=tf.float32, shape=[None])\n",
"\n",
"# Initializers\n",
"sigma = 1\n",
"weight_initializer = tf.variance_scaling_initializer(mode=\"fan_avg\", distribution=\"uniform\", scale=sigma)\n",
"bias_initializer = tf.zeros_initializer()\n",
"\n",
"# Hidden weights\n",
"W_hidden_1 = tf.Variable(weight_initializer([n_stocks, n_neurons_1]))\n",
"bias_hidden_1 = tf.Variable(bias_initializer([n_neurons_1]))\n",
"W_hidden_2 = tf.Variable(weight_initializer([n_neurons_1, n_neurons_2]))\n",
"bias_hidden_2 = tf.Variable(bias_initializer([n_neurons_2]))\n",
"W_hidden_3 = tf.Variable(weight_initializer([n_neurons_2, n_neurons_3]))\n",
"bias_hidden_3 = tf.Variable(bias_initializer([n_neurons_3]))\n",
"W_hidden_4 = tf.Variable(weight_initializer([n_neurons_3, n_neurons_4]))\n",
"bias_hidden_4 = tf.Variable(bias_initializer([n_neurons_4]))\n",
"\n",
"# Output weights\n",
"W_out = tf.Variable(weight_initializer([n_neurons_4, 1]))\n",
"bias_out = tf.Variable(bias_initializer([1]))\n",
"\n",
"# Hidden layer\n",
"hidden_1 = tf.nn.relu(tf.add(tf.matmul(X, W_hidden_1), bias_hidden_1))\n",
"hidden_2 = tf.nn.relu(tf.add(tf.matmul(hidden_1, W_hidden_2), bias_hidden_2))\n",
"hidden_3 = tf.nn.relu(tf.add(tf.matmul(hidden_2, W_hidden_3), bias_hidden_3))\n",
"hidden_4 = tf.nn.relu(tf.add(tf.matmul(hidden_3, W_hidden_4), bias_hidden_4))\n",
"\n",
"# Output layer (transpose!)\n",
"out = tf.transpose(tf.add(tf.matmul(hidden_4, W_out), bias_out))\n",
"\n",
"# Cost function\n",
"mse = tf.reduce_mean(tf.squared_difference(out, Y))\n",
"\n",
"# Optimizer\n",
"opt = tf.train.AdamOptimizer().minimize(mse)\n",
"\n",
"# Init\n",
"net.run(tf.global_variables_initializer())\n",
"\n",
"# Setup plot\n",
"plt.ion()\n",
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(111)\n",
"line1, = ax1.plot(y_test)\n",
"line2, = ax1.plot(y_test * 0.5)\n",
"plt.show()\n",
"\n",
"# Fit neural net\n",
"batch_size = 256\n",
"mse_train = []\n",
"mse_test = []\n",
"\n",
"# Run\n",
"epochs = 10\n",
"for e in range(epochs):\n",
"\n",
" # Shuffle training data\n",
" shuffle_indices = np.random.permutation(np.arange(len(y_train)))\n",
" X_train = X_train[shuffle_indices]\n",
" y_train = y_train[shuffle_indices]\n",
"\n",
" # Minibatch training\n",
" for i in range(0, len(y_train) // batch_size):\n",
" start = i * batch_size\n",
" batch_x = X_train[start:start + batch_size]\n",
" batch_y = y_train[start:start + batch_size]\n",
" # Run optimizer with batch\n",
" net.run(opt, feed_dict={X: batch_x, Y: batch_y})\n",
"\n",
" # Show progress\n",
" if np.mod(i, 50) == 0:\n",
" # MSE train and test\n",
" mse_train.append(net.run(mse, feed_dict={X: X_train, Y: y_train}))\n",
" mse_test.append(net.run(mse, feed_dict={X: X_test, Y: y_test}))\n",
" print('MSE Train: ', mse_train[-1])\n",
" print('MSE Test: ', mse_test[-1])\n",
" # Prediction\n",
" pred = net.run(out, feed_dict={X: X_test})\n",
" line2.set_ydata(pred)\n",
" plt.title('Epoch ' + str(e) + ', Batch ' + str(i))\n",
" plt.pause(0.01)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment