Files
zhoujie2104231 2757a4d0d2 chore: 添加Stock-Prediction-Models项目文件
添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
2025-04-27 16:28:06 +08:00

674 lines
74 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import time\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import random\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"seaborn==0.9.0\n",
"pandas==0.23.4\n",
"numpy==1.14.5\n",
"matplotlib==3.0.2\n"
]
}
],
"source": [
"import pkg_resources\n",
"import types\n",
"\n",
"\n",
"def get_imports():\n",
" for name, val in globals().items():\n",
" if isinstance(val, types.ModuleType):\n",
" name = val.__name__.split('.')[0]\n",
" elif isinstance(val, type):\n",
" name = val.__module__.split('.')[0]\n",
" poorly_named_packages = {'PIL': 'Pillow', 'sklearn': 'scikit-learn'}\n",
" if name in poorly_named_packages.keys():\n",
" name = poorly_named_packages[name]\n",
" yield name\n",
"\n",
"\n",
"imports = list(set(get_imports()))\n",
"requirements = []\n",
"for m in pkg_resources.working_set:\n",
" if m.project_name in imports and m.project_name != 'pip':\n",
" requirements.append((m.project_name, m.version))\n",
"\n",
"for r in requirements:\n",
" print('{}=={}'.format(*r))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-11-02</td>\n",
" <td>778.200012</td>\n",
" <td>781.650024</td>\n",
" <td>763.450012</td>\n",
" <td>768.700012</td>\n",
" <td>768.700012</td>\n",
" <td>1872400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-11-03</td>\n",
" <td>767.250000</td>\n",
" <td>769.950012</td>\n",
" <td>759.030029</td>\n",
" <td>762.130005</td>\n",
" <td>762.130005</td>\n",
" <td>1943200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-11-04</td>\n",
" <td>750.659973</td>\n",
" <td>770.359985</td>\n",
" <td>750.560974</td>\n",
" <td>762.020020</td>\n",
" <td>762.020020</td>\n",
" <td>2134800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-11-07</td>\n",
" <td>774.500000</td>\n",
" <td>785.190002</td>\n",
" <td>772.549988</td>\n",
" <td>782.520020</td>\n",
" <td>782.520020</td>\n",
" <td>1585100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-11-08</td>\n",
" <td>783.400024</td>\n",
" <td>795.632996</td>\n",
" <td>780.190002</td>\n",
" <td>790.510010</td>\n",
" <td>790.510010</td>\n",
" <td>1350800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n",
"1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n",
"2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n",
"3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n",
"4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n",
"\n",
" Volume \n",
"0 1872400 \n",
"1 1943200 \n",
"2 2134800 \n",
"3 1585100 \n",
"4 1350800 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 4,
"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",
"\n",
"class Model:\n",
" def __init__(self, input_size, layer_size, output_size):\n",
" self.weights = [\n",
" np.random.randn(input_size, layer_size),\n",
" np.random.randn(layer_size, output_size),\n",
" np.random.randn(1, layer_size),\n",
" ]\n",
"\n",
" def predict(self, inputs):\n",
" feed = np.dot(inputs, self.weights[0]) + self.weights[-1]\n",
" decision = np.dot(feed, 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": 5,
"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, window_size, trend, skip, initial_money):\n",
" self.model = model\n",
" self.window_size = window_size\n",
" self.half_window = window_size // 2\n",
" self.trend = trend\n",
" self.skip = skip\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",
"\n",
" def act(self, sequence):\n",
" decision = self.model.predict(np.array(sequence))\n",
" return np.argmax(decision[0])\n",
" \n",
" def get_state(self, t):\n",
" window_size = self.window_size + 1\n",
" d = t - window_size + 1\n",
" block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n",
" res = []\n",
" for i in range(window_size - 1):\n",
" res.append(block[i + 1] - block[i])\n",
" return np.array([res])\n",
"\n",
" def get_reward(self, weights):\n",
" initial_money = self.initial_money\n",
" starting_money = initial_money\n",
" self.model.weights = weights\n",
" state = self.get_state(0)\n",
" inventory = []\n",
" quantity = 0\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and starting_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" starting_money -= close[t]\n",
" \n",
" elif action == 2 and len(inventory):\n",
" bought_price = inventory.pop(0)\n",
" starting_money += self.trend[t]\n",
"\n",
" state = next_state\n",
" return ((starting_money - initial_money) / initial_money) * 100\n",
"\n",
" def fit(self, iterations, checkpoint):\n",
" self.es.train(iterations, print_every = checkpoint)\n",
"\n",
" def buy(self):\n",
" initial_money = self.initial_money\n",
" state = self.get_state(0)\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" inventory = []\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and initial_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" initial_money -= self.trend[t]\n",
" states_buy.append(t)\n",
" print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n",
" \n",
" elif action == 2 and len(inventory):\n",
" bought_price = inventory.pop(0)\n",
" initial_money += self.trend[t]\n",
" states_sell.append(t)\n",
" try:\n",
" invest = ((close[t] - bought_price) / bought_price) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n",
" % (t, close[t], invest, initial_money)\n",
" )\n",
" state = next_state\n",
"\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"iter 10. reward: 8.610248\n",
"iter 20. reward: 12.257399\n",
"iter 30. reward: 7.689600\n",
"iter 40. reward: 18.719300\n",
"iter 50. reward: 16.883897\n",
"iter 60. reward: 18.100399\n",
"iter 70. reward: 17.280399\n",
"iter 80. reward: 15.865947\n",
"iter 90. reward: 17.435298\n",
"iter 100. reward: 22.108749\n",
"iter 110. reward: 21.537897\n",
"iter 120. reward: 21.986898\n",
"iter 130. reward: 22.303096\n",
"iter 140. reward: 27.540547\n",
"iter 150. reward: 24.151497\n",
"iter 160. reward: 26.339196\n",
"iter 170. reward: 26.184596\n",
"iter 180. reward: 25.859546\n",
"iter 190. reward: 28.623797\n",
"iter 200. reward: 30.171547\n",
"iter 210. reward: 29.712899\n",
"iter 220. reward: 28.880399\n",
"iter 230. reward: 29.221448\n",
"iter 240. reward: 26.622551\n",
"iter 250. reward: 21.736548\n",
"iter 260. reward: 32.192049\n",
"iter 270. reward: 31.077749\n",
"iter 280. reward: 30.869947\n",
"iter 290. reward: 30.829648\n",
"iter 300. reward: 32.587899\n",
"iter 310. reward: 32.627998\n",
"iter 320. reward: 32.198498\n",
"iter 330. reward: 31.940298\n",
"iter 340. reward: 32.789998\n",
"iter 350. reward: 33.619697\n",
"iter 360. reward: 32.738196\n",
"iter 370. reward: 34.456997\n",
"iter 380. reward: 34.972598\n",
"iter 390. reward: 34.632198\n",
"iter 400. reward: 32.573597\n",
"iter 410. reward: 35.826097\n",
"iter 420. reward: 33.999698\n",
"iter 430. reward: 35.530297\n",
"iter 440. reward: 35.589196\n",
"iter 450. reward: 32.944796\n",
"iter 460. reward: 36.473798\n",
"iter 470. reward: 38.662997\n",
"iter 480. reward: 37.648599\n",
"iter 490. reward: 37.361099\n",
"iter 500. reward: 37.407198\n",
"time taken to train: 33.66626238822937 seconds\n"
]
}
],
"source": [
"close = df.Close.values.tolist()\n",
"window_size = 30\n",
"skip = 1\n",
"initial_money = 10000\n",
"\n",
"model = Model(input_size = window_size, layer_size = 500, output_size = 3)\n",
"agent = Agent(model = model, \n",
" window_size = window_size,\n",
" trend = close,\n",
" skip = skip,\n",
" initial_money = initial_money)\n",
"agent.fit(iterations = 500, checkpoint = 10)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 1: buy 1 unit at price 762.130005, total balance 9237.869995\n",
"day 3: buy 1 unit at price 782.520020, total balance 8455.349975\n",
"day 4, sell 1 unit at price 790.510010, investment 3.723775 %, total balance 9245.859985,\n",
"day 5, sell 1 unit at price 785.309998, investment 0.356538 %, total balance 10031.169983,\n",
"day 6: buy 1 unit at price 762.559998, total balance 9268.609985\n",
"day 10: buy 1 unit at price 764.479980, total balance 8504.130005\n",
"day 11: buy 1 unit at price 771.229980, total balance 7732.900025\n",
"day 12: buy 1 unit at price 760.539978, total balance 6972.360047\n",
"day 17: buy 1 unit at price 768.239990, total balance 6204.120057\n",
"day 18: buy 1 unit at price 770.840027, total balance 5433.280030\n",
"day 19: buy 1 unit at price 758.039978, total balance 4675.240052\n",
"day 20: buy 1 unit at price 747.919983, total balance 3927.320069\n",
"day 21: buy 1 unit at price 750.500000, total balance 3176.820069\n",
"day 24, sell 1 unit at price 771.190002, investment 1.131715 %, total balance 3948.010071,\n",
"day 25: buy 1 unit at price 776.419983, total balance 3171.590088\n",
"day 26, sell 1 unit at price 789.289978, investment 3.245343 %, total balance 3960.880066,\n",
"day 27: buy 1 unit at price 789.270020, total balance 3171.610046\n",
"day 29, sell 1 unit at price 797.070007, investment 3.350496 %, total balance 3968.680053,\n",
"day 30, sell 1 unit at price 797.849976, investment 4.905725 %, total balance 4766.530029,\n",
"day 31, sell 1 unit at price 790.799988, investment 2.936582 %, total balance 5557.330017,\n",
"day 32: buy 1 unit at price 794.200012, total balance 4763.130005\n",
"day 33: buy 1 unit at price 796.419983, total balance 3966.710022\n",
"day 34: buy 1 unit at price 794.559998, total balance 3172.150024\n",
"day 36: buy 1 unit at price 789.909973, total balance 2382.240051\n",
"day 37, sell 1 unit at price 791.549988, investment 2.686674 %, total balance 3173.790039,\n",
"day 40: buy 1 unit at price 771.820007, total balance 2401.970032\n",
"day 41: buy 1 unit at price 786.140015, total balance 1615.830017\n",
"day 42: buy 1 unit at price 786.900024, total balance 828.929993\n",
"day 44: buy 1 unit at price 806.150024, total balance 22.779969\n",
"day 45, sell 1 unit at price 806.650024, investment 6.412597 %, total balance 829.429993,\n",
"day 48, sell 1 unit at price 806.359985, investment 7.813670 %, total balance 1635.789978,\n",
"day 49, sell 1 unit at price 807.880005, investment 7.645570 %, total balance 2443.669983,\n",
"day 50, sell 1 unit at price 804.609985, investment 3.630767 %, total balance 3248.279968,\n",
"day 51: buy 1 unit at price 806.070007, total balance 2442.209961\n",
"day 52: buy 1 unit at price 802.174988, total balance 1640.034973\n",
"day 53: buy 1 unit at price 805.020020, total balance 835.014953\n",
"day 56, sell 1 unit at price 835.669983, investment 5.878845 %, total balance 1670.684936,\n",
"day 57, sell 1 unit at price 832.150024, investment 4.778395 %, total balance 2502.834960,\n",
"day 59: buy 1 unit at price 802.320007, total balance 1700.514953\n",
"day 61: buy 1 unit at price 795.695007, total balance 904.819946\n",
"day 62: buy 1 unit at price 798.530029, total balance 106.289917\n",
"day 69, sell 1 unit at price 819.239990, investment 2.865323 %, total balance 925.529907,\n",
"day 70, sell 1 unit at price 820.450012, investment 3.258409 %, total balance 1745.979919,\n",
"day 71: buy 1 unit at price 818.979980, total balance 926.999939\n",
"day 72: buy 1 unit at price 824.159973, total balance 102.839966\n",
"day 74, sell 1 unit at price 831.659973, investment 5.285412 %, total balance 934.499939,\n",
"day 76, sell 1 unit at price 831.330017, investment 7.710348 %, total balance 1765.829956,\n",
"day 77, sell 1 unit at price 828.640015, investment 5.406162 %, total balance 2594.469971,\n",
"day 78, sell 1 unit at price 829.280029, investment 5.385691 %, total balance 3423.750000,\n",
"day 79: buy 1 unit at price 823.210022, total balance 2600.539978\n",
"day 80: buy 1 unit at price 835.239990, total balance 1765.299988\n",
"day 81: buy 1 unit at price 830.630005, total balance 934.669983\n",
"day 83: buy 1 unit at price 827.780029, total balance 106.889954\n",
"day 85, sell 1 unit at price 835.369995, investment 3.624632 %, total balance 942.259949,\n",
"day 88: buy 1 unit at price 845.539978, total balance 96.719971\n",
"day 89, sell 1 unit at price 845.619995, investment 4.906520 %, total balance 942.339966,\n",
"day 90, sell 1 unit at price 847.200012, investment 5.612868 %, total balance 1789.539978,\n",
"day 92, sell 1 unit at price 852.119995, investment 5.850783 %, total balance 2641.659973,\n",
"day 93, sell 1 unit at price 848.400024, investment 5.743346 %, total balance 3490.059997,\n",
"day 95: buy 1 unit at price 829.590027, total balance 2660.469970\n",
"day 96: buy 1 unit at price 817.580017, total balance 1842.889953\n",
"day 98: buy 1 unit at price 819.510010, total balance 1023.379943\n",
"day 99: buy 1 unit at price 820.919983, total balance 202.459960\n",
"day 105, sell 1 unit at price 831.409973, investment 4.488525 %, total balance 1033.869933,\n",
"day 107: buy 1 unit at price 824.669983, total balance 209.199950\n",
"day 113, sell 1 unit at price 836.820007, investment 4.795058 %, total balance 1046.019957,\n",
"day 115: buy 1 unit at price 841.650024, total balance 204.369933\n",
"day 116, sell 1 unit at price 843.190002, investment 2.956119 %, total balance 1047.559935,\n",
"day 118: buy 1 unit at price 872.299988, total balance 175.259947\n",
"day 119, sell 1 unit at price 871.729980, investment 5.771939 %, total balance 1046.989927,\n",
"day 120: buy 1 unit at price 874.250000, total balance 172.739927\n",
"day 121, sell 1 unit at price 905.960022, investment 10.052113 %, total balance 1078.699949,\n",
"day 122, sell 1 unit at price 912.570007, investment 9.258419 %, total balance 1991.269956,\n",
"day 123, sell 1 unit at price 916.440002, investment 10.330712 %, total balance 2907.709958,\n",
"day 124, sell 1 unit at price 927.039978, investment 11.991102 %, total balance 3834.749936,\n",
"day 125, sell 1 unit at price 931.659973, investment 10.185207 %, total balance 4766.409909,\n",
"day 126, sell 1 unit at price 927.130005, investment 11.757612 %, total balance 5693.539914,\n",
"day 127, sell 1 unit at price 934.299988, investment 14.276275 %, total balance 6627.839902,\n",
"day 128, sell 1 unit at price 932.169983, investment 13.747236 %, total balance 7560.009885,\n",
"day 129: buy 1 unit at price 928.780029, total balance 6631.229856\n",
"day 130: buy 1 unit at price 930.599976, total balance 5700.629880\n",
"day 132: buy 1 unit at price 937.080017, total balance 4763.549863\n",
"day 133: buy 1 unit at price 943.000000, total balance 3820.549863\n",
"day 136: buy 1 unit at price 934.010010, total balance 2886.539853\n",
"day 137, sell 1 unit at price 941.859985, investment 14.732252 %, total balance 3828.399838,\n",
"day 139, sell 1 unit at price 954.960022, investment 15.799052 %, total balance 4783.359860,\n",
"day 140, sell 1 unit at price 969.539978, investment 15.195146 %, total balance 5752.899838,\n",
"day 141, sell 1 unit at price 971.469971, investment 11.368793 %, total balance 6724.369809,\n",
"day 142, sell 1 unit at price 975.880005, investment 11.624822 %, total balance 7700.249814,\n",
"day 143, sell 1 unit at price 964.859985, investment 3.884661 %, total balance 8665.109799,\n",
"day 144, sell 1 unit at price 966.950012, investment 3.906086 %, total balance 9632.059811,\n",
"day 145, sell 1 unit at price 975.599976, investment 4.110637 %, total balance 10607.659787,\n",
"day 146, sell 1 unit at price 983.679993, investment 4.313891 %, total balance 11591.339780,\n",
"day 147: buy 1 unit at price 976.570007, total balance 10614.769773\n",
"day 148, sell 1 unit at price 980.940002, investment 5.024571 %, total balance 11595.709775,\n",
"day 153, sell 1 unit at price 950.760010, investment -2.642923 %, total balance 12546.469785,\n",
"day 154: buy 1 unit at price 942.309998, total balance 11604.159787\n",
"day 155: buy 1 unit at price 939.780029, total balance 10664.379758\n",
"day 156: buy 1 unit at price 957.369995, total balance 9707.009763\n",
"day 158, sell 1 unit at price 959.450012, investment 1.818936 %, total balance 10666.459775,\n",
"day 160, sell 1 unit at price 965.590027, investment 2.746387 %, total balance 11632.049802,\n",
"day 161, sell 1 unit at price 952.270020, investment -0.532707 %, total balance 12584.319822,\n",
"day 163: buy 1 unit at price 940.489990, total balance 11643.829832\n",
"day 164: buy 1 unit at price 917.789978, total balance 10726.039854\n",
"day 166: buy 1 unit at price 898.700012, total balance 9827.339842\n",
"day 167: buy 1 unit at price 911.710022, total balance 8915.629820\n",
"day 168: buy 1 unit at price 906.690002, total balance 8008.939818\n",
"day 171: buy 1 unit at price 930.090027, total balance 7078.849791\n",
"day 172, sell 1 unit at price 943.830017, investment 0.355137 %, total balance 8022.679808,\n",
"day 174, sell 1 unit at price 955.989990, investment 4.162174 %, total balance 8978.669798,\n",
"day 175: buy 1 unit at price 953.419983, total balance 8025.249815\n",
"day 176, sell 1 unit at price 965.400024, investment 7.421833 %, total balance 8990.649839,\n",
"day 178, sell 1 unit at price 968.150024, investment 6.190565 %, total balance 9958.799863,\n",
"day 179, sell 1 unit at price 972.919983, investment 7.304589 %, total balance 10931.719846,\n",
"day 180, sell 1 unit at price 980.340027, investment 5.402703 %, total balance 11912.059873,\n",
"day 181, sell 1 unit at price 950.700012, investment -0.285286 %, total balance 12862.759885,\n",
"day 183: buy 1 unit at price 934.090027, total balance 11928.669858\n",
"day 185: buy 1 unit at price 930.500000, total balance 10998.169858\n",
"day 186: buy 1 unit at price 930.830017, total balance 10067.339841\n",
"day 187: buy 1 unit at price 930.390015, total balance 9136.949826\n",
"day 188: buy 1 unit at price 923.650024, total balance 8213.299802\n",
"day 192: buy 1 unit at price 922.900024, total balance 7290.399778\n",
"day 194: buy 1 unit at price 914.390015, total balance 6376.009763\n",
"day 195: buy 1 unit at price 922.669983, total balance 5453.339780\n",
"day 197: buy 1 unit at price 926.960022, total balance 4526.379758\n",
"day 202: buy 1 unit at price 927.000000, total balance 3599.379758\n",
"day 203: buy 1 unit at price 921.280029, total balance 2678.099729\n",
"day 204: buy 1 unit at price 915.890015, total balance 1762.209714\n",
"day 205: buy 1 unit at price 913.809998, total balance 848.399716\n",
"day 210, sell 1 unit at price 928.450012, investment -0.603798 %, total balance 1776.849728,\n",
"day 212, sell 1 unit at price 935.950012, investment 0.585708 %, total balance 2712.799740,\n",
"day 214: buy 1 unit at price 929.080017, total balance 1783.719723\n",
"day 215: buy 1 unit at price 932.070007, total balance 851.649716\n",
"day 216, sell 1 unit at price 935.090027, investment 0.457657 %, total balance 1786.739743,\n",
"day 217: buy 1 unit at price 925.109985, total balance 861.629758\n",
"day 222, sell 1 unit at price 932.450012, investment 0.221412 %, total balance 1794.079770,\n",
"day 223: buy 1 unit at price 928.530029, total balance 865.549741\n",
"day 227, sell 1 unit at price 949.500000, investment 2.798676 %, total balance 1815.049741,\n",
"day 228, sell 1 unit at price 959.109985, investment 3.923498 %, total balance 2774.159726,\n",
"day 229: buy 1 unit at price 953.270020, total balance 1820.889706\n",
"day 230, sell 1 unit at price 957.789978, investment 4.746329 %, total balance 2778.679684,\n",
"day 232, sell 1 unit at price 969.960022, investment 5.125347 %, total balance 3748.639706,\n",
"day 233, sell 1 unit at price 978.890015, investment 5.602183 %, total balance 4727.529721,\n",
"day 234, sell 1 unit at price 977.000000, investment 5.393743 %, total balance 5704.529721,\n",
"day 235: buy 1 unit at price 972.599976, total balance 4731.929745\n",
"day 236, sell 1 unit at price 989.250000, investment 7.377775 %, total balance 5721.179745,\n",
"day 237, sell 1 unit at price 987.830017, investment 7.854655 %, total balance 6709.009762,\n",
"day 238, sell 1 unit at price 989.679993, investment 8.302601 %, total balance 7698.689755,\n",
"day 239, sell 1 unit at price 992.000000, investment 6.772289 %, total balance 8690.689755,\n",
"day 241, sell 1 unit at price 992.809998, investment 6.516677 %, total balance 9683.499753,\n",
"day 242, sell 1 unit at price 984.450012, investment 6.414375 %, total balance 10667.949765,\n",
"day 243, sell 1 unit at price 988.200012, investment 6.426285 %, total balance 11656.149777,\n",
"day 244: buy 1 unit at price 968.450012, total balance 10687.699765\n",
"day 248, sell 1 unit at price 1019.270020, investment 6.923537 %, total balance 11706.969785,\n",
"day 249, sell 1 unit at price 1017.109985, investment 4.576394 %, total balance 12724.079770,\n",
"day 250, sell 1 unit at price 1016.640015, investment 4.975993 %, total balance 13740.719785,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = agent.buy()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8VFX6+PHPvTOTBBJqCr2o4ImAdAREEOwKUkTFhmVXs7usi7qWr7quuqvr6u7Pra5l7SsWFLGs2NuqKCqgiECO0msghABJSJuZ+/vj3hlmJjOTSW/P+/XiJdx67uROvM99nnOOYVkWQgghhBBCCCFaL7OpGyCEEEIIIYQQomFJ4CeEEEIIIYQQrZwEfkIIIYQQQgjRykngJ4QQQgghhBCtnAR+QgghhBBCCNHKSeAnhBBCCCGEEK2cBH5CiDZNKfWUUuruBjjuRKWUru/jipZLKXW5UuqzGOv6KqWKlVKuxm6XEEKItsHd1A0QQoh4lFKbgSu11u83xPYNRWv9KaDq+7hKqY+AIUAysAm4XWv9mrPuVuDWkM1dznZZWuu9IcfoCmi7mfqEkOUnA/8C+gJfApdrrbdEaUNfYG3E4lTgBq31/UqpHsAjwGigB3CE1npzyP69gAeBicAh4G6t9cPOuonAW1GOfa7W+mWllAHcBVwBpAHfAL/UWq9x9n8KuAioCNm/k9baF3kdUa7rKWC71vq26ratzfbxaK23Yl9Pk1BKTQYWaK17N9H5P3bO/1iM9RnAa0A29n29Dvt+W+qsfxi4JGQXD1Chte5QzXkvBZ4Grgqc27nH7gWudDZ7DLhZa20lcH8OAe4HRgHpWmsj4nzHYH/HRgH5wI1a61dC1p8P/A7oDWwDbtVav+qsO9lpSzvgWq31C87yzsCHwIla66J41yuEaNsk4yeEEC3LNUAPrXVHIAdY4ARaaK3v0VqnBf4A9wEfhwZ9jvuwH5yDnAfrxcBvga7AcmBhtAZorbdGnOdYwA+87GziB94GZse4hgXYQWs3YCpwj1JqinPsTyOOPQ0odo4HcB7wE+ygsSvwBfBMxPH/FHqMRII+0ewVY//cM4Eu2Pfwf5VSbgCt9c8j7pvngZfiHVAp1QX7RcmaiFU5wExgGDAUOBv4mXOe6u7PSuBF4KdRzufGDl7fwL53A9/fo531vbC/G78GOgI3As8ppbKcQ/zNacvpwIMh2eE/AvdK0CeEqI5k/IQQzZZS6hns7NN/lVI+4Pda6z8ppaZjP+z0Ar4FfqG1Xhdn+5ewA4V2wCpn+8iHvWjndwF/Ai4DirDf5P8T8GitvUqpK4CbsN/O5wP3aa0fcfadTEgGxclEPgBcCvTDflC8TGtd5gRdTwEnYAdNa7Df3vsj26S1/i7knxZ2ZqMPsCui7YZzrt9FLD8eO2P4b8IfTs8B1mitX3K2uxPYq5TK1lrnVvNRXQp8Esjqaa13Yz+YVvl/jFIqDZgMnK+1rgRWKaUWYT/UfxTl2JcBi7TWJc6/jwA+01pvdI63ALiumvZVSymVA1wMWEqpa4GPtNZnOxmah4DhwA7gFq3163G2vxm4CsjCztj8JjSjE+f8/bGD4cC99THwKXASdvDxBXCR1nqvUuotYInW+oGQ/VcBv9NaL1ZKZWPfp4Gs0m+11i86250F/D/se+Yg8Ffn+t4CkpVSxc4hj8YOTAYD5cAMYDN2MD8b+zMvB36qtX7XOXYn4C/AWdj38ZPAHVprn1LqcuwM2jLs+24/ME9r/ZZS6g/Y389xSqm/AU9pra8O/Xy01mXYWWqUUibgww4AuwJ7Ij7LVKeN06r52P8I/AM4P2L5ZcD9WuvtzvHux/6ZPhzlGGH3p9ZaA1opNSDKttlAT+CvWmsL+FAptRSYi/3CpTewX2sdyCguUUqVAEc515iqtf7eaVMFkO7cN0dorX9RzbUKIYRk/IQQzZfWei6wFTjbecP+J+ft+PPAtdhv/9/EDvSSom3vHOotYCD2w/hK4NkEm3AVcCb2Q/9I7CxAqD3YD5cdsUsP/6qUGhnneOcDZ2AHL0OBy53l1wPbnevphp2FsGIdRCn1hlKqDLsc82Ps7FykidjX+3LIfi7s4PPqKMcfjB0UA+A8yG5wlscUEmA+HW+7EEbEfwN/HxLl2KnAuRHHfgE4Sil1tFLKg/3g/XbErvOUUvuUUiuUUrGyjmG01v/Gvi8C2cKzneP/F3gX+7P8FfCsUkpF29451Absz74TdtAdzMjWwkXY91UWkATc4Cx/HrgwsJFSahD2y4Qlzmf2HvCcs98F2EH4IGfzx4GfOSWQQ4APnZ/1mcDOkGzWTmf7s7Ezql2wy2rfwX526AX8HrukN+ApwAsMAEYAp3G4XBJgLHbwloH9QuVxpZShtf4NdpB7tXPusKAvlFLqO6AMeB14TGu9J8pms7ED3k/iHOc47FLkaMFc2HfB+XuV70GM+7OmQu/95cA6pdR0pZRLKTUTO7gOvOzZo5QappQahh1YFwJ/B+bX4fxCiDZEAj8hREszBzvb8Z6TMfp/2Jm842PtoLV+QmtdpLUuB+4EhjnZieqcD/xda71da12I3e8n9LhLtNYbtNaW1vp/2AHCxDjH+4fWeqfWeh92QDHcWV6J3Reun9a60iknixn4aa2nAR2wMyvvRssMcjgTURyybD7wpdZ6RZTt04ADEcsOOOeJ5wTsYHVRNdsF2l4ELAV+q5RKcQLl2UD7KJufA+wF/heybBfwGXYAUYpd+hma8fsHh4P83wJPKaUmJNK2KMZhfy73aq0rtNYfYpfpXRhrB631S87P2K+1Xgj8CBxXy/M/qbX+QWtdil0+GLhfXgGGK6X6Of++GFjs3N/TgM1a6ye11l6t9TfYwf95zraVwCClVEetdaHWemU1bfhUa/2O1tqLXTqZif15VGIH4f2VUp2VUt2w78drtdYlTkD2V+zAM2CL1vpRp/T2aex7vltNPhCt9VDsFy0XYd8H0VwG/CfWd8h5AfIgdqAZ7bsT+V04AKQ5LzlCRbs/4zYf+2XRjUopj1LqNOBEnHvf+Vz+gx20lzv//VlItvvn2IHev7GzhL8A3gdSlFLvKKU+UkqdmGBbhBBtkJR6CiFamp5AcMARrbVfKbUNOwNRhfOQ9wfsB99M7DflYGcdIgOdaOfaFvLv0L+jlDoTuAO7LM7EfoBbHed4eSF/P+QcH+DP2AHpu0opgH9rre8lDufB+y2l1DVKqfVa69dD2tUe+3pnhCzriR34jYpxyGLsB+pQHbFLXOO5DHg5IsCszsXYA1xsAzZi92uKllmM9gB/OzAGu1QxD3tAjw+VUoO11ociApk3lVLPYj+gL61B+wJ6AtsigoMtxLjXIDhYyK+B/s6iNOx7rTYi75c0sINnpdQS7KDqPuxA9Cpnu37AWKXU/pB93RzuBzkbuA2418me3ay1/iJOG3aH/L0U2KsP95ksdf6bhv1ZeYBdzj0M9nci9DsTvB6t9SFnuxoPaOOUfT6vlFqnlPpWax3Mzil74KHJHP48opkHfKe1XhZjfeR3oSNQHCWQjBtgRml3pZPF+yfwf9gZvhexgzyUUqdgZ0InY1cmjAJeV0qdqbX+Vmv9rbMOJ4t8PzAeO/C8FtgJfKKU6pdom4QQbYsEfkKI5i7yAWYn9mAiQLDUsA92/6to21+EHQCdgt1HqRN2iVTk2/todmH3uwnoE3LeZOxMyqXAa85D3asJHjeMkwW7Hrhe2aMCfqiU+lpr/UECu7ux+wCFmgXswy4DDTgOO8Oy1nngbge0U0rlYQcya7AfZAPXl+ocN2ZfSKVUO+wAc1YC7QzS9kihwf5XSqnngK8ijt0H+yH3ZxG7DwcWBvpfYWf0/gYMInrJq0XiP5No91ofpZQZEvz1BX6Itr2TgXsUOBn4wunb9m0Nzl8TzwN3KKU+AVI43D9yG/A/rfWp0XbSWn8NzHDKWK/GDjz6RF5LLWzDDmAynOxgTdXm/B7gSMLLMucCSwN9QGM4GTjR6e8Idj/BEUqp4U6Z6RrsgV0C9+QwIr4Hce7PuLTdRzeYlVNKfc7hUtHh2H1lA/fx10qpL7F/d30bcai/ArdprUuVUscCy7XWFc7PNZOIfo9CCAES+Akhmr/d2A93AS8CNyt7aPNPsEe5LAc+j7F9B2d9AXZG7p4anPtF4Bonu1KC/ZY+IAl7qoR8wOtk/04Dvq/B8QFQSk0DcrH7hx3AHriiSgmaM2jHEdgBnRe77HUS9gAzoaJlIt7icBYKZ9+LgBlOgPIK8GenT9wS7Mzadzr+wC6zsIPoKoOyKKVSsIfdB3vQkBQnUxMY0n479s/lfOzP7ZiIQ8wFPtdab4hY/jVwnlLqBezP/mLsAGC9c+xzsfv8HcJ+YL4Eu59aoF0WMEVr/XGU64m8d750jnOTM8DHBOdYY2Jsn4odwOQ757qCKH0X68mbwBPY/ewWhgSmb2Bn8+Zil2KCHVAUY99f5wFvaK0PKKUOcvg+2409WEgnrXV1mfAqtNa7lFLvAvcrpX7rnO8IoLdTBl2dyM8yjFJqHPYzy1fY99V87DLRLyM2vRQ7CxrP5djBcsBi7FLlx51//wf4tVLqTeyf5/XYWbpQUe9P50VUMvbvh8D3wHLKcFFKDcV+cWBiZx57YPeNBPvevtkJQL9VSo3ALh1/MOIcpwIpWus3nEWbgJOcyodk7N91QghRhfTxE0I0d38EblNK7VdK3aC11tgP8//E7l9zNvZgLhXRtsd+iNuCnRFciz2qYKIexe639x32wBZvYgdcPidLNx87OCzEDqJej3Gc6gzE7qtTjD1644Na62gjXBrYJaF7sIOLa4A5oeWNyh4S/iTs6w7SWpdrrfMCf7ADzErn72it87HLAP/gXM9YQvpnKaUeVvZcaaEuA56JUVZW6lwP2EFtaci607FLPAux+y2d4Zw/VKwBY+7DzvB8iz0y5HXAbK11oLTxGuyf9X7sEtqrAkGek6UpInY57uPY/d/2K6Vede6ps7EHPtmL/QB+aUgwHLn9Wuzyuy+wA5ljqV2JabWcQGIxdnD7XMjyIuxA+gLsjGUe9meW7GwyF9jsBH0/xw6cca7peWCjcz2BMuSauBQ74FmL/bNdhB3YJOLvwLlKqUKl1D+irE/GLg8uwP75ngVM1YcHoUEpNR47Q19lGgel1FvKnucSrfX+iO9CBXAwJOB9BLsP7mrsFzlLCB/EJnCt0e7Pftj3eiBDWIozGqljLnYlwR7szOOpgaDQCZDvBBYppYqwKwru0c6oqc51JGPf19eEHPNX2IPUvI89UqpMXyKEiMqwLCkDF0KIRDhZvYe11v2q3Vg0O0qpS4DBWutbmrotQgghRGOTwE8IIWJw+rBNwc76dcN+A79Ma31tkzZMCCGEEKKGpNRTCCFiM7DnYivELvVch933TQghhBCiRZGMnxBCCCGEEEK0cpLxE0IIIYQQQohWriVO55CMPZT2Luwhz4UQQgghhBCiLXFhj5z8Nfb0SNVqiYHfGODTpm6EEEIIIYQQQjSxicBniWzYEgO/XQCFhSX4/c2rf2J6ehoFBcXVbyhEDcm9JRqS3F+ioci9JRqS3F+iITX3+8s0Dbp0SQUnNkpESwz8fAB+v9XsAj+gWbZJtA5yb4mGJPeXaChyb4mGJPeXaEgt5P5KuOubDO4ihBBCCCGEEK2cBH5CCCGEEEII0cq1xFLPqHw+L4WF+Xi9FU3Whj17TPx+f5OdvyUzTRft2qWRltYJwzCaujlCCCGEEEK0Kq0m8CsszCclpT2pqd2bLHBwu028Xgn8asqyLHw+L0VF+ykszKdr16ymbpIQQgghhBCtSqsp9fR6K0hN7SjZohbIMAzcbg+dO6dTUVHW1M0RQgghhBCi1Wk1gR8gQV8LZxgm0CJGTxJCCCGEEKJFaVWBX22VFJfz6rPfcqi46foHCiGEEEIIIURDkcAPWLF0C7u2HWD50i31dswTThjNoUOH6u14jz32MB988G69HS+W3Ny1/O53tzXY8d9887/cdttNDXZ8IYQQQggh6ouvtBSrlQze2OYDv5LicnJX7wYgd3Ves836XXnlzzn55NMa/DzZ2YO44467G/w8QgghhBBCNGelP/7Ahmt+SeHbbzZ1U+pFqxnVs7ZWLN2CZdn9yizLYvnSLUw6fWC9HPv555/h00//R3l5GT/72S+ZPPlkdu3ayZVXzmXJkg8Awv59//330aNHDy666FIAfvghlzvuuJXnnnuZe+75HdnZxzB79hwef/wRtm7dQklJMTt37qBXr97cddd9pKSkUFxczB//+Ds2bdpIZmYWGRmZdOnSlauvvjasbWVlZdx99x1s3rwRl8tN3779uOuue1m5cjn/+tffefzxZwB4+eWFvPTSC6SldWD8+AksXvwiS5Z8EGz39OnnsGzZUsrKyrj55tsZNmw4Xq+Xm266lgMHDlBeXs6gQYO58cZb8Xg89fK5CiGEEEIIUVNz5sxE69xqt1Mqmw8//IB9774Nfj8YrSNX1jquopYC2T6/zw78/D6rXrN+pmny1FPPcd99f+FPf7qHwsJ9cbefPft8XnttcTAQffnlF5k167yog9ZovY477vgDzz67CK/Xy7vvvgXAk08+SocOHXnuuZe56657+e67b6Oe68svv+DQoRIWLHiJp59+nhtvvLXKNuvX/8gzzzzFQw89wWOP/YeioqKw9QcOHGDIkKE8+eRzXHHFVTz88D8AcLlc3HHH3Tz++DM888xCfD4fS5a8Vv0HJoQQQgghRAMZOnR4tYkIj8fDsGEjKC/YR8mqb8HlouPxxzdSCxtWmw78QrN9AYGsX32YNm0GAH379ufooxVr1qyOu33//kfQs2cvli37nIMHD7J06SecddbZUbc97rhxdOjQAcMwGDRoCDt2bAfgm2+WB/fp2LETEyeeGHX/AQMGsnnzJu6//z4+/PB9kpKSqmzzzTcrGD9+Al26dAFg6tTpYevbtWvPhAkTARg8+Fh27NgBgN/v5/nnF3D55Rdx2WUXsHLlcn788Ye41y6EEEIIIURDysmZh2nGD38qKyt58cXnOXLosZz/1eec/+VSRp84juHDs5kzZ2YjtbRhtNnALzLbF1DfWb9ILpcLv//wOSsqws9z7rkX8Mori1iy5HUmTZpCWlpa1OMkJSUH/26aJj6fr0bt6NWrNwsWvMiYMWNZvvxLLr/8QsrLy2t0jKSkw29M7DZ4AXjvvbf57rtvefDBR/nPfxYya9a5Va5TCCGEEEKIxpSZmcX06bNq1f0okAlsydps4Bct2xdQX1m/JUteB2Dbtq38+KNm8OBj6do1Ha/Xy/bt2wA7SAo1fvwEtm7dwsKFz3LOOefX+JwjRozi7beXAFBUVMSnn34Sdbs9e3Zjmi4mTZrM/PnXs39/IUVFB8O2GT58JMuWfc7+/fsBePvtNxJqQ3FxEZ06daZ9+1SKi4urXKMQQgghhBBNIZGsXzSmaZKTM68BWtR42uTgLrGyfQGBrN/oCf1on1a1BDJRPp+PK664iLKyMm688Va6dOkKwDXXXM911/2Szp07M378CWH7mKbJmWdOZdmyzxkwoOaDzFx++VXcc8/vuOii2aSnZ5CdfUzUrOGGDet5+OEHAPD7fVxyyeVkZGSydevhgHfgwKO56KJL+fnPr6B9+1RGjx5Damr0DGSoM86YxqeffsJFF82mS5eudp10DbOJQgghhBBC1LdA1u+VxS/hTbBizuPxMGPGOWRkZDZw6xqWESvr1Yz1BzYVFBSHlUzm5W2he/d+CR3gk3d+YN13eTEDPwDTZXDM0B41GuHT7Tbxeus+z8e1185j+vRzOOmkU2q8r9frxefzkZycTElJMfPmXcnVV1/HmDFja9WWQ4dKaN8+FYDHH3+EHTu2c/vtd9XqWImoyc+xLcnM7EB+flH1GwpRC3J/iYYi95ZoSHJ/idrKz9/D1DNPosLrTWj75ORklix5v1kFfqZpkJ6eBnAEsDmRfdpkxi9vx8G4QR/YWb+8HQcaqUW23Ny13H77LRx9tGLy5JNqdYyiooNcf/18/H4/FRXlnHrqGbUO+gAeeugBVq9ehddbSc+evbjppt/U+lhCCCGEEEI0tczMLE49ZjDvfP8d3mqSYK0l2wdtNOPXUOor49eWNYefY3MkbzVFQ5L7SzQUubdEQ5L7S9TF6nvv5icLn6WymlioOWb7oHYZvzY7uIsQQgghhBCibepkwZSMTAzD4KijBgRH+jQMIzj4S2vK9oEEfkIIIYQQQog2xldcxOwevRk++FjuuefPYcGe2233hmsNI3mGksBPCCGEEEII0ab4iovpkpTEow89hlLHMH36LAzDYObM2cyYcQ6GYbSqbB+00cFd5syZida51W6nVDYLF77aCC0SQgghhBBCNAbL78d/6BAYBi5n9PqcnHls2LCenJx5WJbFtm2bW1W2D9po4Dd06HA2btxAZWVlzG08Hg/Dho1oxFYJIYQQQgghGpq/pAQsC7N9KobLBdgjfT7xxILgNi+//HKrGzyoTZZ65uTMC9bxxtLYNb1vvvlfbrvtJgBWrlzOT386F4C9e/P51a9+1ihtuPfeu1i16psGO/65557Nxo3rG+z4QgghhBBCVMdXbAd0rg5pTdySxtUmA7/MzCymT58VHL0nUnMawScjI5N//vORRjnXzTf/VrKcQgghhBCiVfMVlwDgSm1bgV+bLPUEO+v3+uuvRF1X12xfWVkZd999B5s3b8TlctO3bz/uuuteAN566w0WL34Jn89HWloaN9xwM3379o95rF27dnLllXNZsuQDAE44YTQ5OfP45JOPOXDgAL/85XwmTz4ZgI8//oB///tBkpOTmTLlFP797wd5991PaN++fdgxP/30Yx599CFM04XP5+W6625i5MjRXH11DhdeOJcJEyaSn7+Hu+++g4KCAnr16oVlwdix45g9ew5/+MOdJCUlsW3bVvbs2c3gwcdy222/wzAM3n33bV566Xm8XruM9pe/vJbRo4+r9WcphBBCCCFEfQpm/NIk8GsTAlm/V199OayvX31k+7788gsOHSphwYKXADh48CAAq1Z9w4cfvse//vUoSUlJfPHFUv74x9/z0ENP1Oj4qampPPbYf/juu2+5/fZbmDz5ZPbtK+BPf7qHRx55kj59+rJw4bMx93/ssUe46abfMGTIUHw+H2VlpVW2+dvf/syIEaO4/PIrycvbxaWXXsDYseOC6zdu3MDf/vYgpmlyxRUXs3z5l4wZM46xY8dx6qmnYxgGW7du5ppr5vHKK2/W6PqEEEIIIYRoKL6SYkACvyqUUv8PmA30B47VWn/vLD8aeBpIBwqAS7XWP9ZlXWOLlvWrj759AwYMZPPmTdx//32MGDGK448/AYClSz9h/fofycm5HADLsigqOljj45988ukADB58LHv35lNeXs7atd9z9NGKPn36AjB16gz++c+/Rt1/1KjR/OMff2Hy5JMYN+54jjxyQJVtVq5cwbXX3ghA9+49GDVqTNj6iRMnk5ycDIBSih07tjNmDOzYsZ077/wN+fn5uN1u9u0roKBgL+npGTW+TiGEEEIIIeqbr8gJ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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize = (15,5))\n",
"plt.plot(close, color='r', lw=2.)\n",
"plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
"plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n",
"plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"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
}