chore: 添加Stock-Prediction-Models项目文件

添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
This commit is contained in:
zhoujie committed 2025-04-27 16:28:06 +08:00
1 parent f57150dae8
commit 2757a4d0d2
200 files changed
+79402

No files matched your search

@@ -0,0 +1,708 @@
{
"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": [],
"source": [
"def get_state(data, t, n):\n",
" d = t - n + 1\n",
" block = data[d : t + 1] if d >= 0 else -d * [data[0]] + data[0 : t + 1]\n",
" res = []\n",
" for i in range(n - 1):\n",
" res.append(block[i + 1] - block[i])\n",
" return np.array([res])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"TSLA Time Period: **Mar 23, 2018 - Mar 23, 2019**"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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>2018-03-23</td>\n",
" <td>311.250000</td>\n",
" <td>311.250000</td>\n",
" <td>300.450012</td>\n",
" <td>301.540009</td>\n",
" <td>301.540009</td>\n",
" <td>6654900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2018-03-26</td>\n",
" <td>307.339996</td>\n",
" <td>307.589996</td>\n",
" <td>291.359985</td>\n",
" <td>304.179993</td>\n",
" <td>304.179993</td>\n",
" <td>8375200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2018-03-27</td>\n",
" <td>304.000000</td>\n",
" <td>304.269989</td>\n",
" <td>277.179993</td>\n",
" <td>279.179993</td>\n",
" <td>279.179993</td>\n",
" <td>13872000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2018-03-28</td>\n",
" <td>264.579987</td>\n",
" <td>268.679993</td>\n",
" <td>252.100006</td>\n",
" <td>257.779999</td>\n",
" <td>257.779999</td>\n",
" <td>21001400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2018-03-29</td>\n",
" <td>256.489990</td>\n",
" <td>270.959991</td>\n",
" <td>248.210007</td>\n",
" <td>266.130005</td>\n",
" <td>266.130005</td>\n",
" <td>15170700</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2018-03-23 311.250000 311.250000 300.450012 301.540009 301.540009 \n",
"1 2018-03-26 307.339996 307.589996 291.359985 304.179993 304.179993 \n",
"2 2018-03-27 304.000000 304.269989 277.179993 279.179993 279.179993 \n",
"3 2018-03-28 264.579987 268.679993 252.100006 257.779999 257.779999 \n",
"4 2018-03-29 256.489990 270.959991 248.210007 266.130005 266.130005 \n",
"\n",
" Volume \n",
"0 6654900 \n",
"1 8375200 \n",
"2 13872000 \n",
"3 21001400 \n",
"4 15170700 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/TSLA.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"close = df.Close.values.tolist()\n",
"window_size = 30\n",
"skip = 1\n",
"l = len(close) - 1"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"class Deep_Evolution_Strategy:\n",
"\n",
" inputs = None\n",
"\n",
" def __init__(\n",
" self, weights, reward_function, population_size, sigma, learning_rate\n",
" ):\n",
" self.weights = weights\n",
" self.reward_function = reward_function\n",
" self.population_size = population_size\n",
" self.sigma = sigma\n",
" self.learning_rate = learning_rate\n",
"\n",
" def _get_weight_from_population(self, weights, population):\n",
" weights_population = []\n",
" for index, i in enumerate(population):\n",
" jittered = self.sigma * i\n",
" weights_population.append(weights[index] + jittered)\n",
" return weights_population\n",
"\n",
" def get_weights(self):\n",
" return self.weights\n",
"\n",
" def train(self, epoch = 100, print_every = 1):\n",
" lasttime = time.time()\n",
" for i in range(epoch):\n",
" population = []\n",
" rewards = np.zeros(self.population_size)\n",
" for k in range(self.population_size):\n",
" x = []\n",
" for w in self.weights:\n",
" x.append(np.random.randn(*w.shape))\n",
" population.append(x)\n",
" for k in range(self.population_size):\n",
" weights_population = self._get_weight_from_population(\n",
" self.weights, population[k]\n",
" )\n",
" rewards[k] = self.reward_function(weights_population)\n",
" rewards = (rewards - np.mean(rewards)) / np.std(rewards)\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(layer_size, 1),\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",
" buy = np.dot(feed, self.weights[2])\n",
" return decision, buy\n",
"\n",
" def get_weights(self):\n",
" return self.weights\n",
"\n",
" def set_weights(self, weights):\n",
" self.weights = weights"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"class Agent:\n",
"\n",
" POPULATION_SIZE = 15\n",
" SIGMA = 0.1\n",
" LEARNING_RATE = 0.03\n",
"\n",
" def __init__(self, model, money, max_buy, max_sell):\n",
" self.model = model\n",
" self.initial_money = money\n",
" self.max_buy = max_buy\n",
" self.max_sell = max_sell\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, buy = self.model.predict(np.array(sequence))\n",
" return np.argmax(decision[0]), int(buy[0])\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 = get_state(close, 0, window_size + 1)\n",
" inventory = []\n",
" quantity = 0\n",
" for t in range(0, l, skip):\n",
" action, buy = self.act(state)\n",
" next_state = get_state(close, t + 1, window_size + 1)\n",
" if action == 1 and initial_money >= close[t]:\n",
" if buy < 0:\n",
" buy = 1\n",
" if buy > self.max_buy:\n",
" buy_units = self.max_buy\n",
" else:\n",
" buy_units = buy\n",
" total_buy = buy_units * close[t]\n",
" initial_money -= total_buy\n",
" inventory.append(total_buy)\n",
" quantity += buy_units\n",
" elif action == 2 and len(inventory) > 0:\n",
" if quantity > self.max_sell:\n",
" sell_units = self.max_sell\n",
" else:\n",
" sell_units = quantity\n",
" quantity -= sell_units\n",
" total_sell = sell_units * close[t]\n",
" initial_money += total_sell\n",
"\n",
" state = next_state\n",
" return ((initial_money - starting_money) / starting_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 = get_state(close, 0, window_size + 1)\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" inventory = []\n",
" quantity = 0\n",
" for t in range(0, l, skip):\n",
" action, buy = self.act(state)\n",
" next_state = get_state(close, t + 1, window_size + 1)\n",
" if action == 1 and initial_money >= close[t]:\n",
" if buy < 0:\n",
" buy = 1\n",
" if buy > self.max_buy:\n",
" buy_units = self.max_buy\n",
" else:\n",
" buy_units = buy\n",
" total_buy = buy_units * close[t]\n",
" initial_money -= total_buy\n",
" inventory.append(total_buy)\n",
" quantity += buy_units\n",
" states_buy.append(t)\n",
" print(\n",
" 'day %d: buy %d units at price %f, total balance %f'\n",
" % (t, buy_units, total_buy, initial_money)\n",
" )\n",
" elif action == 2 and len(inventory) > 0:\n",
" bought_price = inventory.pop(0)\n",
" if quantity > self.max_sell:\n",
" sell_units = self.max_sell\n",
" else:\n",
" sell_units = quantity\n",
" if sell_units < 1:\n",
" continue\n",
" quantity -= sell_units\n",
" total_sell = sell_units * close[t]\n",
" initial_money += total_sell\n",
" states_sell.append(t)\n",
" try:\n",
" invest = ((total_sell - bought_price) / bought_price) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
" % (t, sell_units, total_sell, invest, initial_money)\n",
" )\n",
" state = next_state\n",
"\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" print(\n",
" '\\ntotal gained %f, total investment %f %%'\n",
" % (initial_money - starting_money, invest)\n",
" )\n",
" plt.figure(figsize = (20, 10))\n",
" plt.plot(close, label = 'true close', c = 'g')\n",
" plt.plot(\n",
" close, 'X', label = 'predict buy', markevery = states_buy, c = 'b'\n",
" )\n",
" plt.plot(\n",
" close, 'o', label = 'predict sell', markevery = states_sell, c = 'r'\n",
" )\n",
" plt.legend()\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"iter 10. reward: 22.809600\n",
"iter 20. reward: 51.687003\n",
"iter 30. reward: 61.576206\n",
"iter 40. reward: 69.384603\n",
"iter 50. reward: 74.372100\n",
"iter 60. reward: 86.872802\n",
"iter 70. reward: 95.984703\n",
"iter 80. reward: 86.611603\n",
"iter 90. reward: 91.603299\n",
"iter 100. reward: 97.332000\n",
"iter 110. reward: 97.179203\n",
"iter 120. reward: 99.749703\n",
"iter 130. reward: 100.879403\n",
"iter 140. reward: 87.869305\n",
"iter 150. reward: 95.844503\n",
"iter 160. reward: 103.064303\n",
"iter 170. reward: 108.591401\n",
"iter 180. reward: 113.703303\n",
"iter 190. reward: 109.320401\n",
"iter 200. reward: 114.320704\n",
"iter 210. reward: 118.800302\n",
"iter 220. reward: 120.808302\n",
"iter 230. reward: 116.255301\n",
"iter 240. reward: 118.316202\n",
"iter 250. reward: 118.671802\n",
"iter 260. reward: 118.965402\n",
"iter 270. reward: 118.079800\n",
"iter 280. reward: 115.773998\n",
"iter 290. reward: 109.795800\n",
"iter 300. reward: 116.520801\n",
"iter 310. reward: 119.137195\n",
"iter 320. reward: 118.383199\n",
"iter 330. reward: 114.609903\n",
"iter 340. reward: 125.628802\n",
"iter 350. reward: 121.527300\n",
"iter 360. reward: 121.432399\n",
"iter 370. reward: 118.581801\n",
"iter 380. reward: 119.989300\n",
"iter 390. reward: 120.004502\n",
"iter 400. reward: 124.851201\n",
"iter 410. reward: 122.869297\n",
"iter 420. reward: 123.599999\n",
"iter 430. reward: 126.341600\n",
"iter 440. reward: 127.074699\n",
"iter 450. reward: 128.540102\n",
"iter 460. reward: 126.781902\n",
"iter 470. reward: 128.691898\n",
"iter 480. reward: 127.336802\n",
"iter 490. reward: 127.829601\n",
"iter 500. reward: 129.304401\n",
"time taken to train: 36.91986346244812 seconds\n"
]
}
],
"source": [
"model = Model(window_size, 500, 3)\n",
"agent = Agent(model, 10000, 5, 5)\n",
"agent.fit(500, 10)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 2: buy 5 units at price 1395.899965, total balance 8604.100035\n",
"day 3: buy 5 units at price 1288.899995, total balance 7315.200040\n",
"day 4: buy 5 units at price 1330.650025, total balance 5984.550015\n",
"day 5: buy 5 units at price 1262.399980, total balance 4722.150035\n",
"day 6: buy 5 units at price 1337.649995, total balance 3384.500040\n",
"day 8, sell 5 units at price 1528.600005, investment 9.506415 %, total balance 4913.100045,\n",
"day 11, sell 5 units at price 1523.500060, investment 18.201572 %, total balance 6436.600105,\n",
"day 12, sell 5 units at price 1504.649965, investment 13.076311 %, total balance 7941.250070,\n",
"day 13: buy 5 units at price 1470.399935, total balance 6470.850135\n",
"day 14, sell 5 units at price 1501.699980, investment 18.955957 %, total balance 7972.550115,\n",
"day 15: buy 5 units at price 1456.049955, total balance 6516.500160\n",
"day 16: buy 5 units at price 1438.450010, total balance 5078.050150\n",
"day 18, sell 5 units at price 1500.399935, investment 12.166855 %, total balance 6578.450085,\n",
"day 19: buy 5 units at price 1451.199950, total balance 5127.250135\n",
"day 22: buy 5 units at price 1403.450010, total balance 3723.800125\n",
"day 24, sell 5 units at price 1470.399935, investment 0.000000 %, total balance 5194.200060,\n",
"day 25: buy 5 units at price 1469.499970, total balance 3724.700090\n",
"day 26, sell 5 units at price 1499.600065, investment 2.990976 %, total balance 5224.300155,\n",
"day 27, sell 5 units at price 1505.749970, investment 4.678644 %, total balance 6730.050125,\n",
"day 28: buy 1 units at price 284.450012, total balance 6445.600113\n",
"day 29: buy 1 units at price 294.089996, total balance 6151.510117\n",
"day 30, sell 5 units at price 1513.849945, investment 4.317117 %, total balance 7665.360062,\n",
"day 31: buy 5 units at price 1509.850005, total balance 6155.510057\n",
"day 32, sell 5 units at price 1534.250030, investment 9.319892 %, total balance 7689.760087,\n",
"day 34, sell 5 units at price 1505.299990, investment 2.436204 %, total balance 9195.060077,\n",
"day 35: buy 5 units at price 1459.850005, total balance 7735.210072\n",
"day 36: buy 5 units at price 1420.899965, total balance 6314.310107\n",
"day 37, sell 5 units at price 1432.400055, investment 403.568288 %, total balance 7746.710162,\n",
"day 38: buy 5 units at price 1422.700045, total balance 6324.010117\n",
"day 39: buy 5 units at price 1384.100035, total balance 4939.910082\n",
"day 41: buy 5 units at price 1375.050050, total balance 3564.860032\n",
"day 42: buy 5 units at price 1395.350035, total balance 2169.509997\n",
"day 44: buy 5 units at price 1394.250030, total balance 775.259967\n",
"day 45: buy 5 units at price 1418.800050, total balance -643.540083\n",
"day 49, sell 5 units at price 1483.699950, investment 404.505413 %, total balance 840.159867,\n",
"day 50: buy 5 units at price 1455.650025, total balance -615.490158\n",
"day 51, sell 5 units at price 1597.500000, investment 5.805212 %, total balance 982.009842,\n",
"day 53: buy 5 units at price 1588.300020, total balance -606.290178\n",
"day 54, sell 5 units at price 1660.500030, investment 13.744564 %, total balance 1054.209852,\n",
"day 55, sell 5 units at price 1713.849945, investment 20.617214 %, total balance 2768.059797,\n",
"day 56, sell 5 units at price 1723.899995, investment 21.171009 %, total balance 4491.959792,\n",
"day 57, sell 5 units at price 1788.600005, investment 29.224764 %, total balance 6280.559797,\n",
"day 58, sell 5 units at price 1790.850065, investment 30.238900 %, total balance 8071.409862,\n",
"day 59, sell 5 units at price 1854.149935, investment 32.880631 %, total balance 9925.559797,\n",
"day 61, sell 5 units at price 1811.100005, investment 29.897792 %, total balance 11736.659802,\n",
"day 62, sell 5 units at price 1737.550050, investment 22.466168 %, total balance 13474.209852,\n",
"day 63: buy 1 units at price 333.630005, total balance 13140.579847\n",
"day 64, sell 3 units at price 999.030030, investment -31.368803 %, total balance 14139.609877,\n",
"day 69: buy 1 units at price 335.070007, total balance 13804.539870\n",
"day 70: buy 1 units at price 310.859985, total balance 13493.679885\n",
"day 72: buy 5 units at price 1544.499970, total balance 11949.179915\n",
"day 73, sell 5 units at price 1592.550050, investment 375.288751 %, total balance 13541.729965,\n",
"day 75: buy 1 units at price 318.959991, total balance 13222.769974\n",
"day 76: buy 5 units at price 1583.549955, total balance 11639.220019\n",
"day 78: buy 5 units at price 1550.500030, total balance 10088.719989\n",
"day 79: buy 1 units at price 322.690002, total balance 9766.029987\n",
"day 82: buy 5 units at price 1567.899935, total balance 8198.130052\n",
"day 83: buy 1 units at price 303.200012, total balance 7894.930040\n",
"day 84: buy 5 units at price 1487.149965, total balance 6407.780075\n",
"day 85: buy 1 units at price 308.739990, total balance 6099.040085\n",
"day 86: buy 5 units at price 1533.249970, total balance 4565.790115\n",
"day 87: buy 1 units at price 297.179993, total balance 4268.610122\n",
"day 88: buy 5 units at price 1450.850065, total balance 2817.760057\n",
"day 89: buy 5 units at price 1490.700075, total balance 1327.059982\n",
"day 91, sell 5 units at price 1747.700045, investment 462.214543 %, total balance 3074.760027,\n",
"day 92, sell 5 units at price 1740.850065, investment 12.712858 %, total balance 4815.610092,\n",
"day 93: buy 1 units at price 341.989990, total balance 4473.620102\n",
"day 94, sell 5 units at price 1897.850035, investment 495.011941 %, total balance 6371.470137,\n",
"day 95, sell 5 units at price 1851.699980, investment 16.933474 %, total balance 8223.170117,\n",
"day 96: buy 1 units at price 352.450012, total balance 7870.720105\n",
"day 97, sell 5 units at price 1777.449950, investment 14.637208 %, total balance 9648.170055,\n",
"day 98, sell 5 units at price 1782.050020, investment 452.248291 %, total balance 11430.220075,\n",
"day 99, sell 5 units at price 1738.200075, investment 10.861671 %, total balance 13168.420150,\n",
"day 101, sell 5 units at price 1677.250060, investment 453.182716 %, total balance 14845.670210,\n",
"day 102: buy 5 units at price 1527.500000, total balance 13318.170210\n",
"day 103: buy 1 units at price 308.440002, total balance 13009.730208\n",
"day 104, sell 5 units at price 1609.499970, investment 8.227146 %, total balance 14619.230178,\n",
"day 105, sell 5 units at price 1608.200075, investment 420.891406 %, total balance 16227.430253,\n",
"day 118: buy 5 units at price 1397.200010, total balance 14830.230243\n",
"day 119: buy 5 units at price 1452.700045, total balance 13377.530198\n",
"day 121: buy 5 units at price 1476.000060, total balance 11901.530138\n",
"day 122: buy 5 units at price 1474.199980, total balance 10427.330158\n",
"day 124, sell 5 units at price 1495.099945, investment 7.006866 %, total balance 11922.430103,\n",
"day 125, sell 5 units at price 1491.649935, investment 2.681207 %, total balance 13414.080038,\n",
"day 126: buy 1 units at price 299.100006, total balance 13114.980032\n",
"day 127, sell 5 units at price 1498.399965, investment 1.517609 %, total balance 14613.379997,\n",
"day 128: buy 5 units at price 1504.949950, total balance 13108.430047\n",
"day 129, sell 5 units at price 1547.899935, investment 4.999319 %, total balance 14656.329982,\n",
"day 131: buy 5 units at price 1323.849945, total balance 13332.480037\n",
"day 132, sell 5 units at price 1553.500060, investment 419.391517 %, total balance 14885.980097,\n",
"day 135: buy 1 units at price 281.829987, total balance 14604.150110\n",
"day 136: buy 5 units at price 1309.750060, total balance 13294.400050\n",
"day 137: buy 5 units at price 1252.799990, total balance 12041.600060\n",
"day 139: buy 5 units at price 1284.400025, total balance 10757.200035\n",
"day 140: buy 5 units at price 1261.149980, total balance 9496.050055\n",
"day 142: buy 5 units at price 1297.949980, total balance 8198.100075\n",
"day 143: buy 1 units at price 276.589996, total balance 7921.510079\n",
"day 145: buy 5 units at price 1319.550020, total balance 6601.960059\n",
"day 146: buy 1 units at price 260.000000, total balance 6341.960059\n",
"day 147: buy 5 units at price 1304.750060, total balance 5037.209999\n",
"day 148, sell 5 units at price 1470.700075, investment -2.275815 %, total balance 6507.910074,\n",
"day 150: buy 5 units at price 1574.299925, total balance 4933.610149\n",
"day 151, sell 5 units at price 1654.499970, investment 24.976398 %, total balance 6588.110119,\n",
"day 153: buy 5 units at price 1649.499970, total balance 4938.610149\n",
"day 155, sell 5 units at price 1721.399995, investment 510.793767 %, total balance 6660.010144,\n",
"day 156: buy 1 units at price 346.410004, total balance 6313.600140\n",
"day 157, sell 5 units at price 1706.999970, investment 30.330207 %, total balance 8020.600110,\n",
"day 158, sell 5 units at price 1705.299990, investment 36.119094 %, total balance 9725.900100,\n",
"day 159: buy 1 units at price 348.160004, total balance 9377.740096\n",
"day 160, sell 5 units at price 1756.999970, investment 36.795386 %, total balance 11134.740066,\n",
"day 162: buy 1 units at price 331.279999, total balance 10803.460067\n",
"day 164, sell 5 units at price 1720.000000, investment 36.383462 %, total balance 12523.460067,\n",
"day 166, sell 5 units at price 1771.549990, investment 36.488310 %, total balance 14295.010057,\n",
"day 167, sell 5 units at price 1767.350005, investment 538.978282 %, total balance 16062.360062,\n",
"day 168: buy 1 units at price 347.489990, total balance 15714.870072\n",
"day 169: buy 1 units at price 338.190002, total balance 15376.680070\n",
"day 170: buy 1 units at price 325.829987, total balance 15050.850083\n",
"day 171, sell 5 units at price 1730.000000, investment 31.105299 %, total balance 16780.850083,\n",
"day 173, sell 5 units at price 1739.349975, investment 568.980760 %, total balance 18520.200058,\n",
"day 175: buy 5 units at price 1752.400055, total balance 16767.800003\n",
"day 178, sell 5 units at price 1815.299990, investment 39.130094 %, total balance 18583.099993,\n",
"day 179, sell 5 units at price 1789.850005, investment 13.691805 %, total balance 20372.949998,\n",
"day 189: buy 1 units at price 319.769989, total balance 20053.180009\n",
"day 190: buy 5 units at price 1476.950075, total balance 18576.229934\n",
"day 191, sell 5 units at price 1630.449980, investment 409.882114 %, total balance 20206.679914,\n",
"day 195: buy 1 units at price 310.119995, total balance 19896.559919\n",
"day 196: buy 5 units at price 1501.799925, total balance 18394.759994\n",
"day 197, sell 5 units at price 1588.450010, investment 7.549337 %, total balance 19983.210004,\n",
"day 198, sell 2 units at price 669.919982, investment 116.019603 %, total balance 20653.129986,\n",
"day 202: buy 1 units at price 347.260010, total balance 20305.869976\n",
"day 205, sell 1 units at price 346.049988, investment -0.348448 %, total balance 20651.919964,\n",
"day 207: buy 1 units at price 302.260010, total balance 20349.659954\n",
"day 208, sell 1 units at price 298.920013, investment -1.105008 %, total balance 20648.579967,\n",
"day 209: buy 5 units at price 1437.949980, total balance 19210.629987\n",
"day 210: buy 5 units at price 1457.550050, total balance 17753.079937\n",
"day 212: buy 5 units at price 1481.900025, total balance 16271.179912\n",
"day 213: buy 1 units at price 297.459991, total balance 15973.719921\n",
"day 215: buy 1 units at price 307.019989, total balance 15666.699932\n",
"day 216, sell 5 units at price 1561.049955, investment 8.560797 %, total balance 17227.749887,\n",
"day 217, sell 5 units at price 1564.450075, investment 7.334227 %, total balance 18792.199962,\n",
"day 218, sell 5 units at price 1606.750030, investment 8.424995 %, total balance 20398.949992,\n",
"day 219, sell 2 units at price 634.440002, investment 113.285827 %, total balance 21033.389994,\n",
"day 220: buy 1 units at price 307.510010, total balance 20725.879984\n",
"day 221: buy 5 units at price 1528.999940, total balance 19196.880044\n",
"day 222: buy 1 units at price 312.839996, total balance 18884.040048\n",
"day 224: buy 1 units at price 308.170013, total balance 18575.870035\n",
"day 225, sell 5 units at price 1518.849945, investment 394.707185 %, total balance 20094.719980,\n",
"day 229: buy 5 units at price 1456.150055, total balance 18638.569925\n",
"day 230, sell 5 units at price 1473.549955, investment 379.187638 %, total balance 20112.119880,\n",
"day 232: buy 1 units at price 297.859985, total balance 19814.259895\n",
"day 233, sell 4 units at price 1258.959960, investment -17.661216 %, total balance 21073.219855,\n",
"day 245: buy 5 units at price 1377.149965, total balance 19696.069890\n",
"day 246: buy 1 units at price 269.489990, total balance 19426.579900\n",
"day 247, sell 5 units at price 1337.350005, investment -2.890024 %, total balance 20763.929905,\n",
"day 248, sell 1 units at price 273.600006, investment 1.525109 %, total balance 21037.529911,\n",
"\n",
"total gained 11037.529911, total investment 110.375299 %\n"
]
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"agent.buy()"
]
},
{
"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
}