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

681 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",
"from sklearn.neighbors import NearestNeighbors\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\n",
"\n",
"novelty_search_threshold = 6\n",
"novelty_log_maxlen = 1000\n",
"backlog_maxsize = 500\n",
"novelty_log_add_amount = 3"
]
},
{
"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.last_features = None\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": 8,
"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",
" self.generation_backlog = []\n",
" self.novel_backlog = []\n",
" self.novel_pop = []\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 _memorize(self, q, i, limit):\n",
" q.append(i)\n",
" if len(q) > limit:\n",
" q.pop()\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",
" self.population[i].last_features = self.population[i].W2.flatten()\n",
" \n",
" def evaluate(self, individual, backlog, pop, k = 4):\n",
" score = 0\n",
" if len(backlog):\n",
" x = np.array(backlog)\n",
" nn = NearestNeighbors(n_neighbors = k, metric = 'euclidean').fit(np.array(backlog))\n",
" d, _ = nn.kneighbors([individual])\n",
" score += np.mean(d)\n",
" \n",
" if len(pop):\n",
" nn = NearestNeighbors(n_neighbors = k, metric = 'euclidean').fit(np.array(pop))\n",
" d, _ = nn.kneighbors([individual])\n",
" score += np.mean(d)\n",
" \n",
" return score\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",
" scores = [self.evaluate(p.last_features, self.novel_backlog, self.novel_pop) for p in self.population]\n",
" sort_fitness = np.argsort(scores)[::-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",
" \n",
" for p in next_population:\n",
" if p.last_features is not None:\n",
" self._memorize(self.novel_pop, p.last_features, backlog_maxsize)\n",
" if np.random.randint(0,10) < novelty_search_threshold:\n",
" self._memorize(self.novel_backlog, p.last_features, novelty_log_maxlen)\n",
" \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",
" \n",
" if np.random.randint(0,10) < novelty_search_threshold:\n",
" pop_sorted = sorted(self.population, key=lambda p: p.fitness, reverse=True)\n",
" self.generation_backlog.append(pop_sorted[0])\n",
" print('novel add fittest, score: %f, backlog size: %d'%(pop_sorted[0].fitness, \n",
" len(self.generation_backlog)))\n",
" generation_backlog_temp = self.generation_backlog\n",
" if len(self.generation_backlog) > backlog_maxsize:\n",
" generation_backlog_temp = random.sample(generation_backlog, backlog_maxsize)\n",
" for p in generation_backlog_temp:\n",
" if p.last_features is not None:\n",
" self._memorize(self.novel_backlog, p.last_features, novelty_log_maxlen)\n",
" \n",
" return fittest_individual"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"novel add fittest, score: 5.960001, backlog size: 16\n",
"novel add fittest, score: 2.560349, backlog size: 17\n",
"epoch 5, fittest individual 86 with accuracy -99.353801\n",
"novel add fittest, score: 2.073401, backlog size: 18\n",
"epoch 10, fittest individual 53 with accuracy -99.622801\n",
"novel add fittest, score: 9.773855, backlog size: 19\n",
"novel add fittest, score: 1.068502, backlog size: 20\n",
"novel add fittest, score: 1.733602, backlog size: 21\n",
"epoch 15, fittest individual 49 with accuracy -94.018300\n",
"novel add fittest, score: 1.439049, backlog size: 22\n",
"novel add fittest, score: 0.000000, backlog size: 23\n",
"novel add fittest, score: 0.000000, backlog size: 24\n",
"novel add fittest, score: 3.052850, backlog size: 25\n",
"epoch 20, fittest individual 83 with accuracy -42.284500\n",
"novel add fittest, score: 3.284498, backlog size: 26\n",
"novel add fittest, score: 3.284498, backlog size: 27\n",
"novel add fittest, score: 0.000000, backlog size: 28\n",
"novel add fittest, score: 0.000000, backlog size: 29\n",
"epoch 25, fittest individual 43 with accuracy -99.809850\n",
"novel add fittest, score: 0.000000, backlog size: 30\n",
"novel add fittest, score: 0.000000, backlog size: 31\n",
"novel add fittest, score: 4.712602, backlog size: 32\n",
"novel add fittest, score: 4.712602, backlog size: 33\n",
"epoch 30, fittest individual 51 with accuracy -94.734501\n",
"novel add fittest, score: 4.712602, backlog size: 34\n",
"novel add fittest, score: 0.000000, backlog size: 35\n",
"novel add fittest, score: 0.000000, backlog size: 36\n",
"epoch 35, fittest individual 74 with accuracy -99.895853\n",
"novel add fittest, score: 0.000000, backlog size: 37\n",
"novel add fittest, score: 0.000000, backlog size: 38\n",
"novel add fittest, score: 0.000000, backlog size: 39\n",
"novel add fittest, score: 0.000000, backlog size: 40\n",
"epoch 40, fittest individual 50 with accuracy -99.900900\n",
"novel add fittest, score: 0.000000, backlog size: 41\n",
"novel add fittest, score: 0.000000, backlog size: 42\n",
"epoch 45, fittest individual 98 with accuracy -92.305952\n",
"novel add fittest, score: 0.000000, backlog size: 43\n",
"novel add fittest, score: 0.000000, backlog size: 44\n",
"novel add fittest, score: 0.000000, backlog size: 45\n",
"novel add fittest, score: 0.000000, backlog size: 46\n",
"epoch 50, fittest individual 55 with accuracy -99.841901\n",
"novel add fittest, score: 0.000000, backlog size: 47\n",
"novel add fittest, score: 0.000000, backlog size: 48\n",
"novel add fittest, score: 0.000000, backlog size: 49\n",
"epoch 55, fittest individual 0 with accuracy -99.351002\n",
"novel add fittest, score: 0.000000, backlog size: 50\n",
"novel add fittest, score: 0.000000, backlog size: 51\n",
"novel add fittest, score: 0.000000, backlog size: 52\n",
"epoch 60, fittest individual 56 with accuracy -91.532553\n",
"novel add fittest, score: 0.000000, backlog size: 53\n",
"novel add fittest, score: 0.000000, backlog size: 54\n",
"novel add fittest, score: 0.000000, backlog size: 55\n",
"epoch 65, fittest individual 0 with accuracy -99.389200\n",
"novel add fittest, score: 0.000000, backlog size: 56\n",
"novel add fittest, score: 0.000000, backlog size: 57\n",
"novel add fittest, score: 0.000000, backlog size: 58\n",
"epoch 70, fittest individual 68 with accuracy -90.999901\n",
"novel add fittest, score: 0.000000, backlog size: 59\n",
"novel add fittest, score: 0.000000, backlog size: 60\n",
"novel add fittest, score: 0.000000, backlog size: 61\n",
"novel add fittest, score: 0.000000, backlog size: 62\n",
"epoch 75, fittest individual 50 with accuracy -98.881400\n",
"novel add fittest, score: 0.000000, backlog size: 63\n",
"novel add fittest, score: 0.000000, backlog size: 64\n",
"novel add fittest, score: 0.000000, backlog size: 65\n",
"epoch 80, fittest individual 0 with accuracy -91.959200\n",
"novel add fittest, score: 0.000000, backlog size: 66\n",
"novel add fittest, score: 0.000000, backlog size: 67\n",
"novel add fittest, score: 0.000000, backlog size: 68\n",
"epoch 85, fittest individual 0 with accuracy -94.175699\n",
"novel add fittest, score: 0.000000, backlog size: 69\n",
"novel add fittest, score: 0.000000, backlog size: 70\n",
"novel add fittest, score: 0.000000, backlog size: 71\n",
"novel add fittest, score: 0.000000, backlog size: 72\n",
"novel add fittest, score: 0.000000, backlog size: 73\n",
"epoch 90, fittest individual 60 with accuracy -93.196199\n",
"novel add fittest, score: 0.000000, backlog size: 74\n",
"novel add fittest, score: 0.000000, backlog size: 75\n",
"novel add fittest, score: 0.000000, backlog size: 76\n",
"epoch 95, fittest individual 66 with accuracy -93.122201\n",
"novel add fittest, score: 0.000000, backlog size: 77\n",
"novel add fittest, score: 0.000000, backlog size: 78\n",
"novel add fittest, score: 0.000000, backlog size: 79\n",
"epoch 100, fittest individual 52 with accuracy -93.193801\n",
"novel add fittest, score: 0.000000, backlog size: 80\n"
]
}
],
"source": [
"fittest_nets = neural_evolve.evolve(100)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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: buy 1 unit at price 790.510010, total balance 7664.839965\n",
"day 5, sell 1 unit at price 785.309998, investment 3.041475 %, total balance 8450.149963,\n",
"day 9: buy 1 unit at price 758.489990, total balance 7691.659973\n",
"day 10: buy 1 unit at price 764.479980, total balance 6927.179993\n",
"day 11: buy 1 unit at price 771.229980, total balance 6155.950013\n",
"day 15: buy 1 unit at price 760.989990, total balance 5394.960023\n",
"day 16: buy 1 unit at price 761.679993, total balance 4633.280030\n",
"day 17: buy 1 unit at price 768.239990, total balance 3865.040040\n",
"day 21: buy 1 unit at price 750.500000, total balance 3114.540040\n",
"day 26, sell 1 unit at price 789.289978, investment 0.865148 %, total balance 3903.830018,\n",
"day 31: buy 1 unit at price 790.799988, total balance 3113.030030\n",
"day 37: buy 1 unit at price 791.549988, total balance 2321.480042\n",
"day 39: buy 1 unit at price 782.789978, total balance 1538.690064\n",
"day 40: buy 1 unit at price 771.820007, total balance 766.870057\n",
"day 43: buy 1 unit at price 794.020020, total balance -27.149963\n",
"day 44: buy 1 unit at price 806.150024, total balance -833.299987\n",
"day 45: buy 1 unit at price 806.650024, total balance -1639.950011\n",
"day 48: buy 1 unit at price 806.359985, total balance -2446.309996\n",
"day 49: buy 1 unit at price 807.880005, total balance -3254.190001\n",
"day 50: buy 1 unit at price 804.609985, total balance -4058.799986\n",
"day 52: buy 1 unit at price 802.174988, total balance -4860.974974\n",
"day 53: buy 1 unit at price 805.020020, total balance -5665.994994\n",
"day 54, sell 1 unit at price 819.309998, investment 3.643216 %, total balance -4846.684996,\n",
"day 55: buy 1 unit at price 823.869995, total balance -5670.554991\n",
"day 60: buy 1 unit at price 796.789978, total balance -6467.344969\n",
"day 61: buy 1 unit at price 795.695007, total balance -7263.039976\n",
"day 63: buy 1 unit at price 801.489990, total balance -8064.529966\n",
"day 65: buy 1 unit at price 806.969971, total balance -8871.499937\n",
"day 66: buy 1 unit at price 808.380005, total balance -9679.879942\n",
"day 67: buy 1 unit at price 809.559998, total balance -10489.439940\n",
"day 68: buy 1 unit at price 813.669983, total balance -11303.109923\n",
"day 69: buy 1 unit at price 819.239990, total balance -12122.349913\n",
"day 73, sell 1 unit at price 828.070007, investment 9.173492 %, total balance -11294.279906,\n",
"day 80: buy 1 unit at price 835.239990, total balance -12129.519896\n",
"day 84: buy 1 unit at price 831.909973, total balance -12961.429869\n",
"day 85, sell 1 unit at price 835.369995, investment 9.272972 %, total balance -12126.059874,\n",
"day 86, sell 1 unit at price 838.679993, investment 8.745772 %, total balance -11287.379881,\n",
"day 88: buy 1 unit at price 845.539978, total balance -12132.919859\n",
"day 89: buy 1 unit at price 845.619995, total balance -12978.539854\n",
"day 90: buy 1 unit at price 847.200012, total balance -13825.739866\n",
"day 92: buy 1 unit at price 852.119995, total balance -14677.859861\n",
"day 93: buy 1 unit at price 848.400024, total balance -15526.259885\n",
"day 94: buy 1 unit at price 830.460022, total balance -16356.719907\n",
"day 96: buy 1 unit at price 817.580017, total balance -17174.299924\n",
"day 97: buy 1 unit at price 814.429993, total balance -17988.729917\n",
"day 98: buy 1 unit at price 819.510010, total balance -18808.239927\n",
"day 99: buy 1 unit at price 820.919983, total balance -19629.159910\n",
"day 101, sell 1 unit at price 831.500000, investment 9.265563 %, total balance -18797.659910,\n",
"day 102: buy 1 unit at price 829.559998, total balance -19627.219908\n",
"day 103, sell 1 unit at price 838.549988, investment 10.092164 %, total balance -18788.669920,\n",
"day 104: buy 1 unit at price 834.570007, total balance -19623.239927\n",
"day 105: buy 1 unit at price 831.409973, total balance -20454.649900\n",
"day 107: buy 1 unit at price 824.669983, total balance -21279.319883\n",
"day 108: buy 1 unit at price 824.729980, total balance -22104.049863\n",
"day 109: buy 1 unit at price 823.349976, total balance -22927.399839\n",
"day 112: buy 1 unit at price 837.169983, total balance -23764.569822\n",
"day 116: buy 1 unit at price 843.190002, total balance -24607.759824\n",
"day 119: buy 1 unit at price 871.729980, total balance -25479.489804\n",
"day 125: buy 1 unit at price 931.659973, total balance -26411.149777\n",
"day 127: buy 1 unit at price 934.299988, total balance -27345.449765\n",
"day 129: buy 1 unit at price 928.780029, total balance -28274.229794\n",
"day 130: buy 1 unit at price 930.599976, total balance -29204.829770\n",
"day 133: buy 1 unit at price 943.000000, total balance -30147.829770\n",
"day 134: buy 1 unit at price 919.619995, total balance -31067.449765\n",
"day 137, sell 1 unit at price 941.859985, investment 22.599708 %, total balance -30125.589780,\n",
"day 139: buy 1 unit at price 954.960022, total balance -31080.549802\n",
"day 140: buy 1 unit at price 969.539978, total balance -32050.089780\n",
"day 141, sell 1 unit at price 971.469971, investment 29.443034 %, total balance -31078.619809,\n",
"day 142: buy 1 unit at price 975.880005, total balance -32054.499814\n",
"day 143: buy 1 unit at price 964.859985, total balance -33019.359799\n",
"day 145: buy 1 unit at price 975.599976, total balance -33994.959775\n",
"day 147: buy 1 unit at price 976.570007, total balance -34971.529782\n",
"day 148: buy 1 unit at price 980.940002, total balance -35952.469784\n",
"day 149: buy 1 unit at price 983.409973, total balance -36935.879757\n",
"day 151: buy 1 unit at price 942.900024, total balance -37878.779781\n",
"day 152: buy 1 unit at price 953.400024, total balance -38832.179805\n",
"day 153: buy 1 unit at price 950.760010, total balance -39782.939815\n",
"day 154: buy 1 unit at price 942.309998, total balance -40725.249813\n",
"day 156: buy 1 unit at price 957.369995, total balance -41682.619808\n",
"day 157, sell 1 unit at price 950.630005, investment 20.211181 %, total balance -40731.989803,\n",
"day 158: buy 1 unit at price 959.450012, total balance -41691.439815\n",
"day 159: buy 1 unit at price 957.090027, total balance -42648.529842\n",
"day 164: buy 1 unit at price 917.789978, total balance -43566.319820\n",
"day 165: buy 1 unit at price 908.729980, total balance -44475.049800\n",
"day 167: buy 1 unit at price 911.710022, total balance -45386.759822\n",
"day 168, sell 1 unit at price 906.690002, investment 14.546146 %, total balance -44480.069820,\n",
"day 169, sell 1 unit at price 918.590027, investment 17.348210 %, total balance -43561.479793,\n",
"day 170: buy 1 unit at price 928.799988, total balance -44490.279781\n",
"day 173, sell 1 unit at price 947.159973, investment 22.717728 %, total balance -43543.119808,\n",
"day 184: buy 1 unit at price 941.530029, total balance -44484.649837\n",
"day 186: buy 1 unit at price 930.830017, total balance -45415.479854\n",
"day 187: buy 1 unit at price 930.390015, total balance -46345.869869\n",
"day 190: buy 1 unit at price 929.359985, total balance -47275.229854\n",
"day 191: buy 1 unit at price 926.789978, total balance -48202.019832\n",
"day 194: buy 1 unit at price 914.390015, total balance -49116.409847\n",
"day 196: buy 1 unit at price 922.219971, total balance -50038.629818\n",
"day 198: buy 1 unit at price 910.979980, total balance -50949.609798\n",
"day 201: buy 1 unit at price 924.690002, total balance -51874.299800\n",
"day 202: buy 1 unit at price 927.000000, total balance -52801.299800\n",
"day 206, sell 1 unit at price 921.289978, investment 16.028558 %, total balance -51880.009822,\n",
"day 207: buy 1 unit at price 929.570007, total balance -52809.579829\n",
"day 208: buy 1 unit at price 939.330017, total balance -53748.909846\n",
"day 213: buy 1 unit at price 926.500000, total balance -54675.409846\n",
"day 218: buy 1 unit at price 920.289978, total balance -55595.699824\n",
"day 219: buy 1 unit at price 915.000000, total balance -56510.699824\n",
"day 222: buy 1 unit at price 932.450012, total balance -57443.149836\n",
"day 224: buy 1 unit at price 920.969971, total balance -58364.119807\n",
"day 227: buy 1 unit at price 949.500000, total balance -59313.619807\n",
"day 228: buy 1 unit at price 959.109985, total balance -60272.729792\n",
"day 229: buy 1 unit at price 953.270020, total balance -61225.999812\n",
"day 232: buy 1 unit at price 969.960022, total balance -62195.959834\n",
"day 238: buy 1 unit at price 989.679993, total balance -63185.639827\n",
"day 240: buy 1 unit at price 992.179993, total balance -64177.819820\n",
"day 242: buy 1 unit at price 984.450012, total balance -65162.269832\n",
"day 244: buy 1 unit at price 968.450012, total balance -66130.719844\n",
"day 247: buy 1 unit at price 972.559998, total balance -67103.279842\n",
"day 248: buy 1 unit at price 1019.270020, total balance -68122.549862\n",
"day 249: buy 1 unit at price 1017.109985, total balance -69139.659847\n",
"day 250: buy 1 unit at price 1016.640015, total balance -70156.299862\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = neural_evolve.buy(fittest_nets)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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
}