{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import time\n", "import random\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def softmax(z):\n", " assert len(z.shape) == 2\n", " s = np.max(z, axis=1)\n", " s = s[:, np.newaxis]\n", " e_x = np.exp(z - s)\n", " div = np.sum(e_x, axis=1)\n", " div = div[:, np.newaxis]\n", " return e_x / div" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateOpenHighLowCloseAdj CloseVolume
02018-05-23182.500000186.910004182.179993186.899994186.89999416628100
12018-05-24185.880005186.800003185.029999185.929993185.92999312354700
22018-05-25186.020004186.330002184.449997184.919998184.91999810965100
32018-05-29184.339996186.809998183.710007185.740005185.74000516398900
42018-05-30186.539993188.000000185.250000187.669998187.66999813736900
\n", "
" ], "text/plain": [ " Date Open High Low Close Adj Close \\\n", "0 2018-05-23 182.500000 186.910004 182.179993 186.899994 186.899994 \n", "1 2018-05-24 185.880005 186.800003 185.029999 185.929993 185.929993 \n", "2 2018-05-25 186.020004 186.330002 184.449997 184.919998 184.919998 \n", "3 2018-05-29 184.339996 186.809998 183.710007 185.740005 185.740005 \n", "4 2018-05-30 186.539993 188.000000 185.250000 187.669998 187.669998 \n", "\n", " Volume \n", "0 16628100 \n", "1 12354700 \n", "2 10965100 \n", "3 16398900 \n", "4 13736900 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('FB.csv')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "parameters = [df['Close'].tolist(), df['Volume'].tolist()]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def get_state(parameters, t, window_size = 20):\n", " outside = []\n", " d = t - window_size + 1\n", " for parameter in parameters:\n", " block = (\n", " parameter[d : t + 1]\n", " if d >= 0\n", " else -d * [parameter[0]] + parameter[0 : t + 1]\n", " )\n", " res = []\n", " for i in range(window_size - 1):\n", " res.append(block[i + 1] - block[i])\n", " for i in range(1, window_size, 1):\n", " res.append(block[i] - block[0])\n", " outside.append(res)\n", " return np.array(outside).reshape((1, -1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our output size from `get_state` is 38. In this notebook, I only use `Close` and `Volume` parameters, you can choose any parameters you want from your DataFrame.\n", "\n", "After that, I want to add another parameters, my `inventory` size, mean of `inventory` and `capital`.\n", "\n", "Let say for an example,\n", "```\n", "inventory_size = 1\n", "mean_inventory = 0.5\n", "capital = 2\n", "last_state = 0\n", "```\n", "\n", "We have 3 actions,\n", "\n", "1. `0` for do nothing.\n", "2. `1` for buy.\n", "3. `2` for sell." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "inventory_size = 1\n", "mean_inventory = 0.5\n", "capital = 2\n", "concat_parameters = np.concatenate([get_state(parameters, 20), [[inventory_size, \n", " mean_inventory,\n", " capital]]], axis = 1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "79" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_size = concat_parameters.shape[1]\n", "input_size" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "class Deep_Evolution_Strategy:\n", "\n", " inputs = None\n", "\n", " def __init__(\n", " self, weights, reward_function, population_size, sigma, learning_rate\n", " ):\n", " self.weights = weights\n", " self.reward_function = reward_function\n", " self.population_size = population_size\n", " self.sigma = sigma\n", " self.learning_rate = learning_rate\n", "\n", " def _get_weight_from_population(self, weights, population):\n", " weights_population = []\n", " for index, i in enumerate(population):\n", " jittered = self.sigma * i\n", " weights_population.append(weights[index] + jittered)\n", " return weights_population\n", "\n", " def get_weights(self):\n", " return self.weights\n", " \n", " def train(self, epoch = 100, print_every = 1):\n", " lasttime = time.time()\n", " for i in range(epoch):\n", " population = []\n", " rewards = np.zeros(self.population_size)\n", " for k in range(self.population_size):\n", " x = []\n", " for w in self.weights:\n", " x.append(np.random.randn(*w.shape))\n", " population.append(x)\n", " for k in range(self.population_size):\n", " weights_population = self._get_weight_from_population(\n", " self.weights, population[k]\n", " )\n", " rewards[k] = self.reward_function(weights_population)\n", " rewards = (rewards - np.mean(rewards)) / (np.std(rewards) + 1e-7)\n", " for index, w in enumerate(self.weights):\n", " A = np.array([p[index] for p in population])\n", " self.weights[index] = (\n", " w\n", " + self.learning_rate\n", " / (self.population_size * self.sigma)\n", " * np.dot(A.T, rewards).T\n", " )\n", " if (i + 1) % print_every == 0:\n", " print(\n", " 'iter %d. reward: %f'\n", " % (i + 1, self.reward_function(self.weights))\n", " )\n", " print('time taken to train:', time.time() - lasttime, 'seconds')\n", " \n", "class Model:\n", " def __init__(self, input_size, layer_size, output_size):\n", " self.weights = [\n", " np.random.rand(input_size, layer_size)\n", " * np.sqrt(1 / (input_size + layer_size)),\n", " np.random.rand(layer_size, output_size)\n", " * np.sqrt(1 / (layer_size + output_size)),\n", " np.zeros((1, layer_size)),\n", " np.zeros((1, output_size)),\n", " ]\n", "\n", " def predict(self, inputs):\n", " feed = np.dot(inputs, self.weights[0]) + self.weights[-2]\n", " decision = np.dot(feed, self.weights[1]) + self.weights[-1]\n", " return decision\n", "\n", " def get_weights(self):\n", " return self.weights\n", "\n", " def set_weights(self, weights):\n", " self.weights = weights" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "class Agent:\n", "\n", " POPULATION_SIZE = 15\n", " SIGMA = 0.1\n", " LEARNING_RATE = 0.03\n", "\n", " def __init__(self, model, timeseries, skip, initial_money, real_trend, minmax):\n", " self.model = model\n", " self.timeseries = timeseries\n", " self.skip = skip\n", " self.real_trend = real_trend\n", " self.initial_money = initial_money\n", " self.es = Deep_Evolution_Strategy(\n", " self.model.get_weights(),\n", " self.get_reward,\n", " self.POPULATION_SIZE,\n", " self.SIGMA,\n", " self.LEARNING_RATE,\n", " )\n", " self.minmax = minmax\n", " self._initiate()\n", "\n", " def _initiate(self):\n", " # i assume first index is the close value\n", " self.trend = self.timeseries[0]\n", " self._mean = np.mean(self.trend)\n", " self._std = np.std(self.trend)\n", " self._inventory = []\n", " self._capital = self.initial_money\n", " self._queue = []\n", " self._scaled_capital = self.minmax.transform([[self._capital, 2]])[0, 0]\n", "\n", " def reset_capital(self, capital):\n", " if capital:\n", " self._capital = capital\n", " self._scaled_capital = self.minmax.transform([[self._capital, 2]])[0, 0]\n", " self._queue = []\n", " self._inventory = []\n", "\n", " def trade(self, data):\n", " \"\"\"\n", " you need to make sure the data is [close, volume]\n", " \"\"\"\n", " scaled_data = self.minmax.transform([data])[0]\n", " real_close = data[0]\n", " close = scaled_data[0]\n", " if len(self._queue) >= window_size:\n", " self._queue.pop(0)\n", " self._queue.append(scaled_data)\n", " if len(self._queue) < window_size:\n", " return {\n", " 'status': 'data not enough to trade',\n", " 'action': 'fail',\n", " 'balance': self._capital,\n", " 'timestamp': str(datetime.now()),\n", " }\n", " state = self.get_state(\n", " window_size - 1,\n", " self._inventory,\n", " self._scaled_capital,\n", " timeseries = np.array(self._queue).T.tolist(),\n", " )\n", " action, prob = self.act_softmax(state)\n", " print(prob)\n", " if action == 1 and self._scaled_capital >= close:\n", " self._inventory.append(close)\n", " self._scaled_capital -= close\n", " self._capital -= real_close\n", " return {\n", " 'status': 'buy 1 unit, cost %f' % (real_close),\n", " 'action': 'buy',\n", " 'balance': self._capital,\n", " 'timestamp': str(datetime.now()),\n", " }\n", " elif action == 2 and len(self._inventory):\n", " bought_price = self._inventory.pop(0)\n", " self._scaled_capital += close\n", " self._capital += real_close\n", " scaled_bought_price = self.minmax.inverse_transform(\n", " [[bought_price, 2]]\n", " )[0, 0]\n", " try:\n", " invest = (\n", " (real_close - scaled_bought_price) / scaled_bought_price\n", " ) * 100\n", " except:\n", " invest = 0\n", " return {\n", " 'status': 'sell 1 unit, price %f' % (real_close),\n", " 'investment': invest,\n", " 'gain': real_close - scaled_bought_price,\n", " 'balance': self._capital,\n", " 'action': 'sell',\n", " 'timestamp': str(datetime.now()),\n", " }\n", " else:\n", " return {\n", " 'status': 'do nothing',\n", " 'action': 'nothing',\n", " 'balance': self._capital,\n", " 'timestamp': str(datetime.now()),\n", " }\n", "\n", " def change_data(self, timeseries, skip, initial_money, real_trend, minmax):\n", " self.timeseries = timeseries\n", " self.skip = skip\n", " self.initial_money = initial_money\n", " self.real_trend = real_trend\n", " self.minmax = minmax\n", " self._initiate()\n", "\n", " def act(self, sequence):\n", " decision = self.model.predict(np.array(sequence))\n", "\n", " return np.argmax(decision[0])\n", "\n", " def act_softmax(self, sequence):\n", " decision = self.model.predict(np.array(sequence))\n", "\n", " return np.argmax(decision[0]), softmax(decision)[0]\n", "\n", " def get_state(self, t, inventory, capital, timeseries):\n", " state = get_state(timeseries, t)\n", " len_inventory = len(inventory)\n", " if len_inventory:\n", " mean_inventory = np.mean(inventory)\n", " else:\n", " mean_inventory = 0\n", " z_inventory = (mean_inventory - self._mean) / self._std\n", " z_capital = (capital - self._mean) / self._std\n", " concat_parameters = np.concatenate(\n", " [state, [[len_inventory, z_inventory, z_capital]]], axis = 1\n", " )\n", " return concat_parameters\n", "\n", " def get_reward(self, weights):\n", " initial_money = self._scaled_capital\n", " starting_money = initial_money\n", " invests = []\n", " self.model.weights = weights\n", " inventory = []\n", " state = self.get_state(0, inventory, starting_money, self.timeseries)\n", "\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " action = self.act(state)\n", " if action == 1 and starting_money >= self.trend[t]:\n", " inventory.append(self.trend[t])\n", " starting_money -= self.trend[t]\n", "\n", " elif action == 2 and len(inventory):\n", " bought_price = inventory.pop(0)\n", " starting_money += self.trend[t]\n", " invest = ((self.trend[t] - bought_price) / bought_price) * 100\n", " invests.append(invest)\n", "\n", " state = self.get_state(\n", " t + 1, inventory, starting_money, self.timeseries\n", " )\n", " invests = np.mean(invests)\n", " if np.isnan(invests):\n", " invests = 0\n", " score = (starting_money - initial_money) / initial_money * 100\n", " return invests * 0.7 + score * 0.3\n", "\n", " def fit(self, iterations, checkpoint):\n", " self.es.train(iterations, print_every = checkpoint)\n", "\n", " def buy(self):\n", " initial_money = self._scaled_capital\n", " starting_money = initial_money\n", "\n", " real_initial_money = self.initial_money\n", " real_starting_money = self.initial_money\n", " inventory = []\n", " real_inventory = []\n", " state = self.get_state(0, inventory, starting_money, self.timeseries)\n", " states_sell = []\n", " states_buy = []\n", "\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " action, prob = self.act_softmax(state)\n", " print(t, prob)\n", "\n", " if action == 1 and starting_money >= self.trend[t] and t < (len(self.trend) - 1 - window_size):\n", " inventory.append(self.trend[t])\n", " real_inventory.append(self.real_trend[t])\n", " real_starting_money -= self.real_trend[t]\n", " starting_money -= self.trend[t]\n", " states_buy.append(t)\n", " print(\n", " 'day %d: buy 1 unit at price %f, total balance %f'\n", " % (t, self.real_trend[t], real_starting_money)\n", " )\n", "\n", " elif action == 2 and len(inventory):\n", " bought_price = inventory.pop(0)\n", " real_bought_price = real_inventory.pop(0)\n", " starting_money += self.trend[t]\n", " real_starting_money += self.real_trend[t]\n", " states_sell.append(t)\n", " try:\n", " invest = (\n", " (self.real_trend[t] - real_bought_price)\n", " / real_bought_price\n", " ) * 100\n", " except:\n", " invest = 0\n", " print(\n", " 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n", " % (t, self.real_trend[t], invest, real_starting_money)\n", " )\n", " state = self.get_state(\n", " t + 1, inventory, starting_money, self.timeseries\n", " )\n", "\n", " invest = (\n", " (real_starting_money - real_initial_money) / real_initial_money\n", " ) * 100\n", " total_gains = real_starting_money - real_initial_money\n", " return states_buy, states_sell, total_gains, invest" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['CPRT.csv',\n", " 'AMD.csv',\n", " 'GWR.csv',\n", " 'MTDR.csv',\n", " 'GOOG.csv',\n", " 'TSLA.csv',\n", " 'FSV.csv',\n", " 'LB.csv',\n", " 'FB.csv',\n", " 'SINA.csv',\n", " 'LYFT.csv']" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stocks = [i for i in os.listdir(os.getcwd()) if '.csv' in i and not 'TWTR' in i]\n", "stocks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I want to train on all stocks I downloaded except for Twitter. I want to use Twitter for testing." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "skip = 1\n", "layer_size = 500\n", "output_size = 3\n", "window_size = 20" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "training stock CPRT.csv\n", "iter 10. reward: -1.247987\n", "iter 20. reward: 6.464369\n", "iter 30. reward: 20.931005\n", "iter 40. reward: 17.746705\n", "iter 50. reward: 18.576328\n", "iter 60. reward: 21.053296\n", "iter 70. reward: 19.513437\n", "iter 80. reward: 34.468159\n", "iter 90. reward: 18.841612\n", "iter 100. reward: 30.144099\n", "time taken to train: 17.304582357406616 seconds\n", "\n", "training stock AMD.csv\n", "iter 10. reward: 36.286963\n", "iter 20. reward: 43.994438\n", "iter 30. reward: 36.426547\n", "iter 40. reward: 40.952264\n", "iter 50. reward: 42.701169\n", "iter 60. reward: 46.964220\n", "iter 70. reward: 50.213138\n", "iter 80. reward: 47.108041\n", "iter 90. reward: 52.502404\n", "iter 100. reward: 55.356372\n", "time taken to train: 18.030934810638428 seconds\n", "\n", "training stock GWR.csv\n", "iter 10. reward: 21.827143\n", "iter 20. reward: 26.996406\n", "iter 30. reward: 28.478715\n", "iter 40. reward: 24.769332\n", "iter 50. reward: 32.276361\n", "iter 60. reward: 29.583129\n", "iter 70. reward: 32.912309\n", "iter 80. reward: 33.685202\n", "iter 90. reward: 35.657235\n", "iter 100. reward: 33.971033\n", "time taken to train: 17.878694772720337 seconds\n", "\n", "training stock MTDR.csv\n", "iter 10. reward: 6.588120\n", "iter 20. reward: 9.963038\n", "iter 30. reward: 6.995521\n", "iter 40. reward: 11.924601\n", "iter 50. reward: 12.691655\n", "iter 60. reward: 13.768439\n", "iter 70. reward: 13.757468\n", "iter 80. reward: 17.086748\n", "iter 90. reward: 18.127015\n", "iter 100. reward: 17.695863\n", "time taken to train: 16.625855445861816 seconds\n", "\n", "training stock GOOG.csv\n", "iter 10. reward: 14.863618\n", "iter 20. reward: 17.537896\n", "iter 30. reward: 18.676808\n", "iter 40. reward: 22.530143\n", "iter 50. reward: 24.339954\n", "iter 60. reward: 25.471286\n", "iter 70. reward: 27.379953\n", "iter 80. reward: 26.651974\n", "iter 90. reward: 26.503188\n", "iter 100. reward: 28.608727\n", "time taken to train: 18.292449712753296 seconds\n", "\n", "training stock TSLA.csv\n", "iter 10. reward: -1.988759\n", "iter 20. reward: 3.583594\n", "iter 30. reward: 6.227101\n", "iter 40. reward: 7.969605\n", "iter 50. reward: 13.373963\n", "iter 60. reward: 18.205339\n", "iter 70. reward: 19.686566\n", "iter 80. reward: 19.667429\n", "iter 90. reward: 20.270016\n", "iter 100. reward: 22.427184\n", "time taken to train: 17.09872031211853 seconds\n", "\n", "training stock FSV.csv\n", "iter 10. reward: 18.520624\n", "iter 20. reward: 22.422610\n", "iter 30. reward: 23.608830\n", "iter 40. reward: 23.608830\n", "iter 50. reward: 23.507973\n", "iter 60. reward: 24.019357\n", "iter 70. reward: 24.429757\n", "iter 80. reward: 25.059607\n", "iter 90. reward: 25.248546\n", "iter 100. reward: 25.237088\n", "time taken to train: 17.251641750335693 seconds\n", "\n", "training stock LB.csv\n", "iter 10. reward: -4.582982\n", "iter 20. reward: -4.592372\n", "iter 30. reward: -3.883796\n", "iter 40. reward: -3.076274\n", "iter 50. reward: -2.990688\n", "iter 60. reward: -0.984809\n", "iter 70. reward: -0.301800\n", "iter 80. reward: 1.037189\n", "iter 90. reward: 1.035139\n", "iter 100. reward: 1.982279\n", "time taken to train: 17.05810546875 seconds\n", "\n", "training stock FB.csv\n", "iter 10. reward: -28.704470\n", "iter 20. reward: -17.753076\n", "iter 30. reward: -18.305663\n", "iter 40. reward: -17.788208\n", "iter 50. reward: -17.444941\n", "iter 60. reward: -17.783883\n", "iter 70. reward: -18.965700\n", "iter 80. reward: -18.308042\n", "iter 90. reward: -17.689998\n", "iter 100. reward: -17.506858\n", "time taken to train: 16.90356683731079 seconds\n", "\n", "training stock SINA.csv\n", "iter 10. reward: -4.434994\n", "iter 20. reward: 1.403997\n", "iter 30. reward: 2.220121\n", "iter 40. reward: 4.055608\n", "iter 50. reward: 3.661211\n", "iter 60. reward: 4.540796\n", "iter 70. reward: 6.477745\n", "iter 80. reward: 6.597851\n", "iter 90. reward: 6.701629\n", "iter 100. reward: 6.760706\n", "time taken to train: 16.092115879058838 seconds\n", "\n", "training stock LYFT.csv\n", "iter 10. reward: 3.374927\n", "iter 20. reward: 10.456719\n", "iter 30. reward: 10.456719\n", "iter 40. reward: 10.456719\n", "iter 50. reward: 10.456719\n", "iter 60. reward: 10.456719\n", "iter 70. reward: 10.456719\n", "iter 80. reward: 10.456719\n", "iter 90. reward: 10.456719\n", "iter 100. reward: 10.456719\n", "time taken to train: 4.763254642486572 seconds\n", "\n" ] } ], "source": [ "model = Model(input_size = input_size, layer_size = layer_size, output_size = output_size)\n", "agent = None\n", "\n", "for no, stock in enumerate(stocks):\n", " print('training stock %s'%(stock))\n", " df = pd.read_csv(stock)\n", " real_trend = df['Close'].tolist()\n", " parameters = [df['Close'].tolist(), df['Volume'].tolist()]\n", " minmax = MinMaxScaler(feature_range = (100, 200)).fit(np.array(parameters).T)\n", " scaled_parameters = minmax.transform(np.array(parameters).T).T.tolist()\n", " initial_money = np.max(parameters[0]) * 2\n", " \n", " if no == 0:\n", " agent = Agent(model = model,\n", " timeseries = scaled_parameters,\n", " skip = skip,\n", " initial_money = initial_money,\n", " real_trend = real_trend,\n", " minmax = minmax)\n", " else:\n", " agent.change_data(timeseries = scaled_parameters,\n", " skip = skip,\n", " initial_money = initial_money,\n", " real_trend = real_trend,\n", " minmax = minmax)\n", " \n", " agent.fit(iterations = 100, checkpoint = 10)\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### If you saw the whole training session on certain stocks are negatives (like FB), means that, that stock markets are losing very bad" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('GOOG.csv')\n", "real_trend = df['Close'].tolist()\n", "parameters = [df['Close'].tolist(), df['Volume'].tolist()]\n", "minmax = MinMaxScaler(feature_range = (100, 200)).fit(np.array(parameters).T)\n", "scaled_parameters = minmax.transform(np.array(parameters).T).T.tolist()\n", "initial_money = np.max(parameters[0]) * 2\n", "\n", " \n", "agent.change_data(timeseries = scaled_parameters,\n", " skip = skip,\n", " initial_money = initial_money,\n", " real_trend = real_trend,\n", " minmax = minmax)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 [0. 0. 1.]\n", "1 [0. 0. 1.]\n", "2 [0. 0. 1.]\n", "3 [1. 0. 0.]\n", "4 [0. 0. 1.]\n", "5 [2.88041485e-42 1.00000000e+00 0.00000000e+00]\n", "day 5: buy 1 unit at price 1084.989990, total balance 1490.169922\n", "6 [1. 0. 0.]\n", "7 [0. 0. 1.]\n", "day 7, sell 1 unit at price 1139.290039, investment 5.004659 %, total balance 2629.459961,\n", "8 [0. 0. 1.]\n", "9 [0. 0. 1.]\n", "10 [0. 0. 1.]\n", "11 [0. 0. 1.]\n", "12 [0. 0. 1.]\n", "13 [0. 0. 1.]\n", "14 [0.0000000e+00 1.0000000e+00 1.7139084e-34]\n", "day 14: buy 1 unit at price 1134.790039, total balance 1494.669922\n", "15 [0. 0. 1.]\n", "day 15, sell 1 unit at price 1152.119995, investment 1.527151 %, total balance 2646.789917,\n", "16 [0.00000000e+000 3.38086219e-109 1.00000000e+000]\n", "17 [0. 0. 1.]\n", "18 [0. 1. 0.]\n", "day 18: buy 1 unit at price 1168.060059, total balance 1478.729858\n", "19 [0. 0. 1.]\n", "day 19, sell 1 unit at price 1169.839966, investment 0.152381 %, total balance 2648.569824,\n", "20 [0. 1. 0.]\n", "day 20: buy 1 unit at price 1157.660034, total balance 1490.909790\n", "21 [0. 1. 0.]\n", "day 21: buy 1 unit at price 1155.479980, total balance 335.429810\n", "22 [0. 1. 0.]\n", "day 22: buy 1 unit at price 1124.810059, total balance -789.380249\n", "23 [0. 1. 0.]\n", "day 23: buy 1 unit at price 1118.459961, total balance -1907.840210\n", "24 [7.52059788e-254 1.00000000e+000 0.00000000e+000]\n", "25 [1. 0. 0.]\n", "26 [1. 0. 0.]\n", "27 [1. 0. 0.]\n", "28 [0. 1. 0.]\n", "29 [0. 1. 0.]\n", "30 [0. 1. 0.]\n", "31 [0.00000000e+00 1.00000000e+00 2.51869099e-15]\n", "32 [0. 0. 1.]\n", "day 32, sell 1 unit at price 1152.839966, investment -0.416363 %, total balance -755.000244,\n", "33 [1. 0. 0.]\n", "34 [0. 0. 1.]\n", "day 34, sell 1 unit at price 1183.479980, investment 2.423235 %, total balance 428.479736,\n", "35 [1. 0. 0.]\n", "36 [1. 0. 0.]\n", "37 [1. 0. 0.]\n", "38 [1. 0. 0.]\n", "39 [1. 0. 0.]\n", "40 [1. 0. 0.]\n", "41 [1. 0. 0.]\n", "42 [1. 0. 0.]\n", "43 [0. 1. 0.]\n", "day 43: buy 1 unit at price 1263.699951, total balance -835.220215\n", "44 [0. 1. 0.]\n", "45 [0. 1. 0.]\n", "46 [0. 1. 0.]\n", "47 [0. 1. 0.]\n", "48 [0. 1. 0.]\n", "49 [0. 1. 0.]\n", "50 [0. 1. 0.]\n", "51 [0. 1. 0.]\n", "52 [0. 1. 0.]\n", "53 [0. 1. 0.]\n", "54 [0. 1. 0.]\n", "55 [0. 0. 1.]\n", "day 55, sell 1 unit at price 1237.609985, investment 10.028353 %, total balance 402.389770,\n", "56 [1. 0. 0.]\n", "57 [0. 1. 0.]\n", "day 57: buy 1 unit at price 1242.099976, total balance -839.710206\n", "58 [0. 1. 0.]\n", "59 [0. 1. 0.]\n", "60 [1. 0. 0.]\n", "61 [1. 0. 0.]\n", "62 [1. 0. 0.]\n", "63 [1. 0. 0.]\n", "64 [1. 0. 0.]\n", "65 [0. 1. 0.]\n", "66 [0. 1. 0.]\n", "67 [1. 0. 0.]\n", "68 [1. 0. 0.]\n", "69 [1. 0. 0.]\n", "70 [0. 0. 1.]\n", "day 70, sell 1 unit at price 1218.189941, investment 8.916723 %, total balance 378.479735,\n", "71 [1. 0. 0.]\n", "72 [1. 0. 0.]\n", "73 [1. 0. 0.]\n", "74 [1. 0. 0.]\n", "75 [0. 0. 1.]\n", "day 75, sell 1 unit at price 1164.640015, investment -7.838881 %, total balance 1543.119750,\n", "76 [0. 0. 1.]\n", "day 76, sell 1 unit at price 1177.359985, investment -5.212140 %, total balance 2720.479735,\n", "77 [1.00000000e+000 1.71349693e-284 0.00000000e+000]\n", "78 [0. 0. 1.]\n", "79 [0. 1. 0.]\n", "day 79: buy 1 unit at price 1172.530029, total balance 1547.949706\n", "80 [0. 0. 1.]\n", "day 80, sell 1 unit at price 1156.050049, investment -1.405506 %, total balance 2703.999755,\n", "81 [0. 0. 1.]\n", "82 [0. 0. 1.]\n", "83 [0. 0. 1.]\n", "84 [0. 0. 1.]\n", "85 [0. 0. 1.]\n", "86 [0. 0. 1.]\n", "87 [1. 0. 0.]\n", "88 [0. 0. 1.]\n", "89 [1. 0. 0.]\n", "90 [0. 0. 1.]\n", "91 [0. 0. 1.]\n", "92 [0. 0. 1.]\n", "93 [0. 1. 0.]\n", "day 93: buy 1 unit at price 1168.189941, total balance 1535.809814\n", "94 [1. 0. 0.]\n", "95 [0. 1. 0.]\n", "day 95: buy 1 unit at price 1148.969971, total balance 386.839843\n", "96 [0. 1. 0.]\n", "day 96: buy 1 unit at price 1138.819946, total balance -751.980103\n", "97 [0. 1. 0.]\n", "day 97: buy 1 unit at price 1081.219971, total balance -1833.200074\n", "98 [2.58002336e-293 0.00000000e+000 1.00000000e+000]\n", "day 98, sell 1 unit at price 1079.319946, investment -7.607495 %, total balance -753.880128,\n", "99 [0. 1. 0.]\n", "day 99: buy 1 unit at price 1110.079956, total balance -1863.960084\n", "100 [0. 1. 0.]\n", "101 [0. 0. 1.]\n", "day 101, sell 1 unit at price 1121.280029, investment -2.409980 %, total balance -742.680055,\n", "102 [0. 0. 1.]\n", "day 102, sell 1 unit at price 1115.689941, investment -2.031050 %, total balance 373.009886,\n", "103 [1. 0. 0.]\n", "104 [0. 0. 1.]\n", "day 104, sell 1 unit at price 1096.459961, investment 1.409518 %, total balance 1469.469847,\n", "105 [0. 0. 1.]\n", "day 105, sell 1 unit at price 1101.160034, investment -0.803539 %, total balance 2570.629881,\n", "106 [0. 0. 1.]\n", "107 [0. 0. 1.]\n", "108 [0. 0. 1.]\n", "109 [0. 0. 1.]\n", "110 [1. 0. 0.]\n", "111 [0. 0. 1.]\n", "112 [1. 0. 0.]\n", "113 [0. 0. 1.]\n", "114 [0. 0. 1.]\n", "115 [0. 0. 1.]\n", "116 [0. 1. 0.]\n", "day 116: buy 1 unit at price 1055.810059, total balance 1514.819822\n", "117 [0. 1. 0.]\n", "day 117: buy 1 unit at price 1093.390015, total balance 421.429807\n", "118 [0. 0. 1.]\n", "day 118, sell 1 unit at price 1082.400024, investment 2.518442 %, total balance 1503.829831,\n", "119 [0. 0. 1.]\n", "day 119, sell 1 unit at price 1066.150024, investment -2.491333 %, total balance 2569.979855,\n", "120 [1. 0. 0.]\n", "121 [0. 0. 1.]\n", "122 [0. 0. 1.]\n", "123 [0. 0. 1.]\n", "124 [1. 0. 0.]\n", "125 [1. 0. 0.]\n", "126 [1. 0. 0.]\n", "127 [1. 0. 0.]\n", "128 [1. 0. 0.]\n", "129 [1. 0. 0.]\n", "130 [1. 0. 0.]\n", "131 [1. 0. 0.]\n", "132 [0. 0. 1.]\n", "133 [0. 0. 1.]\n", "134 [1. 0. 0.]\n", "135 [0. 1. 0.]\n", "day 135: buy 1 unit at price 1050.819946, total balance 1519.159909\n", "136 [1. 0. 0.]\n", "137 [0. 0. 1.]\n", "day 137, sell 1 unit at price 1036.579956, investment -1.355131 %, total balance 2555.739865,\n", "138 [0. 0. 1.]\n", "139 [0. 0. 1.]\n", "140 [0. 1. 0.]\n", "day 140: buy 1 unit at price 1063.680054, total balance 1492.059811\n", "141 [0. 0. 1.]\n", "day 141, sell 1 unit at price 1061.900024, investment -0.167346 %, total balance 2553.959835,\n", "142 [0. 0. 1.]\n", "143 [0. 0. 1.]\n", "144 [0. 1. 0.]\n", "day 144: buy 1 unit at price 1028.709961, total balance 1525.249874\n", "145 [1. 0. 0.]\n", "146 [0. 1. 0.]\n", "day 146: buy 1 unit at price 1009.409973, total balance 515.839901\n", "147 [0. 0. 1.]\n", "day 147, sell 1 unit at price 979.539978, investment -4.779771 %, total balance 1495.379879,\n", "148 [1. 0. 0.]\n", "149 [0. 1. 0.]\n", "day 149: buy 1 unit at price 1039.459961, total balance 455.919918\n", "150 [1. 0. 0.]\n", "151 [0. 0. 1.]\n", "day 151, sell 1 unit at price 1037.079956, investment 2.741204 %, total balance 1492.999874,\n", "152 [1. 0. 0.]\n", "153 [0. 0. 1.]\n", "day 153, sell 1 unit at price 1045.849976, investment 0.614744 %, total balance 2538.849850,\n", "154 [0. 0. 1.]\n", "155 [0. 0. 1.]\n", "156 [1. 0. 0.]\n", "157 [0. 0. 1.]\n", "158 [0. 0. 1.]\n", "159 [0. 0. 1.]\n", "160 [0. 0. 1.]\n", "161 [1. 0. 0.]\n", "162 [1. 0. 0.]\n", "163 [1. 0. 0.]\n", "164 [1. 0. 0.]\n", "165 [1. 0. 0.]\n", "166 [1. 0. 0.]\n", "167 [0. 1. 0.]\n", "day 167: buy 1 unit at price 1075.569946, total balance 1463.279904\n", "168 [1. 0. 0.]\n", "169 [1. 0. 0.]\n", "170 [0. 1. 0.]\n", "day 170: buy 1 unit at price 1070.079956, total balance 393.199948\n", "171 [1. 0. 0.]\n", "172 [0. 1. 0.]\n", "day 172: buy 1 unit at price 1089.060059, total balance -695.860111\n", "173 [0. 1. 0.]\n", "day 173: buy 1 unit at price 1116.369995, total balance -1812.230106\n", "174 [1. 0. 0.]\n", "175 [1. 0. 0.]\n", "176 [1. 0. 0.]\n", "177 [1. 0. 0.]\n", "178 [0. 1. 0.]\n", "179 [0. 1. 0.]\n", "180 [0. 1. 0.]\n", "181 [0. 1. 0.]\n", "182 [0. 0. 1.]\n", "day 182, sell 1 unit at price 1120.160034, investment 4.145717 %, total balance -692.070072,\n", "183 [0. 0. 1.]\n", "day 183, sell 1 unit at price 1121.670044, investment 4.821143 %, total balance 429.599972,\n", "184 [0. 1. 0.]\n", "day 184: buy 1 unit at price 1113.650024, total balance -684.050052\n", "185 [0. 1. 0.]\n", "day 185: buy 1 unit at price 1118.560059, total balance -1802.610111\n", "186 [0.0000000e+00 1.0000000e+00 3.9040329e-80]\n", "187 [0. 1. 0.]\n", "188 [0. 0. 1.]\n", "day 188, sell 1 unit at price 1110.369995, investment 1.956727 %, total balance -692.240116,\n", "189 [0. 1. 0.]\n", "day 189: buy 1 unit at price 1109.400024, total balance -1801.640140\n", "190 [0. 1. 0.]\n", "191 [1. 0. 0.]\n", "192 [1. 0. 0.]\n", "193 [0. 1. 0.]\n", "194 [1. 0. 0.]\n", "195 [1. 0. 0.]\n", "196 [1. 0. 0.]\n", "197 [1. 0. 0.]\n", "198 [0. 1. 0.]\n", "199 [0. 1. 0.]\n", "200 [1. 0. 0.]\n", "201 [1.00000000e+00 0.00000000e+00 1.11009789e-17]\n", "202 [0. 0. 1.]\n", "day 202, sell 1 unit at price 1185.550049, investment 6.196875 %, total balance -616.090091,\n", "203 [0. 1. 0.]\n", "day 203: buy 1 unit at price 1184.459961, total balance -1800.550052\n", "204 [0. 1. 0.]\n", "205 [0. 1. 0.]\n", "206 [0. 1. 0.]\n", "207 [0. 1. 0.]\n", "208 [0. 1. 0.]\n", "209 [0. 1. 0.]\n", "210 [0. 1. 0.]\n", "211 [0. 1. 0.]\n", "212 [0. 1. 0.]\n", "213 [0. 1. 0.]\n", "214 [0. 1. 0.]\n", "215 [0. 1. 0.]\n", "216 [0. 1. 0.]\n", "217 [0. 1. 0.]\n", "218 [0. 1. 0.]\n", "219 [1. 0. 0.]\n", "220 [1. 0. 0.]\n", "221 [0. 0. 1.]\n", "day 221, sell 1 unit at price 1202.160034, investment 7.947740 %, total balance -598.390018,\n", "222 [1. 0. 0.]\n", "223 [1. 0. 0.]\n", "224 [1. 0. 0.]\n", "225 [1. 0. 0.]\n", "226 [1. 0. 0.]\n", "227 [1. 0. 0.]\n", "228 [1. 0. 0.]\n", "229 [1. 0. 0.]\n", "230 [1. 0. 0.]\n", "231 [0. 1. 0.]\n", "232 [0. 1. 0.]\n", "233 [0. 1. 0.]\n", "234 [1. 0. 0.]\n", "235 [1. 0. 0.]\n", "236 [0. 1. 0.]\n", "237 [0. 1. 0.]\n", "238 [0. 1. 0.]\n", "239 [0. 0. 1.]\n", "day 239, sell 1 unit at price 1174.099976, investment 4.965305 %, total balance 575.709958,\n", "240 [0. 1. 0.]\n", "241 [0. 0. 1.]\n", "day 241, sell 1 unit at price 1162.380005, investment 4.775553 %, total balance 1738.089963,\n", "242 [0. 0. 1.]\n", "day 242, sell 1 unit at price 1164.270020, investment -1.704569 %, total balance 2902.359983,\n", "243 [0. 1. 0.]\n", "244 [0. 0. 1.]\n", "245 [0. 0. 1.]\n", "246 [0. 0. 1.]\n", "247 [0. 0. 1.]\n", "248 [0. 0. 1.]\n", "249 [1. 0. 0.]\n", "250 [0. 0. 1.]\n" ] } ], "source": [ "states_buy, states_sell, total_gains, invest = agent.buy()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (15, 5))\n", "plt.plot(df['Close'], color='r', lw=2.)\n", "plt.plot(df['Close'], '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n", "plt.plot(df['Close'], 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n", "plt.title('GOOG total gains %f, total investment %f%%'%(total_gains, invest))\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 [0. 0. 1.]\n", "1 [0. 0. 1.]\n", "2 [0. 0. 1.]\n", "3 [0. 0. 1.]\n", "4 [0. 0. 1.]\n", "5 [0. 0. 1.]\n", "6 [0. 0. 1.]\n", "7 [0. 0. 1.]\n", "8 [0. 0. 1.]\n", "9 [1. 0. 0.]\n", "10 [1. 0. 0.]\n", "11 [0. 1. 0.]\n", "day 11: buy 1 unit at price 41.209999, total balance 52.309997\n", "12 [0. 1. 0.]\n", "day 12: buy 1 unit at price 41.419998, total balance 10.889999\n", "13 [0. 0. 1.]\n", "day 13, sell 1 unit at price 43.490002, investment 5.532645 %, total balance 54.380001,\n", "14 [0. 0. 1.]\n", "day 14, sell 1 unit at price 44.070000, investment 6.397881 %, total balance 98.450001,\n", "15 [0. 1. 0.]\n", "day 15: buy 1 unit at price 46.759998, total balance 51.690003\n", "16 [0. 0. 1.]\n", "day 16, sell 1 unit at price 45.799999, investment -2.053035 %, total balance 97.490002,\n", "17 [0. 0. 1.]\n", "18 [0. 1. 0.]\n", "day 18: buy 1 unit at price 44.950001, total balance 52.540001\n", "19 [0. 1. 0.]\n", "day 19: buy 1 unit at price 46.130001, total balance 6.410000\n", "20 [0. 1. 0.]\n", "21 [0. 1. 0.]\n", "22 [0. 1. 0.]\n", "23 [0. 1. 0.]\n", "24 [0. 1. 0.]\n", "25 [0. 1. 0.]\n", "26 [0. 1. 0.]\n", "27 [1. 0. 0.]\n", "28 [1. 0. 0.]\n", "29 [0. 1. 0.]\n", "30 [0. 1. 0.]\n", "31 [4.84761617e-08 9.99999952e-01 0.00000000e+00]\n", "32 [1. 0. 0.]\n", "33 [0. 1. 0.]\n", "34 [1. 0. 0.]\n", "35 [1. 0. 0.]\n", "36 [0. 0. 1.]\n", "day 36, sell 1 unit at price 44.259998, investment -1.535046 %, total balance 50.669998,\n", "37 [0. 1. 0.]\n", "day 37: buy 1 unit at price 44.709999, total balance 5.959999\n", "38 [0. 0. 1.]\n", "day 38, sell 1 unit at price 43.340000, investment -6.048127 %, total balance 49.299999,\n", "39 [0. 0. 1.]\n", "day 39, sell 1 unit at price 43.439999, investment -2.840528 %, total balance 92.739998,\n", "40 [0. 1. 0.]\n", "day 40: buy 1 unit at price 43.419998, total balance 49.320000\n", "41 [1. 0. 0.]\n", "42 [1. 0. 0.]\n", "43 [0. 0. 1.]\n", "day 43, sell 1 unit at price 44.220001, investment 1.842476 %, total balance 93.540001,\n", "44 [0. 0. 1.]\n", "45 [1. 0. 0.]\n", "46 [1. 0. 0.]\n", "47 [0. 1. 0.]\n", "day 47: buy 1 unit at price 31.870001, total balance 61.670000\n", "48 [1. 0. 0.]\n", "49 [0. 0. 1.]\n", "day 49, sell 1 unit at price 32.820000, investment 2.980857 %, total balance 94.490000,\n", "50 [1. 0. 0.]\n", "51 [0. 0. 1.]\n", "52 [0. 0. 1.]\n", "53 [0. 0. 1.]\n", "54 [0. 0. 1.]\n", "55 [0. 0. 1.]\n", "56 [0. 0. 1.]\n", "57 [0. 0. 1.]\n", "58 [0. 0. 1.]\n", "59 [0. 0. 1.]\n", "60 [0. 0. 1.]\n", "61 [0. 0. 1.]\n", "62 [1. 0. 0.]\n", "63 [0. 0. 1.]\n", "64 [1. 0. 0.]\n", "65 [1. 0. 0.]\n", "66 [1. 0. 0.]\n", "67 [1. 0. 0.]\n", "68 [1.00000000e+000 0.00000000e+000 5.88236875e-246]\n", "69 [0. 0.30331368 0.69668632]\n", "70 [1. 0. 0.]\n", "71 [1. 0. 0.]\n", "72 [1. 0. 0.]\n", "73 [0. 1. 0.]\n", "day 73: buy 1 unit at price 30.809999, total balance 63.680001\n", "74 [0. 1. 0.]\n", "day 74: buy 1 unit at price 30.490000, total balance 33.190001\n", "75 [1. 0. 0.]\n", "76 [0. 1. 0.]\n", "day 76: buy 1 unit at price 30.889999, total balance 2.300002\n", "77 [0. 1. 0.]\n", "78 [0. 1. 0.]\n", "79 [0. 1. 0.]\n", "80 [0. 0. 1.]\n", "day 80, sell 1 unit at price 28.860001, investment -6.329108 %, total balance 31.160003,\n", "81 [0.00000000e+000 1.00000000e+000 8.40150266e-172]\n", "day 81: buy 1 unit at price 29.219999, total balance 1.940004\n", "82 [0. 0. 1.]\n", "day 82, sell 1 unit at price 29.520000, investment -3.181371 %, total balance 31.460004,\n", "83 [1.00000000e+000 0.00000000e+000 1.68749158e-251]\n", "84 [0. 0. 1.]\n", "day 84, sell 1 unit at price 28.500000, investment -7.737129 %, total balance 59.960004,\n", "85 [0. 0. 1.]\n", "day 85, sell 1 unit at price 28.600000, investment -2.121831 %, total balance 88.560004,\n", "86 [0. 0. 1.]\n", "87 [0. 0. 1.]\n", "88 [0. 0. 1.]\n", "89 [1. 0. 0.]\n", "90 [0. 0. 1.]\n", "91 [1. 0. 0.]\n", "92 [1. 0. 0.]\n", "93 [1. 0. 0.]\n", "94 [1. 0. 0.]\n", "95 [0. 0. 1.]\n", "96 [1.49596746e-208 0.00000000e+000 1.00000000e+000]\n", "97 [0. 0. 1.]\n", "98 [0. 0. 1.]\n", "99 [1. 0. 0.]\n", "100 [0. 0. 1.]\n", "101 [0. 0. 1.]\n", "102 [0. 0. 1.]\n", "103 [1. 0. 0.]\n", "104 [0. 0. 1.]\n", "105 [0. 0. 1.]\n", "106 [0. 0. 1.]\n", "107 [0. 0. 1.]\n", "108 [1. 0. 0.]\n", "109 [1. 0. 0.]\n", "110 [0. 0. 1.]\n", "111 [0. 0. 1.]\n", "112 [0. 1. 0.]\n", "day 112: buy 1 unit at price 34.750000, total balance 53.810004\n", "113 [0. 1. 0.]\n", "day 113: buy 1 unit at price 34.619999, total balance 19.190005\n", "114 [0. 0. 1.]\n", "day 114, sell 1 unit at price 34.299999, investment -1.294967 %, total balance 53.490004,\n", "115 [0. 0. 1.]\n", "day 115, sell 1 unit at price 34.020000, investment -1.733099 %, total balance 87.510004,\n", "116 [0. 1. 0.]\n", "day 116: buy 1 unit at price 34.419998, total balance 53.090006\n", "117 [0. 1. 0.]\n", "day 117: buy 1 unit at price 34.990002, total balance 18.100004\n", "118 [0. 1. 0.]\n", "119 [0. 1. 0.]\n", "120 [0. 1. 0.]\n", "121 [0. 1. 0.]\n", "122 [0. 1. 0.]\n", "123 [0. 1. 0.]\n", "124 [0. 1. 0.]\n", "125 [0. 1. 0.]\n", "126 [0. 1. 0.]\n", "127 [1. 0. 0.]\n", "128 [1. 0. 0.]\n", "129 [1.00000000e+000 3.87913053e-131 0.00000000e+000]\n", "130 [1. 0. 0.]\n", "131 [1. 0. 0.]\n", "132 [1. 0. 0.]\n", "133 [1. 0. 0.]\n", "134 [0. 0. 1.]\n", "day 134, sell 1 unit at price 33.660000, investment -2.208013 %, total balance 51.760004,\n", "135 [1. 0. 0.]\n", "136 [0. 0. 1.]\n", "day 136, sell 1 unit at price 32.959999, investment -5.801666 %, total balance 84.720003,\n", "137 [0. 0. 1.]\n", "138 [0. 0. 1.]\n", "139 [0. 0. 1.]\n", "140 [0. 0. 1.]\n", "141 [1.00000000e+000 2.08795633e-032 2.67176100e-180]\n", "142 [0. 0. 1.]\n", "143 [0. 0. 1.]\n", "144 [0. 0. 1.]\n", "145 [0. 1. 0.]\n", "day 145: buy 1 unit at price 32.930000, total balance 51.790003\n", "146 [1. 0. 0.]\n", "147 [0. 1. 0.]\n", "day 147: buy 1 unit at price 27.309999, total balance 24.480004\n", "148 [0. 1. 0.]\n", "day 148: buy 1 unit at price 26.450001, total balance -1.969997\n", "149 [0. 1. 0.]\n", "150 [0. 0. 1.]\n", "day 150, sell 1 unit at price 28.680000, investment -12.906165 %, total balance 26.710003,\n", "151 [0. 1. 0.]\n", "day 151: buy 1 unit at price 28.430000, total balance -1.719997\n", "152 [0. 1. 0.]\n", "153 [0. 0. 1.]\n", "day 153, sell 1 unit at price 28.809999, investment 5.492494 %, total balance 27.090002,\n", "154 [0. 0. 1.]\n", "day 154, sell 1 unit at price 27.990000, investment 5.822302 %, total balance 55.080002,\n", "155 [0. 0. 1.]\n", "day 155, sell 1 unit at price 29.950001, investment 5.346469 %, total balance 85.030003,\n", "156 [0. 0. 1.]\n", "157 [0. 0. 1.]\n", "158 [0. 0. 1.]\n", "159 [0. 0. 1.]\n", "160 [1. 0. 0.]\n", "161 [1. 0. 0.]\n", "162 [1.00000000e+00 0.00000000e+00 1.18347919e-79]\n", "163 [0. 0. 1.]\n", "164 [1. 0. 0.]\n", "165 [1. 0. 0.]\n", "166 [0. 1. 0.]\n", "day 166: buy 1 unit at price 32.250000, total balance 52.780003\n", "167 [0. 1. 0.]\n", "day 167: buy 1 unit at price 30.969999, total balance 21.810004\n", "168 [1.00000000e+000 3.75718032e-277 0.00000000e+000]\n", "169 [0. 1. 0.]\n", "day 169: buy 1 unit at price 32.900002, total balance -11.089998\n", "170 [0. 1. 0.]\n", "171 [0. 1. 0.]\n", "172 [0. 1. 0.]\n", "173 [0. 1. 0.]\n", "174 [0. 1. 0.]\n", "175 [0. 1. 0.]\n", "176 [0. 1. 0.]\n", "177 [0. 0. 1.]\n", "day 177, sell 1 unit at price 34.160000, investment 5.922481 %, total balance 23.070002,\n", "178 [1. 0. 0.]\n", "179 [1. 0. 0.]\n", "180 [0. 1. 0.]\n", "day 180: buy 1 unit at price 30.230000, total balance -7.159998\n", "181 [0. 1. 0.]\n", "182 [0. 0. 1.]\n", "day 182, sell 1 unit at price 31.120001, investment 0.484346 %, total balance 23.960003,\n", "183 [0. 0. 1.]\n", "day 183, sell 1 unit at price 30.959999, investment -5.896665 %, total balance 54.920002,\n", "184 [0. 0. 1.]\n", "day 184, sell 1 unit at price 31.230000, investment 3.307972 %, total balance 86.150002,\n", "185 [0. 0. 1.]\n", "186 [0. 0. 1.]\n", "187 [0. 0. 1.]\n", "188 [0. 0. 1.]\n", "189 [0. 0. 1.]\n", "190 [0. 0. 1.]\n", "191 [0. 0. 1.]\n", "192 [0. 0. 1.]\n", "193 [1. 0. 0.]\n", "194 [0. 0. 1.]\n", "195 [0. 0. 1.]\n", "196 [1. 0. 0.]\n", "197 [1. 0. 0.]\n", "198 [1. 0. 0.]\n", "199 [0. 1. 0.]\n", "day 199: buy 1 unit at price 30.870001, total balance 55.280001\n", "200 [1. 0. 0.]\n", "201 [1. 0. 0.]\n", "202 [0. 0. 1.]\n", "day 202, sell 1 unit at price 31.030001, investment 0.518303 %, total balance 86.310002,\n", "203 [0. 0. 1.]\n", "204 [0. 0. 1.]\n", "205 [0. 0. 1.]\n", "206 [1.00000000e+000 3.78767981e-200 0.00000000e+000]\n", "207 [1. 0. 0.]\n", "208 [0. 0. 1.]\n", "209 [1. 0. 0.]\n", "210 [0. 1. 0.]\n", "day 210: buy 1 unit at price 33.060001, total balance 53.250001\n", "211 [1. 0. 0.]\n", "212 [0. 1. 0.]\n", "day 212: buy 1 unit at price 32.869999, total balance 20.380002\n", "213 [1. 0. 0.]\n", "214 [0. 1. 0.]\n", "215 [0. 0. 1.]\n", "day 215, sell 1 unit at price 33.750000, investment 2.087111 %, total balance 54.130002,\n", "216 [0. 1. 0.]\n", "day 216: buy 1 unit at price 34.380001, total balance 19.750001\n", "217 [0. 1. 0.]\n", "218 [0. 1. 0.]\n", "219 [0. 1. 0.]\n", "220 [0. 1. 0.]\n", "221 [0. 1. 0.]\n", "222 [0. 1. 0.]\n", "223 [0. 1. 0.]\n", "224 [0. 1. 0.]\n", "225 [1. 0. 0.]\n", "226 [1.00000000e+000 1.79166683e-113 0.00000000e+000]\n", "227 [1. 0. 0.]\n", "228 [0. 1. 0.]\n", "229 [1. 0. 0.]\n", "230 [1. 0. 0.]\n", "231 [0. 1. 0.]\n", "232 [0. 1. 0.]\n", "233 [0. 1. 0.]\n", "234 [0. 1. 0.]\n", "235 [0. 1. 0.]\n", "236 [0. 0. 1.]\n", "day 236, sell 1 unit at price 39.950001, investment 21.539404 %, total balance 59.700002,\n", "237 [0.00000000e+000 3.52341905e-242 1.00000000e+000]\n", "day 237, sell 1 unit at price 40.799999, investment 18.673641 %, total balance 100.500001,\n", "238 [0. 1. 0.]\n", "239 [1. 0. 0.]\n", "240 [0. 1. 0.]\n", "241 [0. 1. 0.]\n", "242 [0. 1. 0.]\n", "243 [0. 1. 0.]\n", "244 [0. 1. 0.]\n", "245 [0. 1. 0.]\n", "246 [0. 1. 0.]\n", "247 [0. 1. 0.]\n", "248 [1. 0. 0.]\n", "249 [1. 0. 0.]\n", "250 [0. 1. 0.]\n" ] } ], "source": [ "df = pd.read_csv('TWTR.csv')\n", "real_trend = df['Close'].tolist()\n", "parameters = [df['Close'].tolist(), df['Volume'].tolist()]\n", "minmax = MinMaxScaler(feature_range = (100, 200)).fit(np.array(parameters).T)\n", "scaled_parameters = minmax.transform(np.array(parameters).T).T.tolist()\n", "initial_money = np.max(parameters[0]) * 2\n", "\n", "agent.change_data(timeseries = scaled_parameters,\n", " skip = skip,\n", " initial_money = initial_money,\n", " real_trend = real_trend,\n", " minmax = minmax)\n", "\n", "states_buy, states_sell, total_gains, invest = agent.buy()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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WnsPcE/svTGmCDjBWvuZu+k7wGPW2lCyOowxI2OBnTHmGJy+oOuSlRcRERERkfbburWEzMxs+vUb1q6goK/z+72EQl0b1EWjUcLhENu3b2Pr1hIGDy5I+didWqfOGJMFnAkc2MK+JcA3rLXrgb8aY4YCEaAcmNVaECjpU1lRyz///iVfP2lPsnOCXd0cEREREelAoVCdAroeyuPx4PcHGDhwCBs3tm957nYHddbasQmvq4EBScpNTXh9VHvPI+nx0YJVbFhTxsIFqzjsmN26ujkiIiIi0sEU0PVsHo8XaN9cIt70NEW6o8qKWpZ+6kxQuvTTYqoq1NdaRERERByVFbW88PgS3SP2QArq+pCPFqwiGnWi/mg0ysIFmqdGRERERByJPbo6yiGH7EdVVVWH1ffAA/fxxhuvd1h9ySxd+gW33XZT2up/+eV/cNNN13dYfQrq+ojKilqWfryBSNgJ6iLhqLJ1IiIiIgL0nB5dF110CUce+fW0n2fixD255ZY7036ejrJTE6VIz/HRglVEI1GgoY91LFvX3cfWlb70IqGtWyk45zz1ERcRERFJg5Z6dHXUPeKTTz7Gu+++TW1tDd/73mXMnHkkGzas56KLzmX+/DcAGr3/1a9+xvDhwzn77PMA+Oqrpdxyy4088cSz3H33bUycuAennXYmDz54P6tXr6KysoL169cxcuQo7rjjZ2RmZlJRUcFPf3obK1euID+/gLy8fAYNGszll1/VqG01NTXceectFBWtwOfzM3r0GO644x4WLVrIH//4Wx588DEAnn32KebN+xs5ObnMmHEwzz33NPPnvxFv96xZp/LBBwuoqanhhhtuZsqUqYRCIa6//irKysqora1lzz0ncd11NxIIBDrke02kTF0fEHvyEqFxQNQTsnXRUIjSf/ydsrffJFy2raubIyIiItLrxO8V09Sjy+v18sgjT/Czn/2an//8brZu3dJq+dNOO4O///25eJD57LNPc8op32zx4b61X3LLLXfx+OPPEAqFeP31VwB4+OG/kJvbnyeeeJY77riHTz5Z0uK5PvzwP1RVVfK3vz3LX//6JNddd2OzMsuXL+Oxxx7hT396iAceeJTt2xsvUl5WVsZee03m4Yef4MILL+a++34HgM/n45Zb7uTBBx/jsceeIhwOM3/+39v+wnaAgro+IPHJS1PdfWxd/eYSCIcB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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (15, 5))\n", "plt.plot(df['Close'], color='r', lw=2.)\n", "plt.plot(df['Close'], '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n", "plt.plot(df['Close'], 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n", "plt.title('TWTR total gains %f, total investment %f%%'%(total_gains, invest))\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247020'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247175'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247287'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247427'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247529'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247611'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247683'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247790'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247877'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.247947'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248107'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248180'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248251'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248322'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248392'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248463'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248535'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248605'}\n", "{'status': 'data not enough to trade', 'action': 'fail', 'balance': 93.51999599999999, 'timestamp': '2019-08-31 02:39:42.248674'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 46.130001', 'action': 'buy', 'balance': 47.38999499999999, 'timestamp': '2019-08-31 02:39:42.251303'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 45.240002', 'action': 'buy', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.251959'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.252573'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.253071'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.253555'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.254131'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.254743'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.255300'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.255858'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.256398'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.256922'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.257477'}\n", "[1.51020718e-59 1.00000000e+00 0.00000000e+00]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.258040'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.258505'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.259010'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.259559'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 2.149992999999988, 'timestamp': '2019-08-31 02:39:42.260065'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 44.259998', 'investment': -4.053767525389831, 'gain': -1.870003000000004, 'balance': 46.409990999999984, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.260639'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 44.709999', 'action': 'buy', 'balance': 1.6999919999999875, 'timestamp': '2019-08-31 02:39:42.261195'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 43.340000', 'investment': -4.199827400538136, 'gain': -1.9000020000000006, 'balance': 45.03999199999999, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.261827'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 43.439999', 'investment': -2.8405279096517004, 'gain': -1.269999999999996, 'balance': 88.47999099999998, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.262354'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 43.419998', 'action': 'buy', 'balance': 45.059992999999984, 'timestamp': '2019-08-31 02:39:42.262827'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 45.059992999999984, 'timestamp': '2019-08-31 02:39:42.263297'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 45.059992999999984, 'timestamp': '2019-08-31 02:39:42.263789'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 44.220001', 'investment': 1.8424759024632011, 'gain': 0.8000030000000038, 'balance': 89.27999399999999, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.264333'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 89.27999399999999, 'timestamp': '2019-08-31 02:39:42.264848'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 89.27999399999999, 'timestamp': '2019-08-31 02:39:42.265265'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 89.27999399999999, 'timestamp': '2019-08-31 02:39:42.265720'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 31.870001', 'action': 'buy', 'balance': 57.409992999999986, 'timestamp': '2019-08-31 02:39:42.266187'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 57.409992999999986, 'timestamp': '2019-08-31 02:39:42.266665'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 32.820000', 'investment': 2.980856511425896, 'gain': 0.9499989999999983, 'balance': 90.22999299999998, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.267213'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.267673'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.268178'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.268595'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.269065'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.269536'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.269989'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.270436'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.270887'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.271333'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.271783'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.272248'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.272705'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.273157'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.273620'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.274058'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.274518'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.274966'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.275422'}\n", "[1.00000000e+000 0.00000000e+000 7.84116119e-283]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 90.22999299999998, 'timestamp': '2019-08-31 02:39:42.275891'}\n", "[0.00000000e+00 1.00000000e+00 1.39371786e-93]\n", "{'status': 'buy 1 unit, cost 35.639999', 'action': 'buy', 'balance': 54.58999399999998, 'timestamp': '2019-08-31 02:39:42.276366'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 54.58999399999998, 'timestamp': '2019-08-31 02:39:42.276836'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 54.58999399999998, 'timestamp': '2019-08-31 02:39:42.277325'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 54.58999399999998, 'timestamp': '2019-08-31 02:39:42.277798'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 30.809999', 'action': 'buy', 'balance': 23.779994999999985, 'timestamp': '2019-08-31 02:39:42.278268'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 30.490000', 'action': 'buy', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.278739'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.279207'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.279678'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.280149'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.280618'}\n", "[0. 1. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': -6.710005000000013, 'timestamp': '2019-08-31 02:39:42.281083'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 28.860001', 'investment': -19.023563945666766, 'gain': -6.7799979999999955, 'balance': 22.149995999999987, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.281636'}\n", "[0. 1. 0.]\n", "{'status': 'buy 1 unit, cost 29.219999', 'action': 'buy', 'balance': -7.0700030000000105, 'timestamp': '2019-08-31 02:39:42.282125'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 29.520000', 'investment': -4.186949178414432, 'gain': -1.2899989999999946, 'balance': 22.44999699999999, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.282660'}\n", "[1.0e+000 0.0e+000 2.5e-323]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 22.44999699999999, 'timestamp': '2019-08-31 02:39:42.283158'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 28.500000', 'investment': -6.526730075434576, 'gain': -1.990000000000002, 'balance': 50.94999699999999, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.283696'}\n", "[0. 0. 1.]\n", "{'status': 'sell 1 unit, price 28.600000', 'investment': -2.121831010329591, 'gain': -0.6199989999999964, 'balance': 79.54999699999999, 'action': 'sell', 'timestamp': '2019-08-31 02:39:42.284236'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.284700'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.285168'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.285621'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.286073'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.286537'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.287003'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.287465'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.287914'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.288377'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.288825'}\n", "[1.4679413e-130 0.0000000e+000 1.0000000e+000]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.289297'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.289754'}\n", "[0. 0. 1.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.290210'}\n", "[1. 0. 0.]\n", "{'status': 'do nothing', 'action': 'nothing', 'balance': 79.54999699999999, 'timestamp': '2019-08-31 02:39:42.290666'}\n" ] } ], "source": [ "from datetime import datetime\n", "\n", "volume = df['Volume'].tolist()\n", "\n", "for i in range(100):\n", " print(agent.trade([real_trend[i], volume[i]]))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import copy\n", "import pickle\n", "\n", "copy_model = copy.deepcopy(agent.model)\n", "\n", "with open('model.pkl', 'wb') as fopen:\n", " pickle.dump(copy_model, fopen)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }