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

634 lines
77 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"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": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"close = df.Close.values.tolist()\n",
"initial_money = 10000\n",
"window_size = 30\n",
"skip = 1"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"class neuralnetwork:\n",
" def __init__(self, id_, hidden_size = 128):\n",
" self.W1 = np.random.randn(window_size, hidden_size) / np.sqrt(window_size)\n",
" self.W2 = np.random.randn(hidden_size, 3) / np.sqrt(hidden_size)\n",
" self.fitness = 0\n",
" self.id = id_\n",
"\n",
"def relu(X):\n",
" return np.maximum(X, 0)\n",
" \n",
"def softmax(X):\n",
" e_x = np.exp(X - np.max(X, axis=-1, keepdims=True))\n",
" return e_x / np.sum(e_x, axis=-1, keepdims=True)\n",
"\n",
"def feed_forward(X, nets):\n",
" a1 = np.dot(X, nets.W1)\n",
" z1 = relu(a1)\n",
" a2 = np.dot(z1, nets.W2)\n",
" return softmax(a2)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"class NeuroEvolution:\n",
" def __init__(self, population_size, mutation_rate, model_generator,\n",
" state_size, window_size, trend, skip, initial_money):\n",
" self.population_size = population_size\n",
" self.mutation_rate = mutation_rate\n",
" self.model_generator = model_generator\n",
" self.state_size = state_size\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",
" \n",
" def _initialize_population(self):\n",
" self.population = []\n",
" for i in range(self.population_size):\n",
" self.population.append(self.model_generator(i))\n",
" \n",
" def mutate(self, individual, scale=1.0):\n",
" mutation_mask = np.random.binomial(1, p=self.mutation_rate, size=individual.W1.shape)\n",
" individual.W1 += np.random.normal(loc=0, scale=scale, size=individual.W1.shape) * mutation_mask\n",
" mutation_mask = np.random.binomial(1, p=self.mutation_rate, size=individual.W2.shape)\n",
" individual.W2 += np.random.normal(loc=0, scale=scale, size=individual.W2.shape) * mutation_mask\n",
" return individual\n",
" \n",
" def inherit_weights(self, parent, child):\n",
" child.W1 = parent.W1.copy()\n",
" child.W2 = parent.W2.copy()\n",
" return child\n",
" \n",
" def crossover(self, parent1, parent2):\n",
" child1 = self.model_generator((parent1.id+1)*10)\n",
" child1 = self.inherit_weights(parent1, child1)\n",
" child2 = self.model_generator((parent2.id+1)*10)\n",
" child2 = self.inherit_weights(parent2, child2)\n",
" # first W\n",
" n_neurons = child1.W1.shape[1]\n",
" cutoff = np.random.randint(0, n_neurons)\n",
" child1.W1[:, cutoff:] = parent2.W1[:, cutoff:].copy()\n",
" child2.W1[:, cutoff:] = parent1.W1[:, cutoff:].copy()\n",
" # second W\n",
" n_neurons = child1.W2.shape[1]\n",
" cutoff = np.random.randint(0, n_neurons)\n",
" child1.W2[:, cutoff:] = parent2.W2[:, cutoff:].copy()\n",
" child2.W2[:, cutoff:] = parent1.W2[:, cutoff:].copy()\n",
" return child1, child2\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 act(self, p, state):\n",
" logits = feed_forward(state, p)\n",
" return np.argmax(logits, 1)[0]\n",
" \n",
" def buy(self, individual):\n",
" initial_money = self.initial_money\n",
" starting_money = initial_money\n",
" state = self.get_state(0)\n",
" inventory = []\n",
" states_sell = []\n",
" states_buy = []\n",
" \n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(individual, 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",
" 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 = ((self.trend[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, self.trend[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\n",
" \n",
" def calculate_fitness(self):\n",
" for i in range(self.population_size):\n",
" initial_money = self.initial_money\n",
" starting_money = initial_money\n",
" state = self.get_state(0)\n",
" inventory = []\n",
" \n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(self.population[i], 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 -= self.trend[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",
" invest = ((starting_money - initial_money) / initial_money) * 100\n",
" self.population[i].fitness = invest\n",
" \n",
" def evolve(self, generations=20, checkpoint= 5):\n",
" self._initialize_population()\n",
" n_winners = int(self.population_size * 0.4)\n",
" n_parents = self.population_size - n_winners\n",
" for epoch in range(generations):\n",
" self.calculate_fitness()\n",
" fitnesses = [i.fitness for i in self.population]\n",
" sort_fitness = np.argsort(fitnesses)[::-1]\n",
" self.population = [self.population[i] for i in sort_fitness]\n",
" fittest_individual = self.population[0]\n",
" if (epoch+1) % checkpoint == 0:\n",
" print('epoch %d, fittest individual %d with accuracy %f'%(epoch+1, sort_fitness[0], \n",
" fittest_individual.fitness))\n",
" next_population = [self.population[i] for i in range(n_winners)]\n",
" total_fitness = np.sum([np.abs(i.fitness) for i in self.population])\n",
" parent_probabilities = [np.abs(i.fitness / total_fitness) for i in self.population]\n",
" parents = np.random.choice(self.population, size=n_parents, p=parent_probabilities, replace=False)\n",
" for i in np.arange(0, len(parents), 2):\n",
" child1, child2 = self.crossover(parents[i], parents[i+1])\n",
" next_population += [self.mutate(child1), self.mutate(child2)]\n",
" self.population = next_population\n",
" return fittest_individual"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"population_size = 100\n",
"generations = 100\n",
"mutation_rate = 0.1\n",
"neural_evolve = NeuroEvolution(population_size, mutation_rate, neuralnetwork,\n",
" window_size, window_size, close, skip, initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch 5, fittest individual 0 with accuracy 10.849749\n",
"epoch 10, fittest individual 0 with accuracy 11.095000\n",
"epoch 15, fittest individual 0 with accuracy 11.095000\n",
"epoch 20, fittest individual 93 with accuracy 13.756802\n",
"epoch 25, fittest individual 95 with accuracy 23.728605\n",
"epoch 30, fittest individual 0 with accuracy 23.728605\n",
"epoch 35, fittest individual 0 with accuracy 23.728605\n",
"epoch 40, fittest individual 0 with accuracy 23.728605\n",
"epoch 45, fittest individual 0 with accuracy 23.728605\n",
"epoch 50, fittest individual 0 with accuracy 23.728605\n"
]
}
],
"source": [
"fittest_nets = neural_evolve.evolve(50)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 1: buy 1 unit at price 762.130005, total balance 9237.869995\n",
"day 2: buy 1 unit at price 762.020020, total balance 8475.849975\n",
"day 3, sell 1 unit at price 782.520020, investment 2.675399 %, total balance 9258.369995,\n",
"day 5, sell 1 unit at price 785.309998, investment 3.056347 %, total balance 10043.679993,\n",
"day 6: buy 1 unit at price 762.559998, total balance 9281.119995\n",
"day 7: buy 1 unit at price 754.020020, total balance 8527.099975\n",
"day 8: buy 1 unit at price 736.080017, total balance 7791.019958\n",
"day 9: buy 1 unit at price 758.489990, total balance 7032.529968\n",
"day 10, sell 1 unit at price 764.479980, investment 0.251781 %, total balance 7797.009948,\n",
"day 12: buy 1 unit at price 760.539978, total balance 7036.469970\n",
"day 14: buy 1 unit at price 768.270020, total balance 6268.199950\n",
"day 15: buy 1 unit at price 760.989990, total balance 5507.209960\n",
"day 16: buy 1 unit at price 761.679993, total balance 4745.529967\n",
"day 17, sell 1 unit at price 768.239990, investment 1.885888 %, total balance 5513.769957,\n",
"day 18, sell 1 unit at price 770.840027, investment 4.722314 %, total balance 6284.609984,\n",
"day 20: buy 1 unit at price 747.919983, total balance 5536.690001\n",
"day 21: buy 1 unit at price 750.500000, total balance 4786.190001\n",
"day 22: buy 1 unit at price 762.520020, total balance 4023.669981\n",
"day 24, sell 1 unit at price 771.190002, investment 1.674381 %, total balance 4794.859983,\n",
"day 25, sell 1 unit at price 776.419983, investment 2.087991 %, total balance 5571.279966,\n",
"day 26, sell 1 unit at price 789.289978, investment 2.736012 %, total balance 6360.569944,\n",
"day 27: buy 1 unit at price 789.270020, total balance 5571.299924\n",
"day 28: buy 1 unit at price 796.099976, total balance 4775.199948\n",
"day 29: buy 1 unit at price 797.070007, total balance 3978.129941\n",
"day 31: buy 1 unit at price 790.799988, total balance 3187.329953\n",
"day 32, sell 1 unit at price 794.200012, investment 4.364055 %, total balance 3981.529965,\n",
"day 33: buy 1 unit at price 796.419983, total balance 3185.109982\n",
"day 34, sell 1 unit at price 794.559998, investment 4.316774 %, total balance 3979.669980,\n",
"day 35, sell 1 unit at price 791.260010, investment 5.794741 %, total balance 4770.929990,\n",
"day 37: buy 1 unit at price 791.549988, total balance 3979.380002\n",
"day 38, sell 1 unit at price 785.049988, investment 4.603596 %, total balance 4764.429990,\n",
"day 39: buy 1 unit at price 782.789978, total balance 3981.640012\n",
"day 40: buy 1 unit at price 771.820007, total balance 3209.820005\n",
"day 41: buy 1 unit at price 786.140015, total balance 2423.679990\n",
"day 42, sell 1 unit at price 786.900024, investment 3.197294 %, total balance 3210.580014,\n",
"day 43: buy 1 unit at price 794.020020, total balance 2416.559994\n",
"day 44: buy 1 unit at price 806.150024, total balance 1610.409970\n",
"day 46, sell 1 unit at price 804.789978, investment 1.966369 %, total balance 2415.199948,\n",
"day 47, sell 1 unit at price 807.909973, investment 1.483482 %, total balance 3223.109921,\n",
"day 48: buy 1 unit at price 806.359985, total balance 2416.749936\n",
"day 49, sell 1 unit at price 807.880005, investment 1.356217 %, total balance 3224.629941,\n",
"day 50, sell 1 unit at price 804.609985, investment 1.746332 %, total balance 4029.239926,\n",
"day 51, sell 1 unit at price 806.070007, investment 1.211675 %, total balance 4835.309933,\n",
"day 52: buy 1 unit at price 802.174988, total balance 4033.134945\n",
"day 53: buy 1 unit at price 805.020020, total balance 3228.114925\n",
"day 54, sell 1 unit at price 819.309998, investment 3.507044 %, total balance 4047.424923,\n",
"day 55, sell 1 unit at price 823.869995, investment 5.247898 %, total balance 4871.294918,\n",
"day 56, sell 1 unit at price 835.669983, investment 8.272651 %, total balance 5706.964901,\n",
"day 57, sell 1 unit at price 832.150024, investment 5.852648 %, total balance 6539.114925,\n",
"day 58: buy 1 unit at price 823.309998, total balance 5715.804927\n",
"day 59: buy 1 unit at price 802.320007, total balance 4913.484920\n",
"day 60: buy 1 unit at price 796.789978, total balance 4116.694942\n",
"day 61: buy 1 unit at price 795.695007, total balance 3320.999935\n",
"day 63: buy 1 unit at price 801.489990, total balance 2519.509945\n",
"day 65: buy 1 unit at price 806.969971, total balance 1712.539974\n",
"day 66, sell 1 unit at price 808.380005, investment 1.808517 %, total balance 2520.919979,\n",
"day 67: buy 1 unit at price 809.559998, total balance 1711.359981\n",
"day 68, sell 1 unit at price 813.669983, investment 0.932824 %, total balance 2525.029964,\n",
"day 69, sell 1 unit at price 819.239990, investment 1.597302 %, total balance 3344.269954,\n",
"day 70, sell 1 unit at price 820.450012, investment 2.278184 %, total balance 4164.719966,\n",
"day 71: buy 1 unit at price 818.979980, total balance 3345.739986\n",
"day 72: buy 1 unit at price 824.159973, total balance 2521.580013\n",
"day 73: buy 1 unit at price 828.070007, total balance 1693.510006\n",
"day 75, sell 1 unit at price 830.760010, investment 3.197435 %, total balance 2524.270016,\n",
"day 76, sell 1 unit at price 831.330017, investment 0.974119 %, total balance 3355.600033,\n",
"day 77, sell 1 unit at price 828.640015, investment 3.280488 %, total balance 4184.240048,\n",
"day 78, sell 1 unit at price 829.280029, investment 4.077618 %, total balance 5013.520077,\n",
"day 79, sell 1 unit at price 823.210022, investment 3.457985 %, total balance 5836.730099,\n",
"day 80: buy 1 unit at price 835.239990, total balance 5001.490109\n",
"day 81, sell 1 unit at price 830.630005, investment 3.635730 %, total balance 5832.120114,\n",
"day 83: buy 1 unit at price 827.780029, total balance 5004.340085\n",
"day 84: buy 1 unit at price 831.909973, total balance 4172.430112\n",
"day 85: buy 1 unit at price 835.369995, total balance 3337.060117\n",
"day 86, sell 1 unit at price 838.679993, investment 3.929517 %, total balance 4175.740110,\n",
"day 87, sell 1 unit at price 843.250000, investment 4.161520 %, total balance 5018.990110,\n",
"day 88, sell 1 unit at price 845.539978, investment 3.243058 %, total balance 5864.530088,\n",
"day 89: buy 1 unit at price 845.619995, total balance 5018.910093\n",
"day 90, sell 1 unit at price 847.200012, investment 2.795578 %, total balance 5866.110105,\n",
"day 91: buy 1 unit at price 848.780029, total balance 5017.330076\n",
"day 92: buy 1 unit at price 852.119995, total balance 4165.210081\n",
"day 93, sell 1 unit at price 848.400024, investment 2.455108 %, total balance 5013.610105,\n",
"day 95: buy 1 unit at price 829.590027, total balance 4184.020078\n",
"day 97: buy 1 unit at price 814.429993, total balance 3369.590085\n",
"day 98, sell 1 unit at price 819.510010, investment -1.883289 %, total balance 4189.100095,\n",
"day 100: buy 1 unit at price 831.409973, total balance 3357.690122\n",
"day 101, sell 1 unit at price 831.500000, investment 0.449391 %, total balance 4189.190122,\n",
"day 102: buy 1 unit at price 829.559998, total balance 3359.630124\n",
"day 103: buy 1 unit at price 838.549988, total balance 2521.080136\n",
"day 104: buy 1 unit at price 834.570007, total balance 1686.510129\n",
"day 105, sell 1 unit at price 831.409973, investment -0.060103 %, total balance 2517.920102,\n",
"day 106: buy 1 unit at price 827.880005, total balance 1690.040097\n",
"day 108: buy 1 unit at price 824.729980, total balance 865.310117\n",
"day 109: buy 1 unit at price 823.349976, total balance 41.960141\n",
"day 110: buy 1 unit at price 824.320007, total balance -782.359866\n",
"day 112, sell 1 unit at price 837.169983, investment 0.215472 %, total balance 54.810117,\n",
"day 113, sell 1 unit at price 836.820007, investment -1.040655 %, total balance 891.630124,\n",
"day 114, sell 1 unit at price 838.210022, investment -1.245318 %, total balance 1729.840146,\n",
"day 115: buy 1 unit at price 841.650024, total balance 888.190122\n",
"day 117: buy 1 unit at price 862.760010, total balance 25.430112\n",
"day 118, sell 1 unit at price 872.299988, investment 2.368210 %, total balance 897.730100,\n",
"day 119: buy 1 unit at price 871.729980, total balance 26.000120\n",
"day 120, sell 1 unit at price 874.250000, investment 5.383379 %, total balance 900.250120,\n",
"day 121, sell 1 unit at price 905.960022, investment 11.238539 %, total balance 1806.210142,\n",
"day 122, sell 1 unit at price 912.570007, investment 9.761734 %, total balance 2718.780149,\n",
"day 123, sell 1 unit at price 916.440002, investment 10.473022 %, total balance 3635.220151,\n",
"day 124, sell 1 unit at price 927.039978, investment 10.552739 %, total balance 4562.260129,\n",
"day 125, sell 1 unit at price 931.659973, investment 11.633532 %, total balance 5493.920102,\n",
"day 126, sell 1 unit at price 927.130005, investment 11.988452 %, total balance 6421.050107,\n",
"day 127, sell 1 unit at price 934.299988, investment 13.285561 %, total balance 7355.350095,\n",
"day 128, sell 1 unit at price 932.169983, investment 13.216738 %, total balance 8287.520078,\n",
"day 129: buy 1 unit at price 928.780029, total balance 7358.740049\n",
"day 130, sell 1 unit at price 930.599976, investment 12.893047 %, total balance 8289.340025,\n",
"day 132: buy 1 unit at price 937.080017, total balance 7352.260008\n",
"day 133, sell 1 unit at price 943.000000, investment 12.041819 %, total balance 8295.260008,\n",
"day 134: buy 1 unit at price 919.619995, total balance 7375.640013\n",
"day 135: buy 1 unit at price 930.239990, total balance 6445.400023\n",
"day 136: buy 1 unit at price 934.010010, total balance 5511.390013\n",
"day 138: buy 1 unit at price 948.820007, total balance 4562.570006\n",
"day 140: buy 1 unit at price 969.539978, total balance 3593.030028\n",
"day 142, sell 1 unit at price 975.880005, investment 13.111409 %, total balance 4568.910033,\n",
"day 143, sell 1 unit at price 964.859985, investment 10.683355 %, total balance 5533.770018,\n",
"day 144, sell 1 unit at price 966.950012, investment 4.109690 %, total balance 6500.720030,\n",
"day 146, sell 1 unit at price 983.679993, investment 4.972892 %, total balance 7484.400023,\n",
"day 147: buy 1 unit at price 976.570007, total balance 6507.830016\n",
"day 148, sell 1 unit at price 980.940002, investment 6.667972 %, total balance 7488.770018,\n",
"day 149: buy 1 unit at price 983.409973, total balance 6505.360045\n",
"day 150, sell 1 unit at price 949.830017, investment 2.105911 %, total balance 7455.190062,\n",
"day 151: buy 1 unit at price 942.900024, total balance 6512.290038\n",
"day 152, sell 1 unit at price 953.400024, investment 2.075996 %, total balance 7465.690062,\n",
"day 154: buy 1 unit at price 942.309998, total balance 6523.380064\n",
"day 155: buy 1 unit at price 939.780029, total balance 5583.600035\n",
"day 157: buy 1 unit at price 950.630005, total balance 4632.970030\n",
"day 158, sell 1 unit at price 959.450012, investment 1.120339 %, total balance 5592.420042,\n",
"day 159: buy 1 unit at price 957.090027, total balance 4635.330015\n",
"day 160, sell 1 unit at price 965.590027, investment -0.407405 %, total balance 5600.920042,\n",
"day 161, sell 1 unit at price 952.270020, investment -2.488300 %, total balance 6553.190062,\n",
"day 163: buy 1 unit at price 940.489990, total balance 5612.700072\n",
"day 165: buy 1 unit at price 908.729980, total balance 4703.970092\n",
"day 166, sell 1 unit at price 898.700012, investment -8.613901 %, total balance 5602.670104,\n",
"day 169, sell 1 unit at price 918.590027, investment -2.578216 %, total balance 6521.260131,\n",
"day 170: buy 1 unit at price 928.799988, total balance 5592.460143\n",
"day 171, sell 1 unit at price 930.090027, investment -1.296810 %, total balance 6522.550170,\n",
"day 172: buy 1 unit at price 943.830017, total balance 5578.720153\n",
"day 173, sell 1 unit at price 947.159973, investment 0.785284 %, total balance 6525.880126,\n",
"day 174: buy 1 unit at price 955.989990, total balance 5569.890136\n",
"day 175: buy 1 unit at price 953.419983, total balance 4616.470153\n",
"day 177, sell 1 unit at price 970.890015, investment 2.131219 %, total balance 5587.360168,\n",
"day 178, sell 1 unit at price 968.150024, investment 1.155586 %, total balance 6555.510192,\n",
"day 180, sell 1 unit at price 980.340027, investment 4.237157 %, total balance 7535.850219,\n",
"day 181, sell 1 unit at price 950.700012, investment 4.618537 %, total balance 8486.550231,\n",
"day 182: buy 1 unit at price 947.799988, total balance 7538.750243\n",
"day 183, sell 1 unit at price 934.090027, investment 0.569556 %, total balance 8472.840270,\n",
"day 185, sell 1 unit at price 930.500000, investment -1.412332 %, total balance 9403.340270,\n",
"day 186: buy 1 unit at price 930.830017, total balance 8472.510253\n",
"day 187: buy 1 unit at price 930.390015, total balance 7542.120238\n",
"day 188, sell 1 unit at price 923.650024, investment -3.382877 %, total balance 8465.770262,\n",
"day 189: buy 1 unit at price 927.960022, total balance 7537.810240\n",
"day 191: buy 1 unit at price 926.789978, total balance 6611.020262\n",
"day 192, sell 1 unit at price 922.900024, investment -3.201103 %, total balance 7533.920286,\n",
"day 193: buy 1 unit at price 907.239990, total balance 6626.680296\n",
"day 195: buy 1 unit at price 922.669983, total balance 5704.010313\n",
"day 197, sell 1 unit at price 926.960022, investment -2.198773 %, total balance 6630.970335,\n",
"day 199, sell 1 unit at price 910.669983, investment -2.165813 %, total balance 7541.640318,\n",
"day 201, sell 1 unit at price 924.690002, investment -0.612648 %, total balance 8466.330320,\n",
"day 202: buy 1 unit at price 927.000000, total balance 7539.330320\n",
"day 204, sell 1 unit at price 915.890015, investment -1.300703 %, total balance 8455.220335,\n",
"day 205, sell 1 unit at price 913.809998, investment -1.400531 %, total balance 9369.030333,\n",
"day 206: buy 1 unit at price 921.289978, total balance 8447.740355\n",
"day 207, sell 1 unit at price 929.570007, investment 2.461313 %, total balance 9377.310362,\n",
"day 208: buy 1 unit at price 939.330017, total balance 8437.980345\n",
"day 209, sell 1 unit at price 937.340027, investment 1.589956 %, total balance 9375.320372,\n",
"day 211, sell 1 unit at price 927.809998, investment 0.087378 %, total balance 10303.130370,\n",
"day 212: buy 1 unit at price 935.950012, total balance 9367.180358\n",
"day 213: buy 1 unit at price 926.500000, total balance 8440.680358\n",
"day 214, sell 1 unit at price 929.080017, investment 0.845558 %, total balance 9369.760375,\n",
"day 215, sell 1 unit at price 932.070007, investment -0.772892 %, total balance 10301.830382,\n",
"day 217: buy 1 unit at price 925.109985, total balance 9376.720397\n",
"day 218: buy 1 unit at price 920.289978, total balance 8456.430419\n",
"day 219: buy 1 unit at price 915.000000, total balance 7541.430419\n",
"day 220, sell 1 unit at price 921.809998, investment -1.510766 %, total balance 8463.240417,\n",
"day 223: buy 1 unit at price 928.530029, total balance 7534.710388\n",
"day 224: buy 1 unit at price 920.969971, total balance 6613.740417\n",
"day 225: buy 1 unit at price 924.859985, total balance 5688.880432\n",
"day 226, sell 1 unit at price 944.489990, investment 1.941715 %, total balance 6633.370422,\n",
"day 227, sell 1 unit at price 949.500000, investment 2.636445 %, total balance 7582.870422,\n",
"day 229, sell 1 unit at price 953.270020, investment 3.583658 %, total balance 8536.140442,\n",
"day 230, sell 1 unit at price 957.789978, investment 4.676500 %, total balance 9493.930420,\n",
"day 231: buy 1 unit at price 951.679993, total balance 8542.250427\n",
"day 232, sell 1 unit at price 969.960022, investment 4.461890 %, total balance 9512.210449,\n",
"day 233, sell 1 unit at price 978.890015, investment 6.289026 %, total balance 10491.100464,\n",
"day 235, sell 1 unit at price 972.599976, investment 5.161861 %, total balance 11463.700440,\n",
"day 236, sell 1 unit at price 989.250000, investment 3.947756 %, total balance 12452.950440,\n",
"day 238: buy 1 unit at price 989.679993, total balance 11463.270447\n",
"day 239, sell 1 unit at price 992.000000, investment 0.234420 %, total balance 12455.270447,\n",
"day 243: buy 1 unit at price 988.200012, total balance 11467.070435\n",
"day 244: buy 1 unit at price 968.450012, total balance 10498.620423\n",
"day 245: buy 1 unit at price 970.539978, total balance 9528.080445\n",
"day 246, sell 1 unit at price 973.330017, investment -1.504756 %, total balance 10501.410462,\n",
"day 248, sell 1 unit at price 1019.270020, investment 5.247561 %, total balance 11520.680482,\n",
"day 249, sell 1 unit at price 1017.109985, investment 4.798361 %, total balance 12537.790467,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = neural_evolve.buy(fittest_nets)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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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
}