chore: 添加Stock-Prediction-Models项目文件
添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
This commit is contained in:
1 parent
f57150dae8
commit
2757a4d0d2
200 files changed
+79402
No files matched your search
+892
@@ -0,0 +1,892 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\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": [
|
||||
{
|
||||
"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>signal</th>\n",
|
||||
" <th>trend</th>\n",
|
||||
" <th>RollingMax</th>\n",
|
||||
" <th>RollingMin</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>768.700012</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>762.130005</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>762.020020</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>782.520020</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>790.510010</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>5</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>785.309998</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>6</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>762.559998</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>7</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>754.020020</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>8</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>736.080017</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>9</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>758.489990</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>10</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>764.479980</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>11</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>771.229980</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>12</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>760.539978</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>13</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>769.200012</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>14</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>768.270020</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>15</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>760.989990</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>16</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>761.679993</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>17</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>768.239990</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>18</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>770.840027</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>19</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>758.039978</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>20</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>747.919983</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>21</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>750.500000</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>22</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>762.520020</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>23</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>759.109985</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>24</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>771.190002</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>25</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>776.419983</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>26</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>789.289978</td>\n",
|
||||
" <td>790.510010</td>\n",
|
||||
" <td>736.080017</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>27</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>789.270020</td>\n",
|
||||
" <td>790.510010</td>\n",
|
||||
" <td>736.080017</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>28</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>796.099976</td>\n",
|
||||
" <td>790.510010</td>\n",
|
||||
" <td>736.080017</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>29</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>797.070007</td>\n",
|
||||
" <td>796.099976</td>\n",
|
||||
" <td>736.080017</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>...</th>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>222</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>932.450012</td>\n",
|
||||
" <td>939.330017</td>\n",
|
||||
" <td>906.659973</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>223</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>928.530029</td>\n",
|
||||
" <td>939.330017</td>\n",
|
||||
" <td>906.659973</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>224</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" <td>939.330017</td>\n",
|
||||
" <td>906.659973</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>225</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>924.859985</td>\n",
|
||||
" <td>939.330017</td>\n",
|
||||
" <td>906.659973</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>226</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>944.489990</td>\n",
|
||||
" <td>939.330017</td>\n",
|
||||
" <td>906.659973</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>227</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>949.500000</td>\n",
|
||||
" <td>944.489990</td>\n",
|
||||
" <td>913.809998</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>228</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>959.109985</td>\n",
|
||||
" <td>949.500000</td>\n",
|
||||
" <td>913.809998</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>229</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>953.270020</td>\n",
|
||||
" <td>959.109985</td>\n",
|
||||
" <td>913.809998</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>230</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>957.789978</td>\n",
|
||||
" <td>959.109985</td>\n",
|
||||
" <td>913.809998</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>231</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>951.679993</td>\n",
|
||||
" <td>959.109985</td>\n",
|
||||
" <td>913.809998</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>232</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>969.960022</td>\n",
|
||||
" <td>959.109985</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>233</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>978.890015</td>\n",
|
||||
" <td>969.960022</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>234</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>977.000000</td>\n",
|
||||
" <td>978.890015</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>235</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>972.599976</td>\n",
|
||||
" <td>978.890015</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>236</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>989.250000</td>\n",
|
||||
" <td>978.890015</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>237</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>987.830017</td>\n",
|
||||
" <td>989.250000</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>238</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>989.679993</td>\n",
|
||||
" <td>989.250000</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>239</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>992.000000</td>\n",
|
||||
" <td>989.679993</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>240</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>992.179993</td>\n",
|
||||
" <td>992.000000</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>241</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>992.179993</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>242</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>984.450012</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>243</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>988.200012</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>244</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>968.450012</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>245</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>970.539978</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>915.000000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>246</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>973.330017</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>247</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>972.559998</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>248</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>1019.270020</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>249</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>1017.109985</td>\n",
|
||||
" <td>1019.270020</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>250</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>1016.640015</td>\n",
|
||||
" <td>1019.270020</td>\n",
|
||||
" <td>920.969971</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>251</th>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" <td>1025.500000</td>\n",
|
||||
" <td>1019.270020</td>\n",
|
||||
" <td>924.859985</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"<p>252 rows × 4 columns</p>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" signal trend RollingMax RollingMin\n",
|
||||
"0 0.0 768.700012 NaN NaN\n",
|
||||
"1 0.0 762.130005 NaN NaN\n",
|
||||
"2 0.0 762.020020 NaN NaN\n",
|
||||
"3 0.0 782.520020 NaN NaN\n",
|
||||
"4 0.0 790.510010 NaN NaN\n",
|
||||
"5 0.0 785.309998 NaN NaN\n",
|
||||
"6 0.0 762.559998 NaN NaN\n",
|
||||
"7 0.0 754.020020 NaN NaN\n",
|
||||
"8 0.0 736.080017 NaN NaN\n",
|
||||
"9 0.0 758.489990 NaN NaN\n",
|
||||
"10 0.0 764.479980 NaN NaN\n",
|
||||
"11 0.0 771.229980 NaN NaN\n",
|
||||
"12 0.0 760.539978 NaN NaN\n",
|
||||
"13 0.0 769.200012 NaN NaN\n",
|
||||
"14 0.0 768.270020 NaN NaN\n",
|
||||
"15 0.0 760.989990 NaN NaN\n",
|
||||
"16 0.0 761.679993 NaN NaN\n",
|
||||
"17 0.0 768.239990 NaN NaN\n",
|
||||
"18 0.0 770.840027 NaN NaN\n",
|
||||
"19 0.0 758.039978 NaN NaN\n",
|
||||
"20 0.0 747.919983 NaN NaN\n",
|
||||
"21 0.0 750.500000 NaN NaN\n",
|
||||
"22 0.0 762.520020 NaN NaN\n",
|
||||
"23 0.0 759.109985 NaN NaN\n",
|
||||
"24 0.0 771.190002 NaN NaN\n",
|
||||
"25 0.0 776.419983 NaN NaN\n",
|
||||
"26 0.0 789.289978 790.510010 736.080017\n",
|
||||
"27 0.0 789.270020 790.510010 736.080017\n",
|
||||
"28 -1.0 796.099976 790.510010 736.080017\n",
|
||||
"29 -1.0 797.070007 796.099976 736.080017\n",
|
||||
".. ... ... ... ...\n",
|
||||
"222 0.0 932.450012 939.330017 906.659973\n",
|
||||
"223 0.0 928.530029 939.330017 906.659973\n",
|
||||
"224 0.0 920.969971 939.330017 906.659973\n",
|
||||
"225 0.0 924.859985 939.330017 906.659973\n",
|
||||
"226 -1.0 944.489990 939.330017 906.659973\n",
|
||||
"227 -1.0 949.500000 944.489990 913.809998\n",
|
||||
"228 -1.0 959.109985 949.500000 913.809998\n",
|
||||
"229 0.0 953.270020 959.109985 913.809998\n",
|
||||
"230 0.0 957.789978 959.109985 913.809998\n",
|
||||
"231 0.0 951.679993 959.109985 913.809998\n",
|
||||
"232 -1.0 969.960022 959.109985 915.000000\n",
|
||||
"233 -1.0 978.890015 969.960022 915.000000\n",
|
||||
"234 0.0 977.000000 978.890015 915.000000\n",
|
||||
"235 0.0 972.599976 978.890015 915.000000\n",
|
||||
"236 -1.0 989.250000 978.890015 915.000000\n",
|
||||
"237 0.0 987.830017 989.250000 915.000000\n",
|
||||
"238 -1.0 989.679993 989.250000 915.000000\n",
|
||||
"239 -1.0 992.000000 989.679993 915.000000\n",
|
||||
"240 -1.0 992.179993 992.000000 915.000000\n",
|
||||
"241 -1.0 992.809998 992.179993 915.000000\n",
|
||||
"242 0.0 984.450012 992.809998 915.000000\n",
|
||||
"243 0.0 988.200012 992.809998 915.000000\n",
|
||||
"244 0.0 968.450012 992.809998 915.000000\n",
|
||||
"245 0.0 970.539978 992.809998 915.000000\n",
|
||||
"246 0.0 973.330017 992.809998 920.969971\n",
|
||||
"247 0.0 972.559998 992.809998 920.969971\n",
|
||||
"248 -1.0 1019.270020 992.809998 920.969971\n",
|
||||
"249 0.0 1017.109985 1019.270020 920.969971\n",
|
||||
"250 0.0 1016.640015 1019.270020 920.969971\n",
|
||||
"251 -1.0 1025.500000 1019.270020 924.859985\n",
|
||||
"\n",
|
||||
"[252 rows x 4 columns]"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"count = int(np.ceil(len(df) * 0.1))\n",
|
||||
"signals = pd.DataFrame(index=df.index)\n",
|
||||
"signals['signal'] = 0.0\n",
|
||||
"signals['trend'] = df['Close']\n",
|
||||
"signals['RollingMax'] = (signals.trend.shift(1).rolling(count).max())\n",
|
||||
"signals['RollingMin'] = (signals.trend.shift(1).rolling(count).min())\n",
|
||||
"signals.loc[signals['RollingMax'] < signals.trend, 'signal'] = -1\n",
|
||||
"signals.loc[signals['RollingMin'] > signals.trend, 'signal'] = 1\n",
|
||||
"signals"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def buy_stock(\n",
|
||||
" real_movement,\n",
|
||||
" signal,\n",
|
||||
" initial_money = 10000,\n",
|
||||
" max_buy = 1,\n",
|
||||
" max_sell = 1,\n",
|
||||
"):\n",
|
||||
" \"\"\"\n",
|
||||
" real_movement = actual movement in the real world\n",
|
||||
" delay = how much interval you want to delay to change our decision from buy to sell, vice versa\n",
|
||||
" initial_state = 1 is buy, 0 is sell\n",
|
||||
" initial_money = 1000, ignore what kind of currency\n",
|
||||
" max_buy = max quantity for share to buy\n",
|
||||
" max_sell = max quantity for share to sell\n",
|
||||
" \"\"\"\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" current_inventory = 0\n",
|
||||
"\n",
|
||||
" def buy(i, initial_money, current_inventory):\n",
|
||||
" shares = initial_money // real_movement[i]\n",
|
||||
" if shares < 1:\n",
|
||||
" print(\n",
|
||||
" 'day %d: total balances %f, not enough money to buy a unit price %f'\n",
|
||||
" % (i, initial_money, real_movement[i])\n",
|
||||
" )\n",
|
||||
" else:\n",
|
||||
" if shares > max_buy:\n",
|
||||
" buy_units = max_buy\n",
|
||||
" else:\n",
|
||||
" buy_units = shares\n",
|
||||
" initial_money -= buy_units * real_movement[i]\n",
|
||||
" current_inventory += buy_units\n",
|
||||
" print(\n",
|
||||
" 'day %d: buy %d units at price %f, total balance %f'\n",
|
||||
" % (i, buy_units, buy_units * real_movement[i], initial_money)\n",
|
||||
" )\n",
|
||||
" states_buy.append(0)\n",
|
||||
" return initial_money, current_inventory\n",
|
||||
"\n",
|
||||
" for i in range(real_movement.shape[0] - int(0.025 * len(df))):\n",
|
||||
" state = signal[i]\n",
|
||||
" if state == 1:\n",
|
||||
" initial_money, current_inventory = buy(\n",
|
||||
" i, initial_money, current_inventory\n",
|
||||
" )\n",
|
||||
" states_buy.append(i)\n",
|
||||
" elif state == -1:\n",
|
||||
" if current_inventory == 0:\n",
|
||||
" print('day %d: cannot sell anything, inventory 0' % (i))\n",
|
||||
" else:\n",
|
||||
" if current_inventory > max_sell:\n",
|
||||
" sell_units = max_sell\n",
|
||||
" else:\n",
|
||||
" sell_units = current_inventory\n",
|
||||
" current_inventory -= sell_units\n",
|
||||
" total_sell = sell_units * real_movement[i]\n",
|
||||
" initial_money += total_sell\n",
|
||||
" try:\n",
|
||||
" invest = (\n",
|
||||
" (real_movement[i] - real_movement[states_buy[-1]])\n",
|
||||
" / real_movement[states_buy[-1]]\n",
|
||||
" ) * 100\n",
|
||||
" except:\n",
|
||||
" invest = 0\n",
|
||||
" print(\n",
|
||||
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
|
||||
" % (i, sell_units, total_sell, invest, initial_money)\n",
|
||||
" )\n",
|
||||
" states_sell.append(i)\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": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 28: cannot sell anything, inventory 0\n",
|
||||
"day 29: cannot sell anything, inventory 0\n",
|
||||
"day 30: cannot sell anything, inventory 0\n",
|
||||
"day 44: cannot sell anything, inventory 0\n",
|
||||
"day 45: cannot sell anything, inventory 0\n",
|
||||
"day 47: cannot sell anything, inventory 0\n",
|
||||
"day 54: cannot sell anything, inventory 0\n",
|
||||
"day 55: cannot sell anything, inventory 0\n",
|
||||
"day 56: cannot sell anything, inventory 0\n",
|
||||
"day 85: cannot sell anything, inventory 0\n",
|
||||
"day 86: cannot sell anything, inventory 0\n",
|
||||
"day 87: cannot sell anything, inventory 0\n",
|
||||
"day 88: cannot sell anything, inventory 0\n",
|
||||
"day 89: cannot sell anything, inventory 0\n",
|
||||
"day 90: cannot sell anything, inventory 0\n",
|
||||
"day 91: cannot sell anything, inventory 0\n",
|
||||
"day 92: cannot sell anything, inventory 0\n",
|
||||
"day 96: buy 1 units at price 817.580017, total balance 9182.419983\n",
|
||||
"day 97: buy 1 units at price 814.429993, total balance 8367.989990\n",
|
||||
"day 117, sell 1 units at price 862.760010, investment 5.934214 %, total balance 9230.750000,\n",
|
||||
"day 118, sell 1 units at price 872.299988, investment 7.105582 %, total balance 10103.049988,\n",
|
||||
"day 120: cannot sell anything, inventory 0\n",
|
||||
"day 121: cannot sell anything, inventory 0\n",
|
||||
"day 122: cannot sell anything, inventory 0\n",
|
||||
"day 123: cannot sell anything, inventory 0\n",
|
||||
"day 124: cannot sell anything, inventory 0\n",
|
||||
"day 125: cannot sell anything, inventory 0\n",
|
||||
"day 127: cannot sell anything, inventory 0\n",
|
||||
"day 132: cannot sell anything, inventory 0\n",
|
||||
"day 133: cannot sell anything, inventory 0\n",
|
||||
"day 138: cannot sell anything, inventory 0\n",
|
||||
"day 139: cannot sell anything, inventory 0\n",
|
||||
"day 140: cannot sell anything, inventory 0\n",
|
||||
"day 141: cannot sell anything, inventory 0\n",
|
||||
"day 142: cannot sell anything, inventory 0\n",
|
||||
"day 146: cannot sell anything, inventory 0\n",
|
||||
"day 162: buy 1 units at price 927.330017, total balance 9175.719971\n",
|
||||
"day 164: buy 1 units at price 917.789978, total balance 8257.929993\n",
|
||||
"day 165: buy 1 units at price 908.729980, total balance 7349.200013\n",
|
||||
"day 166: buy 1 units at price 898.700012, total balance 6450.500001\n",
|
||||
"day 177, sell 1 units at price 970.890015, investment 8.032714 %, total balance 7421.390016,\n",
|
||||
"day 179, sell 1 units at price 972.919983, investment 8.258592 %, total balance 8394.309999,\n",
|
||||
"day 180, sell 1 units at price 980.340027, investment 9.084234 %, total balance 9374.650026,\n",
|
||||
"day 200: buy 1 units at price 906.659973, total balance 8467.990053\n",
|
||||
"day 226, sell 1 units at price 944.489990, investment 4.172459 %, total balance 9412.480043,\n",
|
||||
"day 227, sell 1 units at price 949.500000, investment 4.725038 %, total balance 10361.980043,\n",
|
||||
"day 228: cannot sell anything, inventory 0\n",
|
||||
"day 232: cannot sell anything, inventory 0\n",
|
||||
"day 233: cannot sell anything, inventory 0\n",
|
||||
"day 236: cannot sell anything, inventory 0\n",
|
||||
"day 238: cannot sell anything, inventory 0\n",
|
||||
"day 239: cannot sell anything, inventory 0\n",
|
||||
"day 240: cannot sell anything, inventory 0\n",
|
||||
"day 241: cannot sell anything, inventory 0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = buy_stock(df.Close, signals['signal'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XeYVEXWwOHf7TA5J3JQQpEkIyiCYMCAIoor5rDquOKKAXP2E13Dumtaw6osKqtrjhhQAUEEFBQDQqEgmck59UyH7497u5mBCT05nfd5eBz6prrdNXhPn6pThs/nQwghhBBCCCFEx2Vr7QYIIYQQQgghhGheEvgJIYQQQgghRAcngZ8QQgghhBBCdHAS+AkhhBBCCCFEByeBnxBCCCGEEEJ0cBL4CSGEEEIIIUQHJ4GfEELUQCm1UCk1vxnOO0kppZv6vKJtU0r5lFL9a9j2iVLqopZukxBCiM7D0doNEEKIhlJKbQcu01p/0Rz7Nxet9UpANfV5lVLLgGFAKPAHcJfW+v1K25OBx4HpgBf4WGt9nrXtLOBaYCTwrdZ6Si3XMYDbgCuAOOBjIFVrXWBtTwCeAY4DfMBnwJWVtvcF/gOMB3YCf638mSilrgNuBiKAt6xjXQe04WhgOXC/1voO67WzgXuBroAL+AS42n/dOt67KcAirXXPuvZtyP510Vqf1BTnaajW/N1QSl1sXfuoWvZ5GDgHiAVygee01g/Usn+D+7pS6lTgb0Bf4Cerbb9a2wzgPuASIAr4AbhKa73R2h6K2ffPBEqAh7XW/6h07mOBfwG9gbXAxVrrHda2GzH7fTpwttb6Z+v1icCNWuuZNd2vEEIEQzJ+QgjRcVwDdNNaxwCpwCKlVLdK298B0jAfOlOAv1falgM8BjwYxHUuBC4AJgLdgXDgyUrb5wPxwCFAP6ALcE+l7a9hPjAnArcDb1kP6iilTgBuAY4F+gCHYgZzAUopJ+ZD/doD2rUKmKi1jrWOc1htEe3fi8Agq28fCZynlDqjlv0b1NeVUgOA/wJ/wfxS40PgA6WU/4vyPwF/BiYBCcBq4JVKp7gHGIDZd6cCNymlTrTOnWS1607r2HXA69a2bsClmP32GczAE+u6j2IGqkII0SiS8RNCtEtKqVcwH+o+VEp5gP/TWj+slJqB+dDUA9iAmS3aVMv+b2I+xIUDP1r7bwzi+nbgYeAioBDz4exJwKm1diulLgFuAnoCmcBDWuvnrGOnUClbZGVbnsIMqPoAnwIXaa3LrIfFhcBRmJmLjcDRWmvvgW3SWv9U6a8+wAn0AvYppaZZP0/RWnusfX6odOwXVlsuq+vegVOBF7XWu6xjHgKWKqWu1FqXYAZ871XK8L0LzLB+HgiMBqZprUuBt5VS1wKzgGet9/PFShmU+zAfxG+pdP15wBLMB/rK97/rgHZ6gGqHVlamlIrEzA6GKqWKrJcHAtnAQ8BZ1mtvYGZkHDXs3xMzIB0MlAJvA9drrcuDaMNyzD7xgj8DBqzBDAbygDla60+UUrMxsz9jKx17HTBVaz3Dyjjdb7U5FHgXuE5rXVpTXwJe4oDfDete/8AMcv4PM7t1K7AeMwjrbbX3r5Xa8WfgRsyM67eYWWB/NssHXIn52SVjfqZ/BQZhfu5O6710a63jDnx/tNYHDo32UsNn28i+fgKwUmv9tbXPQ8Bd1vv0JWbf/lprvc3avgi4rtLxF2Fm8XKBXKXU88DFmL/TZwAbtdZvWsfeA2QppQZhZjJ/0FoXKKW+AOZY57sW+EBrvb26exVCiPqQjJ8Qol3SWl+AOUzwVK11lBXEDcTMJl2L+XD5MebDbEh1+1un+gTzG/oU4HvMB9JgXA6chDlcbDRw4DCsDOAUIAZzWNg/lVKjaznfWcCJmA+WwzEfFsF8UN5t3U8XzCGWvppOopT6SClVhpkNW46ZVQCYAGjgJaVUtlLqO2u4ZEMZB/wcivk+gjmU7RSlVLxSKh4zqPvE2jYU2Ka1Lqx0/I/W6/7tPx6wrYtSKtG6vz7sD0YOopQ6SimVjxmMz8LM7NRKa12M+VnutfpGlNZ6L2Y2cgLmZzwCOBy4o5b9PZhBQBJwBGbWcs7BVwzKeMzPKwnzC4YXrWGGH5q3qQZU2vdc4FXr5wcxg9CRmIFRD8zABWroS7X8bvjbMQCYjfle3o45hHcocJa/DymlTrPOd4Z1/pWYv4uVnQKMw+zfZwEnaK03YWbXVlvXPijo81NK3WIFh7uByEr3fKDG9vUD+7aBOYQa4H9AP6XUQCvzfBFmUIfV17txcP+ttm9b/Wir9frvwGFKqTjM93ejUqoXcDZVs5VCCNFgEvgJITqS2cBirfXnWusKzAemcMyhYdXSWi/QWhdac8juAUYopWKDuNZZwONa693Wt/tVho1prRdrrbdqrX1a668wM1STajnfE1rrvVrrHMyH+5HW6xWYD5N9tNYVWuuVWusaAz+t9SlANHAysKRSZrAnMA1YhpmReRR438oC1denwGVKqb7We3Wz9XqE9d/vgRDMjFk2ZkD0tLUtCsg/4Hz5Vpur2+7/2b/9CeBOrXUR1dBaf20N9ewJPAJsr9edVXUeZmY4Q2udiTnk9IKadtZar9dar9Fau60MzXOYmaKG2KG1ft7KWL2E2Qe6WBnV9zHnu/mHJg7CHI5oYA7xvU5rnWMF1w9gBg9Qz75kuU9rXaa1XgIUA69Z78cezOBulLXfX4C/aa03aa3d1nVHWoG634Na6zyt9U7MfjiSetBaP4jZD0ZjDq88sB/5NaavfwEcrZSaopQKwQxmQ9jft/cBX2MGlqWYQz/9Gb8o678H9t+a+nZgu9Y6GzNTuxRzXuINmNnjm4HTlVJfKaXeV0o1yZxSIUTnJIGfEKIj6Q7s8P/FCnp2YWY9DqKUsiulHlRKbVVKFbA/SAjmAbG7dW6/KsMMlVInKaXWKKVylFJ5mIFYbedNq/RzCfsfIh/BzAYsUUptU0rdctCRB7Ae6j8BpllDX8F8SN2utX7R2v4/q80T6zpfNRZgZnOWYw4XXGa9vtv67xvAFswH3hjMrMYia1uR9VplMZgZuuq2+38utIpuRGutX6+rgVZg8ilmhqahqvQn6+fuNe1sZYE+UkqlWf3pAYLrS9UJ9Acr2IP9feJVrMAPM9v3nrVPMmaAsl4plWf1u0+t16EBfQmz0IhfaTV/97epD/B4pevmYGbKKv/u1dTHg2Z9kfKDde17a9itwX1da70ZM4v3FGaQlwT8yv6+fRdm1rIXEGa1YalSKgKz78LB/bemvl1lu9b6Na31aG0W+hmGWaDoB8wvsE4F3kSyf0KIRpDATwjRnh2YrdiL+QAKBCrw9QL21LD/ucBpmEOrYjGr+EHVoV412YeZWfDrVem6oZjzu/6OmaXxV74M5rxVWNnIeVrrQzHnyV1vVQYMhgOzuAqY1QkPvP+6sj01tcmrtb5ba93Xmqe4EfM99r/PIzGrLhZbmblnMQNfrH0PVUpFVzrlCOt1//YRB2xLtzIixwJjrcAqDTPDe61S6n2qV/n+61Lde1GlP2HOa9tby/7PAJuBAdosQnIbDfjMg/A5kKyUGokZAPqHPGZhBj1DtdZx1p9YrXUU1NmXGtQXKtkFXFHpunFa63Ct9TdBHNuQa9f22Taqr2ut39JaD9NaJwJ3Y/678J21eSTwupXpd2utF2IWMhpiZf73cXD/rbZvW3NL+1Xa7n89HPNLg3mYw2x3aXO+7HeYw2SFEKJBpLiLEKI9S8esguf3BnCL9TC7ArPKpQv4pob9o63t2ZiZkhrLw1fjDeAapdRizCFwN1faFoI55y0TcCulTsIcevZLPc4PgFLqFMxgYivmsDAPZmGLA/cbhDk/cDngxgyKJmMWmAGzyMfflblW3CLgdMzAdZV1vB2zGIwDsCmlwgCPNWT2wGslYD7sbsMsZPIPzCGR/nZ9hzkU1H/tVMyHcbTWW5RSG4C7lVJ3YM6VG445Hw/gZWChUuq/mEHWHZgFScCshlh5SO3j1j73We06D7Mwx05riOH9mAU5/O1eaLXh4gPvCbNvJCqlYrXW/uF4rwF3KKW+wwwc7mJ/5rK6/aOBAqDI+jyuxOwDTUprXaHMokSPYFaH/Nx63WsVE/mnUuqvWusMpVQPYJjW+rM6+tKBvxv19Sxwn1Jqg9Z6ozUEeJq2CpnUIR3oac3FPagQjlLKhjmn9g3MQjfjgKuwKl9Wo1F9XSk1BrMwVALmfNUPrEwgmH37T0qp/2F+tudZ5/rd2v4yZp9ZhzmP8nLMOb7+dj2ilJoFLMbsTz9VOrffHcBCrfVeqyiOUkp1wawSuq3mt1EIIWonGT8hRHv2N8yHrDyl1A1aaw2cj1ldMwtzeNSplR4mq+yP+ZC2AzNT9StmFcVgPY85b+8nzOFYH2MGXB5rbtVczAfVXMzM4gcNvMcBmPOOijBLxz+ttV5WzX4G5hzFDMwH0muA2Vrr7wGsuYMzMOcO5WNWyTxNa51lHX8BZrboGcy5iKXWPQKglCpSSvnnKCZZ91uMWbRlgdb635Xa8mfMLMluzPf2UMzhc35nA2Mx35sHgTOtOXRorT/FLGayDLPgyA7MrIs/Y5Xm/2O1sdi6N4AhwDdKqWLMh3yN+eDt18t6/SDWw/drwDarf3THXApiHeZn/DPm3MX5tex/A+ZnXWi9d3UOSW2EVzEz1W9ac+r8bsYMQtZYw02/YP+akbX1pQN/N+pFa/0uZgXU/1nX/QUzqA/GUsysV5pSKquGfU7HDFgLMYO5J6m0hEjl/tnYvo75hUIeZv/JpWofegizQMsGa5/rgFla6zxr+91WO3cAXwGPWH0aq4/PwvxCIhezcM7Zlc7t/wJnGuZcVrTW+zB/RzZi/ptyaw3vjxBC1Mnw+Ro7ukMIIYSV1XtWa92nzp1Fi7MKdfwIDK8uiymEEEJ0dBL4CSFEA1jzcKZiZv26YM7Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1080x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df['Close']\n",
|
||||
"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
|
||||
}
|
||||
+509
@@ -0,0 +1,509 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip, batch_size):\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.action_size = 3\n",
|
||||
" self.batch_size = batch_size\n",
|
||||
" self.memory = deque(maxlen = 1000)\n",
|
||||
" self.inventory = []\n",
|
||||
"\n",
|
||||
" self.gamma = 0.95\n",
|
||||
" self.epsilon = 0.5\n",
|
||||
" self.epsilon_min = 0.01\n",
|
||||
" self.epsilon_decay = 0.999\n",
|
||||
"\n",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.X = tf.placeholder(tf.float32, [None, self.state_size])\n",
|
||||
" self.Y = tf.placeholder(tf.float32, [None, self.action_size])\n",
|
||||
" feed = tf.layers.dense(self.X, 512, activation = tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(feed,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, self.action_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.GradientDescentOptimizer(1e-5).minimize(\n",
|
||||
" self.cost\n",
|
||||
" )\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
"\n",
|
||||
" def act(self, state):\n",
|
||||
" if random.random() <= self.epsilon:\n",
|
||||
" return random.randrange(self.action_size)\n",
|
||||
" return np.argmax(\n",
|
||||
" self.sess.run(self.logits, feed_dict = {self.X: state})[0]\n",
|
||||
" )\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 replay(self, batch_size):\n",
|
||||
" mini_batch = []\n",
|
||||
" l = len(self.memory)\n",
|
||||
" for i in range(l - batch_size, l):\n",
|
||||
" mini_batch.append(self.memory[i])\n",
|
||||
" replay_size = len(mini_batch)\n",
|
||||
" X = np.empty((replay_size, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.action_size))\n",
|
||||
" states = np.array([a[0][0] for a in mini_batch])\n",
|
||||
" new_states = np.array([a[3][0] for a in mini_batch])\n",
|
||||
" Q = self.sess.run(self.logits, feed_dict = {self.X: states})\n",
|
||||
" Q_new = self.sess.run(self.logits, feed_dict = {self.X: new_states})\n",
|
||||
" for i in range(len(mini_batch)):\n",
|
||||
" state, action, reward, next_state, done = mini_batch[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action] = reward\n",
|
||||
" if not done:\n",
|
||||
" target[action] += self.gamma * np.amax(Q_new[i])\n",
|
||||
" X[i] = state\n",
|
||||
" Y[i] = target\n",
|
||||
" cost, _ = self.sess.run(\n",
|
||||
" [self.cost, self.optimizer], feed_dict = {self.X: X, self.Y: Y}\n",
|
||||
" )\n",
|
||||
" if self.epsilon > self.epsilon_min:\n",
|
||||
" self.epsilon *= self.epsilon_decay\n",
|
||||
" return cost\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(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 initial_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
||||
" \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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\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] and t < (len(self.trend) - self.half_window):\n",
|
||||
" inventory.append(self.trend[t])\n",
|
||||
" starting_money -= self.trend[t]\n",
|
||||
" \n",
|
||||
" elif action == 2 and len(inventory) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" self.memory.append((state, action, invest, \n",
|
||||
" next_state, starting_money < initial_money))\n",
|
||||
" state = next_state\n",
|
||||
" batch_size = min(self.batch_size, len(self.memory))\n",
|
||||
" cost = self.replay(batch_size)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From <ipython-input-3-28bed545c0f8>:30: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"epoch: 10, total rewards: 231.100222.3, cost: 0.499693, total money: 10231.100222\n",
|
||||
"epoch: 20, total rewards: 195.875063.3, cost: 0.324152, total money: 10195.875063\n",
|
||||
"epoch: 30, total rewards: 219.615054.3, cost: 0.237771, total money: 10219.615054\n",
|
||||
"epoch: 40, total rewards: 56.505131.3, cost: 0.183305, total money: 10056.505131\n",
|
||||
"epoch: 50, total rewards: 190.745120.3, cost: 0.129967, total money: 10190.745120\n",
|
||||
"epoch: 60, total rewards: 165.275088.3, cost: 0.134246, total money: 10165.275088\n",
|
||||
"epoch: 70, total rewards: 201.795107.3, cost: 0.075016, total money: 10201.795107\n",
|
||||
"epoch: 80, total rewards: 187.545045.3, cost: 0.062454, total money: 10187.545045\n",
|
||||
"epoch: 90, total rewards: 206.835023.3, cost: 0.050687, total money: 10206.835023\n",
|
||||
"epoch: 100, total rewards: 199.895082.3, cost: 0.041359, total money: 10199.895082\n",
|
||||
"epoch: 110, total rewards: 184.405092.3, cost: 0.035289, total money: 10184.405092\n",
|
||||
"epoch: 120, total rewards: 242.405092.3, cost: 0.047248, total money: 10242.405092\n",
|
||||
"epoch: 130, total rewards: 148.405032.3, cost: 0.050786, total money: 10148.405032\n",
|
||||
"epoch: 140, total rewards: 225.724978.3, cost: 0.021171, total money: 10225.724978\n",
|
||||
"epoch: 150, total rewards: 168.344972.3, cost: 0.018388, total money: 10168.344972\n",
|
||||
"epoch: 160, total rewards: 230.095034.3, cost: 0.199324, total money: 10230.095034\n",
|
||||
"epoch: 170, total rewards: 206.275026.3, cost: 0.044696, total money: 10206.275026\n",
|
||||
"epoch: 180, total rewards: 364.895023.3, cost: 0.016494, total money: 10364.895023\n",
|
||||
"epoch: 190, total rewards: 220.664980.3, cost: 0.014381, total money: 10220.664980\n",
|
||||
"epoch: 200, total rewards: 175.284975.3, cost: 0.010883, total money: 10175.284975\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip, \n",
|
||||
" batch_size = batch_size)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
|
||||
"day 8: buy 1 unit at price 736.080017, total balance 8509.899963\n",
|
||||
"day 9, sell 1 unit at price 758.489990, investment 0.592818 %, total balance 9268.389953,\n",
|
||||
"day 11: buy 1 unit at price 771.229980, total balance 8497.159973\n",
|
||||
"day 12, sell 1 unit at price 760.539978, investment 3.323003 %, total balance 9257.699951,\n",
|
||||
"day 14, sell 1 unit at price 768.270020, investment -0.383797 %, total balance 10025.969971,\n",
|
||||
"day 22: buy 1 unit at price 762.520020, total balance 9263.449951\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 1.137017 %, total balance 10034.639953,\n",
|
||||
"day 28: buy 1 unit at price 796.099976, total balance 9238.539977\n",
|
||||
"day 29: buy 1 unit at price 797.070007, total balance 8441.469970\n",
|
||||
"day 31, sell 1 unit at price 790.799988, investment -0.665744 %, total balance 9232.269958,\n",
|
||||
"day 32: buy 1 unit at price 794.200012, total balance 8438.069946\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 7641.649963\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment -0.692539 %, total balance 8433.199951,\n",
|
||||
"day 39, sell 1 unit at price 782.789978, investment -1.436670 %, total balance 9215.989929,\n",
|
||||
"day 41, sell 1 unit at price 786.140015, investment -1.290772 %, total balance 10002.129944,\n",
|
||||
"day 48: buy 1 unit at price 806.359985, total balance 9195.769959\n",
|
||||
"day 49: buy 1 unit at price 807.880005, total balance 8387.889954\n",
|
||||
"day 50, sell 1 unit at price 804.609985, investment -0.217025 %, total balance 9192.499939,\n",
|
||||
"day 52: buy 1 unit at price 802.174988, total balance 8390.324951\n",
|
||||
"day 53, sell 1 unit at price 805.020020, investment -0.354011 %, total balance 9195.344971,\n",
|
||||
"day 56, sell 1 unit at price 835.669983, investment 4.175522 %, total balance 10031.014954,\n",
|
||||
"day 67: buy 1 unit at price 809.559998, total balance 9221.454956\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 8407.784973\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 1.195710 %, total balance 9227.024963,\n",
|
||||
"day 71: buy 1 unit at price 818.979980, total balance 8408.044983\n",
|
||||
"day 72, sell 1 unit at price 824.159973, investment 1.289219 %, total balance 9232.204956,\n",
|
||||
"day 76: buy 1 unit at price 831.330017, total balance 8400.874939\n",
|
||||
"day 77, sell 1 unit at price 828.640015, investment 1.179520 %, total balance 9229.514954,\n",
|
||||
"day 78: buy 1 unit at price 829.280029, total balance 8400.234925\n",
|
||||
"day 79, sell 1 unit at price 823.210022, investment -0.976747 %, total balance 9223.444947,\n",
|
||||
"day 80: buy 1 unit at price 835.239990, total balance 8388.204957\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment 0.162789 %, total balance 9218.834962,\n",
|
||||
"day 83, sell 1 unit at price 827.780029, investment -0.893152 %, total balance 10046.614991,\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 9201.075013\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 0.009463 %, total balance 10046.695008,\n",
|
||||
"day 91: buy 1 unit at price 848.780029, total balance 9197.914979\n",
|
||||
"day 92: buy 1 unit at price 852.119995, total balance 8345.794984\n",
|
||||
"day 93: buy 1 unit at price 848.400024, total balance 7497.394960\n",
|
||||
"day 96, sell 1 unit at price 817.580017, investment -3.675865 %, total balance 8314.974977,\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 7500.544984\n",
|
||||
"day 100, sell 1 unit at price 831.409973, investment -2.430411 %, total balance 8331.954957,\n",
|
||||
"day 101, sell 1 unit at price 831.500000, investment -1.991988 %, total balance 9163.454957,\n",
|
||||
"day 103, sell 1 unit at price 838.549988, investment 2.961580 %, total balance 10002.004945,\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 9167.434938\n",
|
||||
"day 105: buy 1 unit at price 831.409973, total balance 8336.024965\n",
|
||||
"day 106, sell 1 unit at price 827.880005, investment -0.801611 %, total balance 9163.904970,\n",
|
||||
"day 107: buy 1 unit at price 824.669983, total balance 8339.234987\n",
|
||||
"day 108: buy 1 unit at price 824.729980, total balance 7514.505007\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 6690.185000\n",
|
||||
"day 111: buy 1 unit at price 823.559998, total balance 5866.625002\n",
|
||||
"day 112, sell 1 unit at price 837.169983, investment 0.692800 %, total balance 6703.794985,\n",
|
||||
"day 113, sell 1 unit at price 836.820007, investment 1.473320 %, total balance 7540.614992,\n",
|
||||
"day 114, sell 1 unit at price 838.210022, investment 1.634479 %, total balance 8378.825014,\n",
|
||||
"day 115, sell 1 unit at price 841.650024, investment 2.102341 %, total balance 9220.475038,\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 2.383555 %, total balance 10063.665040,\n",
|
||||
"day 122: buy 1 unit at price 912.570007, total balance 9151.095033\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 0.424077 %, total balance 10067.535035,\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 9135.875062\n",
|
||||
"day 126, sell 1 unit at price 927.130005, investment -0.486225 %, total balance 10063.005067,\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 9096.055055\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10071.655031,\n",
|
||||
"day 146: buy 1 unit at price 983.679993, total balance 9087.975038\n",
|
||||
"day 148: buy 1 unit at price 980.940002, total balance 8107.035036\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment -0.027450 %, total balance 9090.445009,\n",
|
||||
"day 151, sell 1 unit at price 942.900024, investment -3.877911 %, total balance 10033.345033,\n",
|
||||
"day 155: buy 1 unit at price 939.780029, total balance 9093.565004\n",
|
||||
"day 157, sell 1 unit at price 950.630005, investment 1.154523 %, total balance 10044.195009,\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 9078.604982\n",
|
||||
"day 161, sell 1 unit at price 952.270020, investment -1.379468 %, total balance 10030.875002,\n",
|
||||
"day 164: buy 1 unit at price 917.789978, total balance 9113.085024\n",
|
||||
"day 166, sell 1 unit at price 898.700012, investment -2.079993 %, total balance 10011.785036,\n",
|
||||
"day 168: buy 1 unit at price 906.690002, total balance 9105.095034\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 8175.005007\n",
|
||||
"day 172, sell 1 unit at price 943.830017, investment 4.096220 %, total balance 9118.835024,\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 1.835300 %, total balance 10065.994997,\n",
|
||||
"day 176: buy 1 unit at price 965.400024, total balance 9100.594973\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 0.778947 %, total balance 10073.514956,\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 9093.174929\n",
|
||||
"day 181, sell 1 unit at price 950.700012, investment -3.023442 %, total balance 10043.874941,\n",
|
||||
"day 194: buy 1 unit at price 914.390015, total balance 9129.484926\n",
|
||||
"day 195, sell 1 unit at price 922.669983, investment 0.905518 %, total balance 10052.154909,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9125.194887\n",
|
||||
"day 199: buy 1 unit at price 910.669983, total balance 8214.524904\n",
|
||||
"day 201, sell 1 unit at price 924.690002, investment -0.244889 %, total balance 9139.214906,\n",
|
||||
"day 202, sell 1 unit at price 927.000000, investment 1.793187 %, total balance 10066.214906,\n",
|
||||
"day 208: buy 1 unit at price 939.330017, total balance 9126.884889\n",
|
||||
"day 211, sell 1 unit at price 927.809998, investment -1.226408 %, total balance 10054.694887,\n",
|
||||
"day 214: buy 1 unit at price 929.080017, total balance 9125.614870\n",
|
||||
"day 216, sell 1 unit at price 935.090027, investment 0.646878 %, total balance 10060.704897,\n",
|
||||
"day 219: buy 1 unit at price 915.000000, total balance 9145.704897\n",
|
||||
"day 221: buy 1 unit at price 931.580017, total balance 8214.124880\n",
|
||||
"day 222, sell 1 unit at price 932.450012, investment 1.907105 %, total balance 9146.574892,\n",
|
||||
"day 223, sell 1 unit at price 928.530029, investment -0.327399 %, total balance 10075.104921,\n",
|
||||
"day 224: buy 1 unit at price 920.969971, total balance 9154.134950\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 8209.644960\n",
|
||||
"day 227: buy 1 unit at price 949.500000, total balance 7260.144960\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 4.141287 %, total balance 8219.254945,\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 0.929605 %, total balance 9172.524965,\n",
|
||||
"day 230: buy 1 unit at price 957.789978, total balance 8214.734987\n",
|
||||
"day 231: buy 1 unit at price 951.679993, total balance 7263.054994\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 2.154821 %, total balance 8233.015016,\n",
|
||||
"day 233, sell 1 unit at price 978.890015, investment 2.202992 %, total balance 9211.905031,\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment 2.660559 %, total balance 10188.905031,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+495
@@ -0,0 +1,495 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Model:\n",
|
||||
" def __init__(self, input_size, output_size, layer_size, learning_rate):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" feed = tf.layers.dense(self.X, layer_size, activation = tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(feed,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 500\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" self.trainable = tf.trainable_variables()\n",
|
||||
" \n",
|
||||
" def _assign(self):\n",
|
||||
" for i in range(len(self.trainable)//2):\n",
|
||||
" assign_op = self.trainable[i+len(self.trainable)//2].assign(self.trainable[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
"\n",
|
||||
" def _memorize(self, state, action, reward, new_state, done):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" Q = self.predict(states)\n",
|
||||
" Q_new = self.predict(new_states)\n",
|
||||
" Q_new_negative = self.sess.run(self.model_negative.logits, feed_dict={self.model_negative.X:new_states})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, done_r = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not done_r:\n",
|
||||
" target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" return X, Y\n",
|
||||
"\n",
|
||||
" def predict(self, inputs):\n",
|
||||
" return self.sess.run(self.model.logits, feed_dict={self.model.X:inputs})\n",
|
||||
" \n",
|
||||
" def get_predicted_action(self, sequence):\n",
|
||||
" prediction = self.predict(np.array(sequence))[0]\n",
|
||||
" return np.argmax(prediction)\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign()\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" state = next_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" X, Y = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n",
|
||||
" feed_dict={self.model.X: X, self.model.Y:Y})\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From <ipython-input-3-42f2d1e26a9d>:12: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"epoch: 10, total rewards: 1486.684997.3, cost: 0.694152, total money: 10514.124999\n",
|
||||
"epoch: 20, total rewards: 313.279660.3, cost: 0.878157, total money: 8354.909665\n",
|
||||
"epoch: 30, total rewards: 752.595089.3, cost: 0.320037, total money: 10752.595089\n",
|
||||
"epoch: 40, total rewards: 1159.299987.3, cost: 0.318166, total money: 10186.739989\n",
|
||||
"epoch: 50, total rewards: 993.220279.3, cost: 0.391151, total money: 4149.310245\n",
|
||||
"epoch: 60, total rewards: 1616.499880.3, cost: 0.307440, total money: 9630.939883\n",
|
||||
"epoch: 70, total rewards: 941.484560.3, cost: 0.332979, total money: 6969.054506\n",
|
||||
"epoch: 80, total rewards: 904.899903.3, cost: 0.718111, total money: 1132.559876\n",
|
||||
"epoch: 90, total rewards: 346.619873.3, cost: 0.482044, total money: 542.599852\n",
|
||||
"epoch: 100, total rewards: 141.554626.3, cost: 0.238426, total money: 6115.974608\n",
|
||||
"epoch: 110, total rewards: -159.529845.3, cost: 0.202412, total money: 8852.270143\n",
|
||||
"epoch: 120, total rewards: -37.579779.3, cost: 0.433529, total money: 8945.780206\n",
|
||||
"epoch: 130, total rewards: 1049.544800.3, cost: 0.408910, total money: 8099.664795\n",
|
||||
"epoch: 140, total rewards: 59.114809.3, cost: 0.028664, total money: 7098.904848\n",
|
||||
"epoch: 150, total rewards: 96.424866.3, cost: 0.070552, total money: 9079.784851\n",
|
||||
"epoch: 160, total rewards: 74.179754.3, cost: 0.044092, total money: 10074.179754\n",
|
||||
"epoch: 170, total rewards: 80.999883.3, cost: 0.018813, total money: 8047.249883\n",
|
||||
"epoch: 180, total rewards: 62.700011.3, cost: 0.083292, total money: 10062.700011\n",
|
||||
"epoch: 190, total rewards: 70.424991.3, cost: 0.013884, total money: 9053.315006\n",
|
||||
"epoch: 200, total rewards: 10.620115.3, cost: 0.030838, total money: 10010.620115\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 1: buy 1 unit at price 762.130005, total balance 9237.869995\n",
|
||||
"day 2, sell 1 unit at price 762.020020, investment -0.014431 %, total balance 9999.890015,\n",
|
||||
"day 11: buy 1 unit at price 771.229980, total balance 9228.660035\n",
|
||||
"day 12: buy 1 unit at price 760.539978, total balance 8468.120057\n",
|
||||
"day 13, sell 1 unit at price 769.200012, investment -0.263212 %, total balance 9237.320069,\n",
|
||||
"day 15, sell 1 unit at price 760.989990, investment 0.059170 %, total balance 9998.310059,\n",
|
||||
"day 34: buy 1 unit at price 794.559998, total balance 9203.750061\n",
|
||||
"day 35, sell 1 unit at price 791.260010, investment -0.415323 %, total balance 9995.010071,\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 9205.100098\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 9996.650086,\n",
|
||||
"day 38: buy 1 unit at price 785.049988, total balance 9211.600098\n",
|
||||
"day 40, sell 1 unit at price 771.820007, investment -1.685241 %, total balance 9983.420105,\n",
|
||||
"day 54: buy 1 unit at price 819.309998, total balance 9164.110107\n",
|
||||
"day 55, sell 1 unit at price 823.869995, investment 0.556566 %, total balance 9987.980102,\n",
|
||||
"day 62: buy 1 unit at price 798.530029, total balance 9189.450073\n",
|
||||
"day 64, sell 1 unit at price 801.340027, investment 0.351896 %, total balance 9990.790100,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 9177.120117\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 0.684554 %, total balance 9996.360107,\n",
|
||||
"day 72: buy 1 unit at price 824.159973, total balance 9172.200134\n",
|
||||
"day 73, sell 1 unit at price 828.070007, investment 0.474427 %, total balance 10000.270141,\n",
|
||||
"day 74: buy 1 unit at price 831.659973, total balance 9168.610168\n",
|
||||
"day 75, sell 1 unit at price 830.760010, investment -0.108213 %, total balance 9999.370178,\n",
|
||||
"day 79: buy 1 unit at price 823.210022, total balance 9176.160156\n",
|
||||
"day 80, sell 1 unit at price 835.239990, investment 1.461349 %, total balance 10011.400146,\n",
|
||||
"day 90: buy 1 unit at price 847.200012, total balance 9164.200134\n",
|
||||
"day 91, sell 1 unit at price 848.780029, investment 0.186499 %, total balance 10012.980163,\n",
|
||||
"day 93: buy 1 unit at price 848.400024, total balance 9164.580139\n",
|
||||
"day 94: buy 1 unit at price 830.460022, total balance 8334.120117\n",
|
||||
"day 95, sell 1 unit at price 829.590027, investment -2.217114 %, total balance 9163.710144,\n",
|
||||
"day 96, sell 1 unit at price 817.580017, investment -1.550948 %, total balance 9981.290161,\n",
|
||||
"day 100: buy 1 unit at price 831.409973, total balance 9149.880188\n",
|
||||
"day 101, sell 1 unit at price 831.500000, investment 0.010828 %, total balance 9981.380188,\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 9146.810181\n",
|
||||
"day 106: buy 1 unit at price 827.880005, total balance 8318.930176\n",
|
||||
"day 107, sell 1 unit at price 824.669983, investment -1.186242 %, total balance 9143.600159,\n",
|
||||
"day 108, sell 1 unit at price 824.729980, investment -0.380493 %, total balance 9968.330139,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 9144.010132\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 9967.570130,\n",
|
||||
"day 115: buy 1 unit at price 841.650024, total balance 9125.920106\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 0.182971 %, total balance 9969.110108,\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 9037.450135\n",
|
||||
"day 126, sell 1 unit at price 927.130005, investment -0.486225 %, total balance 9964.580140,\n",
|
||||
"day 127: buy 1 unit at price 934.299988, total balance 9030.280152\n",
|
||||
"day 128, sell 1 unit at price 932.169983, investment -0.227979 %, total balance 9962.450135,\n",
|
||||
"day 141: buy 1 unit at price 971.469971, total balance 8990.980164\n",
|
||||
"day 142, sell 1 unit at price 975.880005, investment 0.453955 %, total balance 9966.860169,\n",
|
||||
"day 152: buy 1 unit at price 953.400024, total balance 9013.460145\n",
|
||||
"day 153, sell 1 unit at price 950.760010, investment -0.276905 %, total balance 9964.220155,\n",
|
||||
"day 156: buy 1 unit at price 957.369995, total balance 9006.850160\n",
|
||||
"day 157, sell 1 unit at price 950.630005, investment -0.704011 %, total balance 9957.480165,\n",
|
||||
"day 166: buy 1 unit at price 898.700012, total balance 9058.780153\n",
|
||||
"day 167, sell 1 unit at price 911.710022, investment 1.447648 %, total balance 9970.490175,\n",
|
||||
"day 172: buy 1 unit at price 943.830017, total balance 9026.660158\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 0.352813 %, total balance 9973.820131,\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 9043.320131\n",
|
||||
"day 186: buy 1 unit at price 930.830017, total balance 8112.490114\n",
|
||||
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 9042.880129,\n",
|
||||
"day 188, sell 1 unit at price 923.650024, investment -0.771354 %, total balance 9966.530153,\n",
|
||||
"day 193: buy 1 unit at price 907.239990, total balance 9059.290163\n",
|
||||
"day 194, sell 1 unit at price 914.390015, investment 0.788107 %, total balance 9973.680178,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9046.720156\n",
|
||||
"day 199, sell 1 unit at price 910.669983, investment -1.757362 %, total balance 9957.390139,\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 9029.580141\n",
|
||||
"day 212, sell 1 unit at price 935.950012, investment 0.877336 %, total balance 9965.530153,\n",
|
||||
"day 213: buy 1 unit at price 926.500000, total balance 9039.030153\n",
|
||||
"day 214, sell 1 unit at price 929.080017, investment 0.278469 %, total balance 9968.110170,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+448
@@ -0,0 +1,448 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, self.OUTPUT_SIZE))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * self.LAYER_SIZE))\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" tensor_action, tensor_validation = tf.split(self.rnn[:,-1],2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = self.LEARNING_RATE).minimize(self.cost)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.logits, feed_dict={self.X:states, self.hidden_layer:init_values})\n",
|
||||
" Q_new = self.sess.run(self.logits, feed_dict={self.X:new_states, self.hidden_layer:init_values})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, 4, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not dead_r:\n",
|
||||
" target[action_r] += self.GAMMA * np.amax(Q_new[i])\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" INIT_VAL[i] = rnn_memory\n",
|
||||
" return X, Y, INIT_VAL\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action, last_state = self.sess.run([self.logits,self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.logits,\n",
|
||||
" self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" X, Y, INIT_VAL = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], \n",
|
||||
" feed_dict={self.X: X, self.Y:Y,\n",
|
||||
" self.hidden_layer: INIT_VAL})\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" \n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f2873435940>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:From <ipython-input-3-976c717fc00c>:35: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"epoch: 10, total rewards: 1303.755127.3, cost: 0.204159, total money: 2622.175109\n",
|
||||
"epoch: 20, total rewards: 1332.510133.3, cost: 2.512769, total money: 11332.510133\n",
|
||||
"epoch: 30, total rewards: 167.034789.3, cost: 0.204751, total money: 10167.034789\n",
|
||||
"epoch: 40, total rewards: 885.269897.3, cost: 0.095390, total money: 8848.889892\n",
|
||||
"epoch: 50, total rewards: 312.624996.3, cost: 0.415782, total money: 10312.624996\n",
|
||||
"epoch: 60, total rewards: 220.209960.3, cost: 0.119438, total money: 10220.209960\n",
|
||||
"epoch: 70, total rewards: 407.794859.3, cost: 0.983801, total money: 8417.984861\n",
|
||||
"epoch: 80, total rewards: 200.149718.3, cost: 0.235913, total money: 9226.819701\n",
|
||||
"epoch: 90, total rewards: 87.564821.3, cost: 0.034903, total money: 8097.894838\n",
|
||||
"epoch: 100, total rewards: 1056.600041.3, cost: 0.286240, total money: 11056.600041\n",
|
||||
"epoch: 110, total rewards: 537.204957.3, cost: 0.140037, total money: 7610.014955\n",
|
||||
"epoch: 120, total rewards: 263.944828.3, cost: 0.535866, total money: 9247.304813\n",
|
||||
"epoch: 130, total rewards: 387.030092.3, cost: 0.352989, total money: 8396.590090\n",
|
||||
"epoch: 140, total rewards: 207.069887.3, cost: 0.474047, total money: 10207.069887\n",
|
||||
"epoch: 150, total rewards: -119.230104.3, cost: 0.301262, total money: 9880.769896\n",
|
||||
"epoch: 160, total rewards: 21.299804.3, cost: 0.709494, total money: 10021.299804\n",
|
||||
"epoch: 170, total rewards: 241.145077.3, cost: 0.486697, total money: 10241.145077\n",
|
||||
"epoch: 180, total rewards: 5.329770.3, cost: 0.447255, total money: 7042.329770\n",
|
||||
"epoch: 190, total rewards: 126.395198.3, cost: 0.240739, total money: 9107.125178\n",
|
||||
"epoch: 200, total rewards: 91.499876.3, cost: 0.259028, total money: 8055.119871\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 53: buy 1 unit at price 805.020020, total balance 9194.979980\n",
|
||||
"day 54, sell 1 unit at price 819.309998, investment 1.775108 %, total balance 10014.289978,\n",
|
||||
"day 64: buy 1 unit at price 801.340027, total balance 9212.949951\n",
|
||||
"day 68, sell 1 unit at price 813.669983, investment 1.538667 %, total balance 10026.619934,\n",
|
||||
"day 79: buy 1 unit at price 823.210022, total balance 9203.409912\n",
|
||||
"day 82: buy 1 unit at price 829.080017, total balance 8374.329895\n",
|
||||
"day 84, sell 1 unit at price 831.909973, investment 1.056832 %, total balance 9206.239868,\n",
|
||||
"day 86, sell 1 unit at price 838.679993, investment 1.157907 %, total balance 10044.919861,\n",
|
||||
"day 111: buy 1 unit at price 823.559998, total balance 9221.359863\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 2.383555 %, total balance 10064.549865,\n",
|
||||
"day 167: buy 1 unit at price 911.710022, total balance 9152.839843\n",
|
||||
"day 169, sell 1 unit at price 918.590027, investment 0.754626 %, total balance 10071.429870,\n",
|
||||
"day 182: buy 1 unit at price 947.799988, total balance 9123.629882\n",
|
||||
"day 183, sell 1 unit at price 934.090027, investment -1.446504 %, total balance 10057.719909,\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 9127.219909\n",
|
||||
"day 187: buy 1 unit at price 930.390015, total balance 8196.829894\n",
|
||||
"day 188, sell 1 unit at price 923.650024, investment -0.736161 %, total balance 9120.479918,\n",
|
||||
"day 190, sell 1 unit at price 929.359985, investment -0.110709 %, total balance 10049.839903,\n",
|
||||
"day 206: buy 1 unit at price 921.289978, total balance 9128.549925\n",
|
||||
"day 207, sell 1 unit at price 929.570007, investment 0.898743 %, total balance 10058.119932,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4VFX6wPHvtPRe6FWRI6ACIiIiRcXey2Jvq+KuunZd29r7rrv+1oa9YceCirKoICACilQVDj0JkN7bzGRm7u+Pe2dIQhLSE5L38zw+knvPPffcyYHnvvOeYjMMAyGEEEIIIYQQXZe9oxsghBBCCCGEEKJtSeAnhBBCCCGEEF2cBH5CCCGEEEII0cVJ4CeEEEIIIYQQXZwEfkIIIYQQQgjRxUngJ4QQQgghhBBdnAR+QgjRSEqpN5VSj7RBvROVUrq16xUdSyl1uVLqx3rODVBKlSmlHO3dLiGEEN2Ts6MbIIQQrUUptR24Smv9XVuUbyta68WAau16refrCfitQz9prY+3ztmAh4ErgBhgFXCd1vr3eup6GDgTGAY8orV+oNq53sBLwGFAb2Cw1np7tfN9gReAiUCFdf2MaudPAx4HBgFrMX8nf1jnzgceBHoBHuAb4G9a6xKlVLhV71QgCdgC3KW1/qaRn8+bwA6t9b1tUb4hWut0zM+9QyilpgAztdb9Ouj+P1j3f7WBMqOA1zD73HrgSq316gbqOwLwWYd2aq1VtfN/A24BkoGNwE1a6x+tc0cD9wGHAoVa60G16m6o79uAu4FrgATga2C61rrEOl9v31dKxQMfAeOAOcClWmu/de5lYK7W+tP6Ph8hhGgqyfgJIUTXdprWOsb67/hqx/8E/BnzhTQJWAq800A9m4E7MF9QawsAc4Fz6rl2JrANMwg9BXjMetlGKXUA8C7wF8wX5y+BL5RSwS8mlwATtNbxwH6YX1gGs65OIAOYDMQD9wIfKaUGNfAcYh+glAoDZmP2nUTgLWC2dbw+11fr69WDvnHAE8C5mP3kNeCzatnWcuB14PZ66m2o718KXAJMAPoAkcCz1c7X2/cxg8VV1rlBwFlWe8cDfSToE0K0Nsn4CSG6BKXUO8AA4EullB94SGv9lFLqdMxsUl9gNfBXrfX6Bsp/jBkMRQJrrPJ1ZsFq3d8BPAVcBpQCT2O+ALq01j6l1BWYL4/9gFzgSa31S9a1U6iWfbEydc9hvlQOxAyqLtNau5VSKcCbwFGYAdfvwGStdaCJH9lg4Eet9VbrnjOBm+srrLV+yyp3UR3nsoEXqgVrIUqpGGAKME1rXQWsUUrNwgw6FwAnAIurZV+exMy+TAa+11pn1KrSDwyx7lsOPFDt3FdKqW3AGGB7Qw+vlJoOXAQYSqmbgAVa69OUUsOAF4FRwE7MDOIXDZS/E7ga6IEZhN6jtf6soXtb9x+EGRAE+8cPwGLgGOAQzED8Qq11nlLqG2CO1vq5atevAR7UWn+qlDoQs6+Nwexb/9Baf2SVOxn4F9AfKAH+Yz3fN0C4UqrMqnIoMB0YgZlZPcP6DM+x/rvZOn6l1nqeVXc88G/gZMy++AZwv9bar5S6HLgKWAZcCRQB12qtv1FKPYr5d+wIpdQzwJta6+trfURTMN9RntFaG8B/lVK3WZ/P3L19vrUMAn7XWv9qtfttzCxcDyBTa/0z8LNSampdFzfU94HTgNeC/dTqv/OVUn/F/HJ9CvX3/cHA51prj1JqMbCf9e/If4ALm/iMQgixV5LxE0J0CVrrS4B0dme4nlJKDQXeB24CUjGHYX2plAqrq7xV1TfAAZgvhSsxs1GNcTVwEmbAcCjm0LDqcoBTgTjM4ZX/UUod2kB904ATMV8ODwEut47fCuywnqcn5jAzo4F63lVK5Sql5imlRlY7/gGwv1JqqFLKhRmwNvWFujFstf4f/PNBdZQJ/rnGeaXUUUqpYsyA+hzgmbpupJTqiRnA7DVQ11q/jPm7fcr6/Z9mfQ5fAvMwf/9/w/z8VF3lraq2YAYx8ZhDUmdaQ1+b40LMvtEDCANus46/D1xQ7TmHY34hMEcpFQ18C7xnXXc+ZhA+3Cr+GnCN1joW8zOdbwXMJwG7qmXIdlnlT8PM/CZiZqP+h/mu0Bd4CHNIb9CbmEMrhwCjgeMxg72gcYAGUjC/FHlNKWXTWt+DGeQGM3S1gz4wA9C1VtAXtNY6Xp/HlVJ5Sqkl1pcpQd8ADqXUOCuw+jPml0BZDdTVFLX7bzjmvyF76/u/AVOVUpGYfeh34Abgm+AXMkII0Zok8BNCdGXnYWZKvrW+cf8XZibvyPou0Fq/rrUu1Vp7MLNJI63Mxt5MA/5Pa71Da12IObSser1ztNZbtNaG1nohZnAxsYH6/qu13qW1LsAMRkZZx6sw59EN1FpXaa0X13o5ru4izGzHQMwMw/+UUgnWuUzgR8wX80rMoZ/1ZvyaS2tdijlc8x9KqQgr2D0HiLKKfAdMVkpNsYbx3Y0Z9ERVq+NHa6hnP+Cf1JHNs4K2d4G3tNYbmtncIzDn3T2htfZqrecDX1Et6Krj+T62fk8BrfWHwCbg8Gbe/w2t9UatdSXm3K/g7/wzYJRSaqD180XAp1YfPRXYrrV+Q2vt01qvAj7B/H2C2V+GK6XitNaFWuuVe2nDYq31/7TWPuBjzC8YnrD+/nwADFJKJVhB9smYc+XKtdY5mJmq86vVlaa1fsWat/YWZr/t2cjPIgYornWsGIitp/zfMYcC9wVexvyCZ3/rXCnmZ/IjZtbyfsx5eA19YdJYc4GrlFKDrH8n/m4dj2pE338N8wuD5ZiB8BrMYaPPKKVmKKUWqTZYTEoI0X3JUE8hRFfWB0gL/qC1DiilMjBfDvdgZQMexXxpTsUcvgZmxqL2S2hd96o+LLHGEEWl1EmYL5xDMb90iwLWNVBf9WxEhVU/mIHPA8A8pRTAy1rrJ6iD1npJtR8fV0pdhhlsfok5nHIs5hDALOBizCFqI7TWFQ20qzkuAp7H/Ey2Ys57GmG1cYPVrucwA4OZwB+YWc3az7NTKTUXMwAJZUuVUnbMLJUXqCt71Fh9gIxaw2bTqKe/WPe+FHPRkEHWoRjM/tIctX/nMWAGz0qpOZhB1ZOYgejVVrmBwDilVFG1a53snq95DubcxyeUUmuBO7XWSxtoQ3a1P1cCecEFR6yfsdrVB3ABmVY/BLNfV+/3oefRWldY5Rq7oE0ZZna8ujjMIG4PWuvl1X58Syl1AWZg+izmUNMrMPvcZszM5FdKqdHVMp3N9Trm36EfMD/3pzGzpsH+21Dfd2MOrwXAGmZ+t3WNHXO48zyl1Ila67bIxgshuhkJ/IQQXUntb/B3AQcHf7BW4OuPOXerrvIXYs5tmoqZVYoHCqk5VKs+mZgZqaD+1e4bjplxuBSYrbWuUkp93sh6a7CyCLcCtyqlDsIM1n7RWn/fiMuNavccBXyotQ6+oL5pzbcaDqxoarv20uY0zMwUAEqp94Cfq52fBcyyziVgvqj/Uk91TiCYyQn+Tl/DzCSdbGWmGquu/tJfKWWvFvwNwFwFco/yVgbuFeBYYKk1t201zfi9NsL7wP1KqUVABGYGF8yAYqHW+ri6LtJa/wKcYWVEr8fMJPav/SzNkIGZPUuxsoNNtbf7/47Zx23VMnOHYAZRja2/el//Smsd/D3OVUplYmb+ZzWhzXuw+sn91n8opY7H/Pdlp3W+wb5f7fiJgE1rPVcp9SKwQmttKKVWYD63BH5CiBaTwE8I0ZVkYw73CvoIuFMpdSywCLgR82X1p3rKx1rn8zEzco814d4fATdamZlydg/5AnPoYjjmwhs+K/t3POYcnyZRSp0KbMCcW1aMudjJHgu7KKUGYL7g/4KZPfgbZiYqmAX8BfiTUuoDq10XYWZwNtdzXxfgsOpyKqUigCq9e/n5COs8mIuGRFgZDawFU3ZgfrbTrGcfVq3uMZhzrpIwX+y/CA7XtBbUWKy1TrcCrUeB6kHui1ZdU60hkrXbbQBHa61/qOOxav/+l2Nm2u5QSj2NuVLjaZiZ0brKR2MGGLnWva6g5tzF1vQ1ZnbpIcyAPfg7/wozm3cJZiYUzECnDLOP/Akz6ClWSpWwu69kA8lKqXit9d6y2XvQWmcqpeYBTyul/mHdbzDQzxrKvDe1P8vafsDs2zcopWawO8M5v3ZB68uCccBCzDmH5wGTMP++g9nX71FKPYu5oM5UzMz7b9b1dsy/oy7AZvXlgNbaa52vt+8rpZIw50NuxeyH/8ZcKCpgXdtg37fKRGAODQ8GiNuAKcrcPmQC8N8GPichhGg0meMnhOhKHgfuVUoVKaVu01przCGMzwJ5mC/xpwVf6GqXB97GHNq3E3O44bIm3PsVzHl7azEXxfga8yXUb2XpbsAMDgsxM4tfNPMZD8CcF1eGufLjC1rrBXWUi8UMigoxn+dE4CStdb51/knMOUWrMVdcvBk4R2tdBGDNMZpRrb5XMIf6XQDcY/35kmrnK602gRmYVg/CTsB8MS7E3LbhRK11brXz/2e1QVtlrq52bjjwk1KqHDNo1cHzViB4DWagk6XMDdHLrGARpVR/zKGB9Q2pfQ1z/luRUupzq1+chrnwSR7myo+XVpszWLv8H5hD+5ZiBjIHszuwblXWfL5PMYOW96odL8UMJs7HzFhmYf5uw60ilwDbraDvL5gBPtYzvQ9stZ4nOJS4KS7FDJj+wPy9zcIcrtsY/wecq5QqVErtEdhYv4szrXsUYS7Icma1YOxuZa52CmbA9ghmAJ6H+SXHmdUyfG9jBsU/YK5s+l/MBW+Cv9dJmP31a8wMbyXm3+Wghvp+inVdOeYiMq9bCwEF7a3vgzm8891q2feXrHpzMYPGva4SK4QQjWEzjNaY2yyEEKI6K6s3Q2s9cK+FRZtQSl0MjNBa39XRbRFCCCE6mgR+QgjRCqwl2Y/GzBT0xJzTt0xrfVOLine truncated
|
||||
"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
|
||||
}
|
||||
+593
@@ -0,0 +1,593 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Model:\n",
|
||||
" def __init__(self, input_size, output_size, layer_size, learning_rate, name):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(layer_size, state_is_tuple = False)\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * layer_size))\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" tensor_action, tensor_validation = tf.split(self.rnn[:,-1],2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n",
|
||||
" 'real_model')\n",
|
||||
" self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n",
|
||||
" 'negative_model')\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" self.trainable = tf.trainable_variables()\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
"\n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.model.logits, feed_dict={self.model.X:states, \n",
|
||||
" self.model.hidden_layer:init_values})\n",
|
||||
" Q_new = self.sess.run(self.model.logits, feed_dict={self.model.X:new_states, \n",
|
||||
" self.model.hidden_layer:init_values})\n",
|
||||
" Q_new_negative = self.sess.run(self.model_negative.logits, \n",
|
||||
" feed_dict={self.model_negative.X:new_states, \n",
|
||||
" self.model_negative.hidden_layer:init_values})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, 4, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not dead_r:\n",
|
||||
" target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" INIT_VAL[i] = rnn_memory\n",
|
||||
" return X, Y, INIT_VAL\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action, last_state = self.sess.run([self.model.logits,self.model.last_state],\n",
|
||||
" feed_dict={self.model.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.model.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('real_model', 'negative_model')\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.model.logits,\n",
|
||||
" self.model.last_state],\n",
|
||||
" feed_dict={self.model.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.model.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" \n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" X, Y, INIT_VAL = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n",
|
||||
" feed_dict={self.model.X: X, self.model.Y:Y,\n",
|
||||
" self.model.hidden_layer: INIT_VAL})\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f39ffaed7b8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:From <ipython-input-3-401815182242>:17: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f39ffaede80>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 328.014401.3, cost: 0.233912, total money: 2446.714413\n",
|
||||
"epoch: 20, total rewards: 629.485052.3, cost: 0.592428, total money: 5723.605047\n",
|
||||
"epoch: 30, total rewards: 1222.065245.3, cost: 0.182284, total money: 7288.965209\n",
|
||||
"epoch: 40, total rewards: 719.309753.3, cost: 0.690094, total money: 3739.159728\n",
|
||||
"epoch: 50, total rewards: 328.994876.3, cost: 0.918951, total money: 2756.724856\n",
|
||||
"epoch: 60, total rewards: 1518.540281.3, cost: 0.226017, total money: 10545.210264\n",
|
||||
"epoch: 70, total rewards: 440.315127.3, cost: 0.145386, total money: 7494.335086\n",
|
||||
"epoch: 80, total rewards: 656.779966.3, cost: 0.113699, total money: 6666.949948\n",
|
||||
"epoch: 90, total rewards: 846.820129.3, cost: 0.444679, total money: 6860.080139\n",
|
||||
"epoch: 100, total rewards: 1044.679930.3, cost: 0.240218, total money: 9067.419920\n",
|
||||
"epoch: 110, total rewards: 207.934935.3, cost: 0.236219, total money: 10207.934935\n",
|
||||
"epoch: 120, total rewards: 6.745002.3, cost: 1.133358, total money: 10006.745002\n",
|
||||
"epoch: 130, total rewards: 586.910091.3, cost: 0.162622, total money: 4665.650081\n",
|
||||
"epoch: 140, total rewards: 1084.244877.3, cost: 0.630996, total money: 6178.484867\n",
|
||||
"epoch: 150, total rewards: 991.774842.3, cost: 1.439193, total money: 420.904786\n",
|
||||
"epoch: 160, total rewards: 714.735100.3, cost: 0.337296, total money: 5744.735038\n",
|
||||
"epoch: 170, total rewards: 1158.574706.3, cost: 0.186633, total money: 10185.244689\n",
|
||||
"epoch: 180, total rewards: 1120.314817.3, cost: 0.539594, total money: 7186.704770\n",
|
||||
"epoch: 190, total rewards: 230.760193.3, cost: 0.110742, total money: 4290.020202\n",
|
||||
"epoch: 200, total rewards: 218.420047.3, cost: 0.125164, total money: 10218.420047\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 9231.760010\n",
|
||||
"day 18, sell 1 unit at price 770.840027, investment 0.338441 %, total balance 10002.600037,\n",
|
||||
"day 20: buy 1 unit at price 747.919983, total balance 9254.680054\n",
|
||||
"day 21: buy 1 unit at price 750.500000, total balance 8504.180054\n",
|
||||
"day 23, sell 1 unit at price 759.109985, investment 1.496150 %, total balance 9263.290039,\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 2.756829 %, total balance 10034.480041,\n",
|
||||
"day 27: buy 1 unit at price 789.270020, total balance 9245.210021\n",
|
||||
"day 28, sell 1 unit at price 796.099976, investment 0.865351 %, total balance 10041.309997,\n",
|
||||
"day 34: buy 1 unit at price 794.559998, total balance 9246.749999\n",
|
||||
"day 35, sell 1 unit at price 791.260010, investment -0.415323 %, total balance 10038.010009,\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 9248.100036\n",
|
||||
"day 38: buy 1 unit at price 785.049988, total balance 8463.050048\n",
|
||||
"day 40: buy 1 unit at price 771.820007, total balance 7691.230041\n",
|
||||
"day 41, sell 1 unit at price 786.140015, investment -0.477264 %, total balance 8477.370056,\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 7671.220032\n",
|
||||
"day 45, sell 1 unit at price 806.650024, investment 2.751422 %, total balance 8477.870056,\n",
|
||||
"day 48, sell 1 unit at price 806.359985, investment 4.475134 %, total balance 9284.230041,\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment 0.214598 %, total balance 10092.110046,\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 9286.040039\n",
|
||||
"day 52, sell 1 unit at price 802.174988, investment -0.483211 %, total balance 10088.215027,\n",
|
||||
"day 57: buy 1 unit at price 832.150024, total balance 9256.065003\n",
|
||||
"day 58: buy 1 unit at price 823.309998, total balance 8432.755005\n",
|
||||
"day 61: buy 1 unit at price 795.695007, total balance 7637.059998\n",
|
||||
"day 63: buy 1 unit at price 801.489990, total balance 6835.570008\n",
|
||||
"day 64, sell 1 unit at price 801.340027, investment -3.702457 %, total balance 7636.910035,\n",
|
||||
"day 66, sell 1 unit at price 808.380005, investment -1.813411 %, total balance 8445.290040,\n",
|
||||
"day 67, sell 1 unit at price 809.559998, investment 1.742501 %, total balance 9254.850038,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 8441.180055\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 2.365597 %, total balance 9261.630067,\n",
|
||||
"day 71: buy 1 unit at price 818.979980, total balance 8442.650087\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 7614.580080\n",
|
||||
"day 76, sell 1 unit at price 831.330017, investment 2.170417 %, total balance 8445.910097,\n",
|
||||
"day 77, sell 1 unit at price 828.640015, investment 1.179520 %, total balance 9274.550112,\n",
|
||||
"day 78: buy 1 unit at price 829.280029, total balance 8445.270083\n",
|
||||
"day 82: buy 1 unit at price 829.080017, total balance 7616.190066\n",
|
||||
"day 83: buy 1 unit at price 827.780029, total balance 6788.410037\n",
|
||||
"day 84: buy 1 unit at price 831.909973, total balance 5956.500064\n",
|
||||
"day 87: buy 1 unit at price 843.250000, total balance 5113.250064\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 4267.710086\n",
|
||||
"day 90: buy 1 unit at price 847.200012, total balance 3420.510074\n",
|
||||
"day 91, sell 1 unit at price 848.780029, investment 2.500999 %, total balance 4269.290103,\n",
|
||||
"day 98: buy 1 unit at price 819.510010, total balance 3449.780093\n",
|
||||
"day 99, sell 1 unit at price 820.919983, investment -1.008109 %, total balance 4270.700076,\n",
|
||||
"day 100: buy 1 unit at price 831.409973, total balance 3439.290103\n",
|
||||
"day 103, sell 1 unit at price 838.549988, investment 1.142226 %, total balance 4277.840091,\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 3443.270084\n",
|
||||
"day 106: buy 1 unit at price 827.880005, total balance 2615.390079\n",
|
||||
"day 107, sell 1 unit at price 824.669983, investment -0.375709 %, total balance 3440.060062,\n",
|
||||
"day 108, sell 1 unit at price 824.729980, investment -0.863073 %, total balance 4264.790042,\n",
|
||||
"day 109, sell 1 unit at price 823.349976, investment -2.359920 %, total balance 5088.140018,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 4263.820011\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -2.599520 %, total balance 5087.380009,\n",
|
||||
"day 114: buy 1 unit at price 838.210022, total balance 4249.169987\n",
|
||||
"day 115, sell 1 unit at price 841.650024, investment -0.655098 %, total balance 5090.820011,\n",
|
||||
"day 117, sell 1 unit at price 862.760010, investment 5.277544 %, total balance 5953.580021,\n",
|
||||
"day 118, sell 1 unit at price 872.299988, investment 4.918153 %, total balance 6825.880009,\n",
|
||||
"day 119: buy 1 unit at price 871.729980, total balance 5954.150029\n",
|
||||
"day 121, sell 1 unit at price 905.960022, investment 8.554107 %, total balance 6860.110051,\n",
|
||||
"day 122, sell 1 unit at price 912.570007, investment 10.229744 %, total balance 7772.680058,\n",
|
||||
"day 123: buy 1 unit at price 916.440002, total balance 6856.240056\n",
|
||||
"day 124, sell 1 unit at price 927.039978, investment 12.461177 %, total balance 7783.280034,\n",
|
||||
"day 125, sell 1 unit at price 931.659973, investment 11.148751 %, total balance 8714.940007,\n",
|
||||
"day 126, sell 1 unit at price 927.130005, investment 6.355182 %, total balance 9642.070012,\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 8713.289983\n",
|
||||
"day 131: buy 1 unit at price 932.219971, total balance 7781.070012\n",
|
||||
"day 134, sell 1 unit at price 919.619995, investment 0.346994 %, total balance 8700.690007,\n",
|
||||
"day 136: buy 1 unit at price 934.010010, total balance 7766.679997\n",
|
||||
"day 138, sell 1 unit at price 948.820007, investment 2.157667 %, total balance 8715.500004,\n",
|
||||
"day 139, sell 1 unit at price 954.960022, investment 2.439344 %, total balance 9670.460026,\n",
|
||||
"day 140, sell 1 unit at price 969.539978, investment 3.804024 %, total balance 10640.000004,\n",
|
||||
"day 141: buy 1 unit at price 971.469971, total balance 9668.530033\n",
|
||||
"day 142, sell 1 unit at price 975.880005, investment 0.453955 %, total balance 10644.410038,\n",
|
||||
"day 143: buy 1 unit at price 964.859985, total balance 9679.550053\n",
|
||||
"day 144, sell 1 unit at price 966.950012, investment 0.216615 %, total balance 10646.500065,\n",
|
||||
"day 145: buy 1 unit at price 975.599976, total balance 9670.900089\n",
|
||||
"day 146: buy 1 unit at price 983.679993, total balance 8687.220096\n",
|
||||
"day 148, sell 1 unit at price 980.940002, investment 0.547358 %, total balance 9668.160098,\n",
|
||||
"day 150, sell 1 unit at price 949.830017, investment -3.441157 %, total balance 10617.990115,\n",
|
||||
"day 152: buy 1 unit at price 953.400024, total balance 9664.590091\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment -1.163208 %, total balance 10606.900089,\n",
|
||||
"day 162: buy 1 unit at price 927.330017, total balance 9679.570072\n",
|
||||
"day 163: buy 1 unit at price 940.489990, total balance 8739.080082\n",
|
||||
"day 170: buy 1 unit at price 928.799988, total balance 7810.280094\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 2.138393 %, total balance 8757.440067,\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 7804.020084\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment 2.648623 %, total balance 8769.420108,\n",
|
||||
"day 177, sell 1 unit at price 970.890015, investment 4.531657 %, total balance 9740.310123,\n",
|
||||
"day 178: buy 1 unit at price 968.150024, total balance 8772.160099\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 2.045269 %, total balance 9745.080082,\n",
|
||||
"day 180, sell 1 unit at price 980.340027, investment 1.259103 %, total balance 10725.420109,\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 9794.920109\n",
|
||||
"day 186: buy 1 unit at price 930.830017, total balance 8864.090092\n",
|
||||
"day 187: buy 1 unit at price 930.390015, total balance 7933.700077\n",
|
||||
"day 188: buy 1 unit at price 923.650024, total balance 7010.050053\n",
|
||||
"day 191, sell 1 unit at price 926.789978, investment -0.398713 %, total balance 7936.840031,\n",
|
||||
"day 192, sell 1 unit at price 922.900024, investment -0.851927 %, total balance 8859.740055,\n",
|
||||
"day 195, sell 1 unit at price 922.669983, investment -0.829763 %, total balance 9782.410038,\n",
|
||||
"day 198: buy 1 unit at price 910.979980, total balance 8871.430058\n",
|
||||
"day 202: buy 1 unit at price 927.000000, total balance 7944.430058\n",
|
||||
"day 203, sell 1 unit at price 921.280029, investment -0.256590 %, total balance 8865.710087,\n",
|
||||
"day 205, sell 1 unit at price 913.809998, investment 0.310656 %, total balance 9779.520085,\n",
|
||||
"day 206, sell 1 unit at price 921.289978, investment -0.615968 %, total balance 10700.810063,\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 9771.240056\n",
|
||||
"day 209, sell 1 unit at price 937.340027, investment 0.835872 %, total balance 10708.580083,\n",
|
||||
"day 212: buy 1 unit at price 935.950012, total balance 9772.630071\n",
|
||||
"day 213, sell 1 unit at price 926.500000, investment -1.009671 %, total balance 10699.130071,\n",
|
||||
"day 216: buy 1 unit at price 935.090027, total balance 9764.040044\n",
|
||||
"day 217: buy 1 unit at price 925.109985, total balance 8838.930059\n",
|
||||
"day 219: buy 1 unit at price 915.000000, total balance 7923.930059\n",
|
||||
"day 221: buy 1 unit at price 931.580017, total balance 6992.350042\n",
|
||||
"day 222: buy 1 unit at price 932.450012, total balance 6059.900030\n",
|
||||
"day 223, sell 1 unit at price 928.530029, investment -0.701537 %, total balance 6988.430059,\n",
|
||||
"day 224, sell 1 unit at price 920.969971, investment -0.447516 %, total balance 7909.400030,\n",
|
||||
"day 225: buy 1 unit at price 924.859985, total balance 6984.540045\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 6040.050055\n",
|
||||
"day 227: buy 1 unit at price 949.500000, total balance 5090.550055\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 4.820763 %, total balance 6049.660040,\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 2.328303 %, total balance 7002.930060,\n",
|
||||
"day 230: buy 1 unit at price 957.789978, total balance 6045.140082\n",
|
||||
"day 235, sell 1 unit at price 972.599976, investment 4.305857 %, total balance 7017.740058,\n",
|
||||
"day 236, sell 1 unit at price 989.250000, investment 6.962137 %, total balance 8006.990058,\n",
|
||||
"day 238: buy 1 unit at price 989.679993, total balance 7017.310065\n",
|
||||
"day 239, sell 1 unit at price 992.000000, investment 5.030229 %, total balance 8009.310065,\n",
|
||||
"day 240: buy 1 unit at price 992.179993, total balance 7017.130072\n",
|
||||
"day 241, sell 1 unit at price 992.809998, investment 4.561348 %, total balance 8009.940070,\n",
|
||||
"day 242, sell 1 unit at price 984.450012, investment 2.783495 %, total balance 8994.390082,\n",
|
||||
"day 244, sell 1 unit at price 968.450012, investment -2.145136 %, total balance 9962.840094,\n",
|
||||
"day 245, sell 1 unit at price 970.539978, investment -2.181057 %, total balance 10933.380072,\n",
|
||||
"day 248: buy 1 unit at price 1019.270020, total balance 9914.110052\n",
|
||||
"day 249, sell 1 unit at price 1017.109985, investment -0.211920 %, total balance 10931.220037,\n",
|
||||
"day 250: buy 1 unit at price 1016.640015, total balance 9914.580022\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+568
@@ -0,0 +1,568 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Actor:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" feed_actor = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_actor, output_size)\n",
|
||||
"\n",
|
||||
"class Critic:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer, learning_rate):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None, 1))\n",
|
||||
" feed_critic = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" feed_critic = tf.layers.dense(feed_critic, output_size, activation = tf.nn.relu) + self.Y\n",
|
||||
" feed_critic = tf.layers.dense(feed_critic, size_layer//2, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_critic, 1)\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.REWARD - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.001\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
"\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.actor = Actor('actor-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.actor_target = Actor('actor-target', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.critic = Critic('critic-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.critic_target = Critic('critic-target', self.state_size, self.OUTPUT_SIZE, \n",
|
||||
" self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)\n",
|
||||
" self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])\n",
|
||||
" weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='actor')\n",
|
||||
" self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)\n",
|
||||
" grads = zip(self.grad_actor, weights_actor)\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X:[state]})[0]\n",
|
||||
" action = np.argmax(prediction)\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories_and_train(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" Q = self.sess.run(self.actor.logits, feed_dict={self.actor.X: states})\n",
|
||||
" Q_target = self.sess.run(self.actor_target.logits, feed_dict={self.actor_target.X: states})\n",
|
||||
" grads = self.sess.run(self.grad_critic, feed_dict={self.critic.X:states, self.critic.Y:Q})[0]\n",
|
||||
" self.sess.run(self.optimizer, feed_dict={self.actor.X:states, self.actor_critic_grad:grads})\n",
|
||||
" \n",
|
||||
" rewards = np.array([a[2] for a in replay]).reshape((-1, 1))\n",
|
||||
" rewards_target = self.sess.run(self.critic_target.logits, \n",
|
||||
" feed_dict={self.critic_target.X:new_states,self.critic_target.Y:Q_target})\n",
|
||||
" for i in range(len(replay)):\n",
|
||||
" if not replay[0][-1]:\n",
|
||||
" rewards[i] += self.GAMMA * rewards_target[i]\n",
|
||||
" cost, _ = self.sess.run([self.critic.cost, self.critic.optimizer], \n",
|
||||
" feed_dict={self.critic.X:states, self.critic.Y:Q, self.critic.REWARD:rewards})\n",
|
||||
" return cost\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('actor-original', 'actor-target')\n",
|
||||
" self._assign('critic-original', 'critic-target')\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" state = next_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories_and_train(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"epoch: 10, total rewards: 1539.185237.3, cost: 2.181347, total money: 1684.395196\n",
|
||||
"epoch: 20, total rewards: 1308.335026.3, cost: 658.992737, total money: 11308.335026\n",
|
||||
"epoch: 30, total rewards: 810.315002.3, cost: 19406.357422, total money: 5871.594971\n",
|
||||
"epoch: 40, total rewards: 380.889899.3, cost: 436790400.000000, total money: 7327.869879\n",
|
||||
"epoch: 50, total rewards: 676.170224.3, cost: 27570524160.000000, total money: 10676.170224\n",
|
||||
"epoch: 60, total rewards: 796.770199.3, cost: 935274741760.000000, total money: 10796.770199\n",
|
||||
"epoch: 70, total rewards: 47.440366.3, cost: 8344191369216.000000, total money: 7043.150388\n",
|
||||
"epoch: 80, total rewards: 450.169980.3, cost: 88121093914624.000000, total money: 6472.479916\n",
|
||||
"epoch: 90, total rewards: 443.664980.3, cost: 675454474256384.000000, total money: 9427.024965\n",
|
||||
"epoch: 100, total rewards: 350.460142.3, cost: 1153362061950976.000000, total money: 10350.460142\n",
|
||||
"epoch: 110, total rewards: 247.584961.3, cost: 6317238688677888.000000, total money: 9230.944946\n",
|
||||
"epoch: 120, total rewards: 138.510132.3, cost: 3956869119726321664.000000, total money: 8102.600097\n",
|
||||
"epoch: 130, total rewards: 410.025086.3, cost: 2205253088434978816.000000, total money: 10410.025086\n",
|
||||
"epoch: 140, total rewards: 513.814999.3, cost: 5849743807884558336.000000, total money: 9497.174984\n",
|
||||
"epoch: 150, total rewards: 876.734991.3, cost: 25442419893862400.000000, total money: 9860.094976\n",
|
||||
"epoch: 160, total rewards: 216.929627.3, cost: 73146239398445056.000000, total money: 9244.369629\n",
|
||||
"epoch: 170, total rewards: 26.000066.3, cost: 210379489706770432.000000, total money: 7992.250066\n",
|
||||
"epoch: 180, total rewards: 230.090269.3, cost: 378469838063927296.000000, total money: 8194.180234\n",
|
||||
"epoch: 190, total rewards: 31.099796.3, cost: 1333389845631860736.000000, total money: 6978.079776\n",
|
||||
"epoch: 200, total rewards: 158.599487.3, cost: 459357028892629008384.000000, total money: 10158.599487\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 3: buy 1 unit at price 782.520020, total balance 9217.479980\n",
|
||||
"day 4: buy 1 unit at price 790.510010, total balance 8426.969970\n",
|
||||
"day 5, sell 1 unit at price 785.309998, investment 0.356538 %, total balance 9212.279968,\n",
|
||||
"day 6, sell 1 unit at price 762.559998, investment -3.535694 %, total balance 9974.839966,\n",
|
||||
"day 16: buy 1 unit at price 761.679993, total balance 9213.159973\n",
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 8444.919983\n",
|
||||
"day 18, sell 1 unit at price 770.840027, investment 1.202609 %, total balance 9215.760010,\n",
|
||||
"day 19, sell 1 unit at price 758.039978, investment -1.327712 %, total balance 9973.799988,\n",
|
||||
"day 20: buy 1 unit at price 747.919983, total balance 9225.880005\n",
|
||||
"day 21: buy 1 unit at price 750.500000, total balance 8475.380005\n",
|
||||
"day 22, sell 1 unit at price 762.520020, investment 1.952085 %, total balance 9237.900025,\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 2.756829 %, total balance 10009.090027,\n",
|
||||
"day 25: buy 1 unit at price 776.419983, total balance 9232.670044\n",
|
||||
"day 26, sell 1 unit at price 789.289978, investment 1.657607 %, total balance 10021.960022,\n",
|
||||
"day 27: buy 1 unit at price 789.270020, total balance 9232.690002\n",
|
||||
"day 28: buy 1 unit at price 796.099976, total balance 8436.590026\n",
|
||||
"day 31, sell 1 unit at price 790.799988, investment 0.193846 %, total balance 9227.390014,\n",
|
||||
"day 32, sell 1 unit at price 794.200012, investment -0.238659 %, total balance 10021.590026,\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 9225.170043\n",
|
||||
"day 34, sell 1 unit at price 794.559998, investment -0.233543 %, total balance 10019.730041,\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 9229.820068\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 10021.370056,\n",
|
||||
"day 49: buy 1 unit at price 807.880005, total balance 9213.490051\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 8407.420044\n",
|
||||
"day 52, sell 1 unit at price 802.174988, investment -0.706171 %, total balance 9209.595032,\n",
|
||||
"day 53, sell 1 unit at price 805.020020, investment -0.130260 %, total balance 10014.615052,\n",
|
||||
"day 59: buy 1 unit at price 802.320007, total balance 9212.295045\n",
|
||||
"day 62, sell 1 unit at price 798.530029, investment -0.472377 %, total balance 10010.825074,\n",
|
||||
"day 63: buy 1 unit at price 801.489990, total balance 9209.335084\n",
|
||||
"day 64, sell 1 unit at price 801.340027, investment -0.018711 %, total balance 10010.675111,\n",
|
||||
"day 67: buy 1 unit at price 809.559998, total balance 9201.115113\n",
|
||||
"day 68, sell 1 unit at price 813.669983, investment 0.507681 %, total balance 10014.785096,\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 9186.715089\n",
|
||||
"day 74, sell 1 unit at price 831.659973, investment 0.433534 %, total balance 10018.375062,\n",
|
||||
"day 81: buy 1 unit at price 830.630005, total balance 9187.745057\n",
|
||||
"day 82, sell 1 unit at price 829.080017, investment -0.186604 %, total balance 10016.825074,\n",
|
||||
"day 87: buy 1 unit at price 843.250000, total balance 9173.575074\n",
|
||||
"day 88, sell 1 unit at price 845.539978, investment 0.271566 %, total balance 10019.115052,\n",
|
||||
"day 92: buy 1 unit at price 852.119995, total balance 9166.995057\n",
|
||||
"day 93, sell 1 unit at price 848.400024, investment -0.436555 %, total balance 10015.395081,\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 9200.965088\n",
|
||||
"day 98: buy 1 unit at price 819.510010, total balance 8381.455078\n",
|
||||
"day 99, sell 1 unit at price 820.919983, investment 0.796875 %, total balance 9202.375061,\n",
|
||||
"day 100: buy 1 unit at price 831.409973, total balance 8370.965088\n",
|
||||
"day 101, sell 1 unit at price 831.500000, investment 1.463068 %, total balance 9202.465088,\n",
|
||||
"day 102, sell 1 unit at price 829.559998, investment -0.222511 %, total balance 10032.025086,\n",
|
||||
"day 107: buy 1 unit at price 824.669983, total balance 9207.355103\n",
|
||||
"day 109, sell 1 unit at price 823.349976, investment -0.160065 %, total balance 10030.705079,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 9206.385072\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 10029.945070,\n",
|
||||
"day 115: buy 1 unit at price 841.650024, total balance 9188.295046\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 0.182971 %, total balance 10031.485048,\n",
|
||||
"day 119: buy 1 unit at price 871.729980, total balance 9159.755068\n",
|
||||
"day 120, sell 1 unit at price 874.250000, investment 0.289083 %, total balance 10034.005068,\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 9105.225039\n",
|
||||
"day 130, sell 1 unit at price 930.599976, investment 0.195950 %, total balance 10035.825015,\n",
|
||||
"day 137: buy 1 unit at price 941.859985, total balance 9093.965030\n",
|
||||
"day 138, sell 1 unit at price 948.820007, investment 0.738966 %, total balance 10042.785037,\n",
|
||||
"day 140: buy 1 unit at price 969.539978, total balance 9073.245059\n",
|
||||
"day 141, sell 1 unit at price 971.469971, investment 0.199063 %, total balance 10044.715030,\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 9077.765018\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10053.364994,\n",
|
||||
"day 147: buy 1 unit at price 976.570007, total balance 9076.794987\n",
|
||||
"day 148, sell 1 unit at price 980.940002, investment 0.447484 %, total balance 10057.734989,\n",
|
||||
"day 156: buy 1 unit at price 957.369995, total balance 9100.364994\n",
|
||||
"day 157, sell 1 unit at price 950.630005, investment -0.704011 %, total balance 10050.994999,\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 9085.404972\n",
|
||||
"day 161, sell 1 unit at price 952.270020, investment -1.379468 %, total balance 10037.674992,\n",
|
||||
"day 165: buy 1 unit at price 908.729980, total balance 9128.945012\n",
|
||||
"day 166: buy 1 unit at price 898.700012, total balance 8230.245000\n",
|
||||
"day 167, sell 1 unit at price 911.710022, investment 0.327935 %, total balance 9141.955022,\n",
|
||||
"day 168, sell 1 unit at price 906.690002, investment 0.889061 %, total balance 10048.645024,\n",
|
||||
"day 169: buy 1 unit at price 918.590027, total balance 9130.054997\n",
|
||||
"day 170, sell 1 unit at price 928.799988, investment 1.111482 %, total balance 10058.854985,\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 9128.764958\n",
|
||||
"day 172: buy 1 unit at price 943.830017, total balance 8184.934941\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 1.835300 %, total balance 9132.094914,\n",
|
||||
"day 174: buy 1 unit at price 955.989990, total balance 8176.104924\n",
|
||||
"day 176: buy 1 unit at price 965.400024, total balance 7210.704900\n",
|
||||
"day 177, sell 1 unit at price 970.890015, investment 2.867041 %, total balance 8181.594915,\n",
|
||||
"day 178, sell 1 unit at price 968.150024, investment 1.271983 %, total balance 9149.744939,\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 0.778947 %, total balance 10122.664922,\n",
|
||||
"day 182: buy 1 unit at price 947.799988, total balance 9174.864934\n",
|
||||
"day 183, sell 1 unit at price 934.090027, investment -1.446504 %, total balance 10108.954961,\n",
|
||||
"day 184: buy 1 unit at price 941.530029, total balance 9167.424932\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 8236.924932\n",
|
||||
"day 186, sell 1 unit at price 930.830017, investment -1.136449 %, total balance 9167.754949,\n",
|
||||
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 10098.144964,\n",
|
||||
"day 189: buy 1 unit at price 927.960022, total balance 9170.184942\n",
|
||||
"day 190, sell 1 unit at price 929.359985, investment 0.150865 %, total balance 10099.544927,\n",
|
||||
"day 192: buy 1 unit at price 922.900024, total balance 9176.644903\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -1.696829 %, total balance 10083.884893,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9156.924871\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.723919 %, total balance 10067.904851,\n",
|
||||
"day 199: buy 1 unit at price 910.669983, total balance 9157.234868\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment -0.440336 %, total balance 10063.894841,\n",
|
||||
"day 202: buy 1 unit at price 927.000000, total balance 9136.894841\n",
|
||||
"day 203, sell 1 unit at price 921.280029, investment -0.617041 %, total balance 10058.174870,\n",
|
||||
"day 204: buy 1 unit at price 915.890015, total balance 9142.284855\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 8228.474857\n",
|
||||
"day 206, sell 1 unit at price 921.289978, investment 0.589586 %, total balance 9149.764835,\n",
|
||||
"day 207, sell 1 unit at price 929.570007, investment 1.724648 %, total balance 10079.334842,\n",
|
||||
"day 209: buy 1 unit at price 937.340027, total balance 9141.994815\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment -0.948430 %, total balance 10070.444827,\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 9142.634829\n",
|
||||
"day 212: buy 1 unit at price 935.950012, total balance 8206.684817\n",
|
||||
"day 213: buy 1 unit at price 926.500000, total balance 7280.184817\n",
|
||||
"day 214, sell 1 unit at price 929.080017, investment 0.136884 %, total balance 8209.264834,\n",
|
||||
"day 215: buy 1 unit at price 932.070007, total balance 7277.194827\n",
|
||||
"day 216: buy 1 unit at price 935.090027, total balance 6342.104800\n",
|
||||
"day 217, sell 1 unit at price 925.109985, investment -1.158184 %, total balance 7267.214785,\n",
|
||||
"day 218, sell 1 unit at price 920.289978, investment -0.670267 %, total balance 8187.504763,\n",
|
||||
"day 219, sell 1 unit at price 915.000000, investment -1.831408 %, total balance 9102.504763,\n",
|
||||
"day 221, sell 1 unit at price 931.580017, investment -0.375366 %, total balance 10034.084780,\n",
|
||||
"day 223: buy 1 unit at price 928.530029, total balance 9105.554751\n",
|
||||
"day 224: buy 1 unit at price 920.969971, total balance 8184.584780\n",
|
||||
"day 225, sell 1 unit at price 924.859985, investment -0.395253 %, total balance 9109.444765,\n",
|
||||
"day 226, sell 1 unit at price 944.489990, investment 2.553831 %, total balance 10053.934755,\n",
|
||||
"day 227: buy 1 unit at price 949.500000, total balance 9104.434755\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 1.012110 %, total balance 10063.544740,\n",
|
||||
"day 231: buy 1 unit at price 951.679993, total balance 9111.864747\n",
|
||||
"day 232: buy 1 unit at price 969.960022, total balance 8141.904725\n",
|
||||
"day 233: buy 1 unit at price 978.890015, total balance 7163.014710\n",
|
||||
"day 235, sell 1 unit at price 972.599976, investment 2.198216 %, total balance 8135.614686,\n",
|
||||
"day 236, sell 1 unit at price 989.250000, investment 1.988739 %, total balance 9124.864686,\n",
|
||||
"day 238, sell 1 unit at price 989.679993, investment 1.102267 %, total balance 10114.544679,\n",
|
||||
"day 243: buy 1 unit at price 988.200012, total balance 9126.344667\n",
|
||||
"day 244: buy 1 unit at price 968.450012, total balance 8157.894655\n",
|
||||
"day 245: buy 1 unit at price 970.539978, total balance 7187.354677\n",
|
||||
"day 246, sell 1 unit at price 973.330017, investment -1.504756 %, total balance 8160.684694,\n",
|
||||
"day 247: buy 1 unit at price 972.559998, total balance 7188.124696\n",
|
||||
"day 248, sell 1 unit at price 1019.270020, investment 5.247561 %, total balance 8207.394716,\n",
|
||||
"day 249, sell 1 unit at price 1017.109985, investment 4.798361 %, total balance 9224.504701,\n",
|
||||
"day 250: buy 1 unit at price 1016.640015, total balance 8207.864686\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+571
@@ -0,0 +1,571 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Actor:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" feed_actor = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(feed_actor,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,\n",
|
||||
" tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
"\n",
|
||||
"class Critic:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer, learning_rate):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None, 1))\n",
|
||||
" feed_critic = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(feed_critic,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" feed_critic = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" feed_critic = tf.nn.relu(feed_critic) + self.Y\n",
|
||||
" feed_critic = tf.layers.dense(feed_critic, size_layer//2, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_critic, 1)\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.REWARD - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.001\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
"\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.actor = Actor('actor-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.actor_target = Actor('actor-target', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.critic = Critic('critic-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.critic_target = Critic('critic-target', self.state_size, self.OUTPUT_SIZE, \n",
|
||||
" self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)\n",
|
||||
" self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])\n",
|
||||
" weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='actor')\n",
|
||||
" self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)\n",
|
||||
" grads = zip(self.grad_actor, weights_actor)\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X:[state]})[0]\n",
|
||||
" action = np.argmax(prediction)\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories_and_train(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" Q = self.sess.run(self.actor.logits, feed_dict={self.actor.X: states})\n",
|
||||
" Q_target = self.sess.run(self.actor_target.logits, feed_dict={self.actor_target.X: states})\n",
|
||||
" grads = self.sess.run(self.grad_critic, feed_dict={self.critic.X:states, self.critic.Y:Q})[0]\n",
|
||||
" self.sess.run(self.optimizer, feed_dict={self.actor.X:states, self.actor_critic_grad:grads})\n",
|
||||
" \n",
|
||||
" rewards = np.array([a[2] for a in replay]).reshape((-1, 1))\n",
|
||||
" rewards_target = self.sess.run(self.critic_target.logits, \n",
|
||||
" feed_dict={self.critic_target.X:new_states,self.critic_target.Y:Q_target})\n",
|
||||
" for i in range(len(replay)):\n",
|
||||
" if not replay[0][-1]:\n",
|
||||
" rewards[i] += self.GAMMA * rewards_target[i]\n",
|
||||
" cost, _ = self.sess.run([self.critic.cost, self.critic.optimizer], \n",
|
||||
" feed_dict={self.critic.X:states, self.critic.Y:Q, self.critic.REWARD:rewards})\n",
|
||||
" return cost\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('actor-original', 'actor-target')\n",
|
||||
" self._assign('critic-original', 'critic-target')\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" state = next_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories_and_train(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From <ipython-input-3-a50a3d0b4e36>:13: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"epoch: 10, total rewards: 707.200200.3, cost: 0.405626, total money: 9715.020207\n",
|
||||
"epoch: 20, total rewards: 1598.640143.3, cost: 30.734631, total money: 10581.530158\n",
|
||||
"epoch: 30, total rewards: 1271.279733.3, cost: 465.966644, total money: 10254.169748\n",
|
||||
"epoch: 40, total rewards: 611.054993.3, cost: 38.079464, total money: 2818.014953\n",
|
||||
"epoch: 50, total rewards: 1098.115172.3, cost: 71481.406250, total money: 1453.295102\n",
|
||||
"epoch: 60, total rewards: 575.370237.3, cost: 45955692.000000, total money: 9558.260252\n",
|
||||
"epoch: 70, total rewards: 1020.545110.3, cost: 244974075904.000000, total money: 10003.435125\n",
|
||||
"epoch: 80, total rewards: 824.555359.3, cost: 62751015698432.000000, total money: 4025.125366\n",
|
||||
"epoch: 90, total rewards: 182.215205.3, cost: 3949580517376.000000, total money: 10182.215205\n",
|
||||
"epoch: 100, total rewards: 861.215276.3, cost: 7310792458240.000000, total money: 7918.025274\n",
|
||||
"epoch: 110, total rewards: 68.690005.3, cost: 3184271573385216.000000, total money: 10068.690005\n",
|
||||
"epoch: 120, total rewards: 205.980352.3, cost: 224217291292672.000000, total money: 10205.980352\n",
|
||||
"epoch: 130, total rewards: 256.794983.3, cost: 363017178972160.000000, total money: 8275.784973\n",
|
||||
"epoch: 140, total rewards: 1586.720156.3, cost: 530019768074240.000000, total money: 11586.720156\n",
|
||||
"epoch: 150, total rewards: 824.849978.3, cost: 3151772092727296.000000, total money: 8881.750002\n",
|
||||
"epoch: 160, total rewards: 222.490291.3, cost: 6080023886823424.000000, total money: 9205.850276\n",
|
||||
"epoch: 170, total rewards: 37.630069.3, cost: 9586346603577344.000000, total money: 9020.990054\n",
|
||||
"epoch: 180, total rewards: 510.125126.3, cost: 22490134536519680.000000, total money: 5604.765140\n",
|
||||
"epoch: 190, total rewards: 639.559874.3, cost: 106721235701858304.000000, total money: 9669.019896\n",
|
||||
"epoch: 200, total rewards: 945.395079.3, cost: 31826508674760704.000000, total money: 384.445006\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
||||
"day 2: buy 1 unit at price 762.020020, total balance 8469.279968\n",
|
||||
"day 3, sell 1 unit at price 782.520020, investment 1.797842 %, total balance 9251.799988,\n",
|
||||
"day 4, sell 1 unit at price 790.510010, investment 3.738746 %, total balance 10042.309998,\n",
|
||||
"day 5: buy 1 unit at price 785.309998, total balance 9257.000000\n",
|
||||
"day 8: buy 1 unit at price 736.080017, total balance 8520.919983\n",
|
||||
"day 11, sell 1 unit at price 771.229980, investment -1.792925 %, total balance 9292.149963,\n",
|
||||
"day 12: buy 1 unit at price 760.539978, total balance 8531.609985\n",
|
||||
"day 14: buy 1 unit at price 768.270020, total balance 7763.339965\n",
|
||||
"day 15: buy 1 unit at price 760.989990, total balance 7002.349975\n",
|
||||
"day 17, sell 1 unit at price 768.239990, investment 4.369087 %, total balance 7770.589965,\n",
|
||||
"day 20, sell 1 unit at price 747.919983, investment -1.659347 %, total balance 8518.509948,\n",
|
||||
"day 21, sell 1 unit at price 750.500000, investment -2.312991 %, total balance 9269.009948,\n",
|
||||
"day 22, sell 1 unit at price 762.520020, investment 0.201058 %, total balance 10031.529968,\n",
|
||||
"day 27: buy 1 unit at price 789.270020, total balance 9242.259948\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 8445.839965\n",
|
||||
"day 34, sell 1 unit at price 794.559998, investment 0.670237 %, total balance 9240.399963,\n",
|
||||
"day 35, sell 1 unit at price 791.260010, investment -0.647896 %, total balance 10031.659973,\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 9241.750000\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 10033.299988,\n",
|
||||
"day 41: buy 1 unit at price 786.140015, total balance 9247.159973\n",
|
||||
"day 43: buy 1 unit at price 794.020020, total balance 8453.139953\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 7646.989929\n",
|
||||
"day 45, sell 1 unit at price 806.650024, investment 2.608951 %, total balance 8453.639953,\n",
|
||||
"day 47: buy 1 unit at price 807.909973, total balance 7645.729980\n",
|
||||
"day 48: buy 1 unit at price 806.359985, total balance 6839.369995\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment 1.745546 %, total balance 7647.250000,\n",
|
||||
"day 55: buy 1 unit at price 823.869995, total balance 6823.380005\n",
|
||||
"day 56, sell 1 unit at price 835.669983, investment 3.661844 %, total balance 7659.049988,\n",
|
||||
"day 57, sell 1 unit at price 832.150024, investment 3.000341 %, total balance 8491.200012,\n",
|
||||
"day 58, sell 1 unit at price 823.309998, investment 2.102040 %, total balance 9314.510010,\n",
|
||||
"day 59: buy 1 unit at price 802.320007, total balance 8512.190003\n",
|
||||
"day 60, sell 1 unit at price 796.789978, investment -3.286928 %, total balance 9308.979981,\n",
|
||||
"day 62: buy 1 unit at price 798.530029, total balance 8510.449952\n",
|
||||
"day 63, sell 1 unit at price 801.489990, investment -0.103452 %, total balance 9311.939942,\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 2.593511 %, total balance 10131.179932,\n",
|
||||
"day 75: buy 1 unit at price 830.760010, total balance 9300.419922\n",
|
||||
"day 76, sell 1 unit at price 831.330017, investment 0.068613 %, total balance 10131.749939,\n",
|
||||
"day 77: buy 1 unit at price 828.640015, total balance 9303.109924\n",
|
||||
"day 78: buy 1 unit at price 829.280029, total balance 8473.829895\n",
|
||||
"day 80, sell 1 unit at price 835.239990, investment 0.796483 %, total balance 9309.069885,\n",
|
||||
"day 83: buy 1 unit at price 827.780029, total balance 8481.289856\n",
|
||||
"day 84, sell 1 unit at price 831.909973, investment 0.317136 %, total balance 9313.199829,\n",
|
||||
"day 86: buy 1 unit at price 838.679993, total balance 8474.519836\n",
|
||||
"day 87: buy 1 unit at price 843.250000, total balance 7631.269836\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 6785.729858\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 2.155158 %, total balance 7631.349853,\n",
|
||||
"day 91: buy 1 unit at price 848.780029, total balance 6782.569824\n",
|
||||
"day 92: buy 1 unit at price 852.119995, total balance 5930.449829\n",
|
||||
"day 94, sell 1 unit at price 830.460022, investment -0.980108 %, total balance 6760.909851,\n",
|
||||
"day 95: buy 1 unit at price 829.590027, total balance 5931.319824\n",
|
||||
"day 96: buy 1 unit at price 817.580017, total balance 5113.739807\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 4299.309814\n",
|
||||
"day 98: buy 1 unit at price 819.510010, total balance 3479.799804\n",
|
||||
"day 104, sell 1 unit at price 834.570007, investment -1.029350 %, total balance 4314.369811,\n",
|
||||
"day 105: buy 1 unit at price 831.409973, total balance 3482.959838\n",
|
||||
"day 106: buy 1 unit at price 827.880005, total balance 2655.079833\n",
|
||||
"day 107, sell 1 unit at price 824.669983, investment -2.468245 %, total balance 3479.749816,\n",
|
||||
"day 108: buy 1 unit at price 824.729980, total balance 2655.019836\n",
|
||||
"day 110, sell 1 unit at price 824.320007, investment -2.881786 %, total balance 3479.339843,\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -3.351640 %, total balance 4302.899841,\n",
|
||||
"day 112: buy 1 unit at price 837.169983, total balance 3465.729858\n",
|
||||
"day 118, sell 1 unit at price 872.299988, investment 5.148321 %, total balance 4338.029846,\n",
|
||||
"day 121, sell 1 unit at price 905.960022, investment 10.809952 %, total balance 5243.989868,\n",
|
||||
"day 122, sell 1 unit at price 912.570007, investment 12.050147 %, total balance 6156.559875,\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 11.827798 %, total balance 7072.999877,\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 6141.339904\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 5209.169921\n",
|
||||
"day 132, sell 1 unit at price 937.080017, investment 12.709740 %, total balance 6146.249938,\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 13.905396 %, total balance 7089.249938,\n",
|
||||
"day 134: buy 1 unit at price 919.619995, total balance 6169.629943\n",
|
||||
"day 136, sell 1 unit at price 934.010010, investment 13.250401 %, total balance 7103.639953,\n",
|
||||
"day 137, sell 1 unit at price 941.859985, investment 12.505226 %, total balance 8045.499938,\n",
|
||||
"day 139, sell 1 unit at price 954.960022, investment 2.500918 %, total balance 9000.459960,\n",
|
||||
"day 140: buy 1 unit at price 969.539978, total balance 8030.919982\n",
|
||||
"day 143: buy 1 unit at price 964.859985, total balance 7066.059997\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 5.496850 %, total balance 8049.469970,\n",
|
||||
"day 150: buy 1 unit at price 949.830017, total balance 7099.639953\n",
|
||||
"day 152, sell 1 unit at price 953.400024, investment 3.673260 %, total balance 8053.039977,\n",
|
||||
"day 153, sell 1 unit at price 950.760010, investment -1.936998 %, total balance 9003.799987,\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment -2.337125 %, total balance 9946.109985,\n",
|
||||
"day 156: buy 1 unit at price 957.369995, total balance 8988.739990\n",
|
||||
"day 157, sell 1 unit at price 950.630005, investment 0.084224 %, total balance 9939.369995,\n",
|
||||
"day 159, sell 1 unit at price 957.090027, investment -0.029243 %, total balance 10896.460022,\n",
|
||||
"day 161: buy 1 unit at price 952.270020, total balance 9944.190002\n",
|
||||
"day 163: buy 1 unit at price 940.489990, total balance 9003.700012\n",
|
||||
"day 167, sell 1 unit at price 911.710022, investment -4.259296 %, total balance 9915.410034,\n",
|
||||
"day 168: buy 1 unit at price 906.690002, total balance 9008.720032\n",
|
||||
"day 170, sell 1 unit at price 928.799988, investment -1.242969 %, total balance 9937.520020,\n",
|
||||
"day 171, sell 1 unit at price 930.090027, investment 2.580819 %, total balance 10867.610047,\n",
|
||||
"day 188: buy 1 unit at price 923.650024, total balance 9943.960023\n",
|
||||
"day 191, sell 1 unit at price 926.789978, investment 0.339951 %, total balance 10870.750001,\n",
|
||||
"day 196: buy 1 unit at price 922.219971, total balance 9948.530030\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9021.570008\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.218797 %, total balance 9932.549988,\n",
|
||||
"day 199: buy 1 unit at price 910.669983, total balance 9021.880005\n",
|
||||
"day 202, sell 1 unit at price 927.000000, investment 0.004313 %, total balance 9948.880005,\n",
|
||||
"day 203: buy 1 unit at price 921.280029, total balance 9027.599976\n",
|
||||
"day 204, sell 1 unit at price 915.890015, investment 0.573208 %, total balance 9943.489991,\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 9029.679993\n",
|
||||
"day 206, sell 1 unit at price 921.289978, investment 0.001080 %, total balance 9950.969971,\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 9021.399964\n",
|
||||
"day 208, sell 1 unit at price 939.330017, investment 2.792705 %, total balance 9960.729981,\n",
|
||||
"day 209: buy 1 unit at price 937.340027, total balance 9023.389954\n",
|
||||
"day 210: buy 1 unit at price 928.450012, total balance 8094.939942\n",
|
||||
"day 212: buy 1 unit at price 935.950012, total balance 7158.989930\n",
|
||||
"day 213, sell 1 unit at price 926.500000, investment -0.330261 %, total balance 8085.489930,\n",
|
||||
"day 219: buy 1 unit at price 915.000000, total balance 7170.489930\n",
|
||||
"day 220, sell 1 unit at price 921.809998, investment -1.656819 %, total balance 8092.299928,\n",
|
||||
"day 221, sell 1 unit at price 931.580017, investment 0.337122 %, total balance 9023.879945,\n",
|
||||
"day 222, sell 1 unit at price 932.450012, investment -0.373952 %, total balance 9956.329957,\n",
|
||||
"day 223: buy 1 unit at price 928.530029, total balance 9027.799928\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 8083.309938\n",
|
||||
"day 227, sell 1 unit at price 949.500000, investment 3.770492 %, total balance 9032.809938,\n",
|
||||
"day 228: buy 1 unit at price 959.109985, total balance 8073.699953\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 2.664426 %, total balance 9026.969973,\n",
|
||||
"day 231: buy 1 unit at price 951.679993, total balance 8075.289980\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 2.696697 %, total balance 9045.250002,\n",
|
||||
"day 233, sell 1 unit at price 978.890015, investment 2.062332 %, total balance 10024.140017,\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment 2.660559 %, total balance 11001.140017,\n",
|
||||
"day 235: buy 1 unit at price 972.599976, total balance 10028.540041\n",
|
||||
"day 238: buy 1 unit at price 989.679993, total balance 9038.860048\n",
|
||||
"day 240, sell 1 unit at price 992.179993, investment 2.013162 %, total balance 10031.040041,\n",
|
||||
"day 241, sell 1 unit at price 992.809998, investment 0.316264 %, total balance 11023.850039,\n",
|
||||
"day 247: buy 1 unit at price 972.559998, total balance 10051.290041\n",
|
||||
"day 248, sell 1 unit at price 1019.270020, investment 4.802791 %, total balance 11070.560061,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+544
@@ -0,0 +1,544 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Actor:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * size_layer))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(size_layer, state_is_tuple = False)\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X, cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" self.logits = tf.layers.dense(self.rnn[:,-1], output_size)\n",
|
||||
"\n",
|
||||
"class Critic:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer, learning_rate):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * size_layer))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None, 1))\n",
|
||||
" feed_critic = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(size_layer, state_is_tuple = False)\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X, cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" feed_critic = tf.layers.dense(self.rnn[:,-1], output_size, activation = tf.nn.relu) + self.Y\n",
|
||||
" feed_critic = tf.layers.dense(feed_critic, size_layer//2, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_critic, 1)\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.REWARD - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.001\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
"\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.skip = skip\n",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.actor = Actor('actor-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.actor_target = Actor('actor-target', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.critic = Critic('critic-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.critic_target = Critic('critic-target', self.state_size, self.OUTPUT_SIZE, \n",
|
||||
" self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)\n",
|
||||
" self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])\n",
|
||||
" weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='actor')\n",
|
||||
" self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)\n",
|
||||
" grads = zip(self.grad_actor, weights_actor)\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X:[state]})[0]\n",
|
||||
" action = np.argmax(prediction)\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories_and_train(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.actor.logits, feed_dict={self.actor.X: states,\n",
|
||||
" self.actor.hidden_layer: init_values})\n",
|
||||
" Q_target = self.sess.run(self.actor_target.logits, feed_dict={self.actor_target.X: states,\n",
|
||||
" self.actor_target.hidden_layer: init_values})\n",
|
||||
" grads = self.sess.run(self.grad_critic, feed_dict={self.critic.X:states, self.critic.Y:Q,\n",
|
||||
" self.critic.hidden_layer: init_values})[0]\n",
|
||||
" self.sess.run(self.optimizer, feed_dict={self.actor.X:states, self.actor_critic_grad:grads,\n",
|
||||
" self.actor.hidden_layer: init_values})\n",
|
||||
" \n",
|
||||
" rewards = np.array([a[2] for a in replay]).reshape((-1, 1))\n",
|
||||
" rewards_target = self.sess.run(self.critic_target.logits, \n",
|
||||
" feed_dict={self.critic_target.X:new_states,self.critic_target.Y:Q_target,\n",
|
||||
" self.critic_target.hidden_layer: init_values})\n",
|
||||
" for i in range(len(replay)):\n",
|
||||
" if not replay[0][-2]:\n",
|
||||
" rewards[i] += self.GAMMA * rewards_target[i]\n",
|
||||
" cost, _ = self.sess.run([self.critic.cost, self.critic.optimizer], \n",
|
||||
" feed_dict={self.critic.X:states, self.critic.Y:Q, self.critic.REWARD:rewards,\n",
|
||||
" self.critic.hidden_layer: init_values})\n",
|
||||
" return cost\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.actor.logits,\n",
|
||||
" self.actor.last_state],\n",
|
||||
" feed_dict={self.actor.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.actor.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('actor-original', 'actor-target')\n",
|
||||
" self._assign('critic-original', 'critic-target')\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.actor.logits,\n",
|
||||
" self.actor.last_state],\n",
|
||||
" feed_dict={self.actor.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.actor.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories_and_train(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f46cd19b6d8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f46cd102ef0>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f46ccc7ce10>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f46cc5685f8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 1158.549991.3, cost: 0.046632, total money: 4247.099979\n",
|
||||
"epoch: 20, total rewards: 466.185119.3, cost: 0.035100, total money: 5537.135131\n",
|
||||
"epoch: 30, total rewards: 477.615173.3, cost: 0.330107, total money: 975.775206\n",
|
||||
"epoch: 40, total rewards: 1200.205012.3, cost: 0.215860, total money: 10180.934992\n",
|
||||
"epoch: 50, total rewards: 283.615237.3, cost: 0.116108, total money: 3314.845217\n",
|
||||
"epoch: 60, total rewards: 324.265078.3, cost: 0.435482, total money: 9334.585085\n",
|
||||
"epoch: 70, total rewards: 587.429873.3, cost: 0.749076, total money: 4785.129884\n",
|
||||
"epoch: 80, total rewards: 1248.729918.3, cost: 0.167420, total money: 663.739866\n",
|
||||
"epoch: 90, total rewards: 520.270204.3, cost: 0.006982, total money: 9503.630189\n",
|
||||
"epoch: 100, total rewards: 195.270142.3, cost: 0.153058, total money: 10195.270142\n",
|
||||
"epoch: 110, total rewards: 74.399840.3, cost: 0.350105, total money: 10074.399840\n",
|
||||
"epoch: 120, total rewards: 2842.805359.3, cost: 0.074852, total money: 7832.085327\n",
|
||||
"epoch: 130, total rewards: 509.049985.3, cost: 0.053447, total money: 8518.609983\n",
|
||||
"epoch: 140, total rewards: -2.900205.3, cost: 0.015182, total money: 8979.989810\n",
|
||||
"epoch: 150, total rewards: 93.080022.3, cost: 0.008775, total money: 10093.080022\n",
|
||||
"epoch: 160, total rewards: 89.794983.3, cost: 0.107893, total money: 10089.794983\n",
|
||||
"epoch: 170, total rewards: 222.045106.3, cost: 0.189179, total money: 10222.045106\n",
|
||||
"epoch: 180, total rewards: -57.619995.3, cost: 0.002425, total money: 8925.739990\n",
|
||||
"epoch: 190, total rewards: 21.009889.3, cost: 0.005919, total money: 10021.009889\n",
|
||||
"epoch: 200, total rewards: 201.354980.3, cost: 0.002352, total money: 10201.354980\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
||||
"day 1, sell 1 unit at price 762.130005, investment -0.854691 %, total balance 9993.429993,\n",
|
||||
"day 3: buy 1 unit at price 782.520020, total balance 9210.909973\n",
|
||||
"day 4, sell 1 unit at price 790.510010, investment 1.021059 %, total balance 10001.419983,\n",
|
||||
"day 22: buy 1 unit at price 762.520020, total balance 9238.899963\n",
|
||||
"day 23: buy 1 unit at price 759.109985, total balance 8479.789978\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 1.137017 %, total balance 9250.979980,\n",
|
||||
"day 26, sell 1 unit at price 789.289978, investment 3.975708 %, total balance 10040.269958,\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 9249.469970\n",
|
||||
"day 32, sell 1 unit at price 794.200012, investment 0.429947 %, total balance 10043.669982,\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 9247.249999\n",
|
||||
"day 34, sell 1 unit at price 794.559998, investment -0.233543 %, total balance 10041.809997,\n",
|
||||
"day 39: buy 1 unit at price 782.789978, total balance 9259.020019\n",
|
||||
"day 40: buy 1 unit at price 771.820007, total balance 8487.200012\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 0.525051 %, total balance 9274.100036,\n",
|
||||
"day 45, sell 1 unit at price 806.650024, investment 4.512712 %, total balance 10080.750060,\n",
|
||||
"day 64: buy 1 unit at price 801.340027, total balance 9279.410033\n",
|
||||
"day 65, sell 1 unit at price 806.969971, investment 0.702566 %, total balance 10086.380004,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 9272.710021\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 0.833265 %, total balance 10093.160033,\n",
|
||||
"day 103: buy 1 unit at price 838.549988, total balance 9254.610045\n",
|
||||
"day 104, sell 1 unit at price 834.570007, investment -0.474627 %, total balance 10089.180052,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 9264.860045\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 10088.420043,\n",
|
||||
"day 114: buy 1 unit at price 838.210022, total balance 9250.210021\n",
|
||||
"day 115, sell 1 unit at price 841.650024, investment 0.410399 %, total balance 10091.860045,\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 9159.690062\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 8230.910033\n",
|
||||
"day 131, sell 1 unit at price 932.219971, investment 0.005363 %, total balance 9163.130004,\n",
|
||||
"day 132, sell 1 unit at price 937.080017, investment 0.893644 %, total balance 10100.210021,\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 9133.260009\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10108.859985,\n",
|
||||
"day 148: buy 1 unit at price 980.940002, total balance 9127.919983\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 0.251796 %, total balance 10111.329956,\n",
|
||||
"day 151: buy 1 unit at price 942.900024, total balance 9168.429932\n",
|
||||
"day 153, sell 1 unit at price 950.760010, investment 0.833597 %, total balance 10119.189942,\n",
|
||||
"day 168: buy 1 unit at price 906.690002, total balance 9212.499940\n",
|
||||
"day 169, sell 1 unit at price 918.590027, investment 1.312469 %, total balance 10131.089967,\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 9200.999940\n",
|
||||
"day 172, sell 1 unit at price 943.830017, investment 1.477275 %, total balance 10144.829957,\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 9191.409974\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment 1.256533 %, total balance 10156.809998,\n",
|
||||
"day 178: buy 1 unit at price 968.150024, total balance 9188.659974\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 0.492688 %, total balance 10161.579957,\n",
|
||||
"day 192: buy 1 unit at price 922.900024, total balance 9238.679933\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -1.696829 %, total balance 10145.919923,\n",
|
||||
"day 194: buy 1 unit at price 914.390015, total balance 9231.529908\n",
|
||||
"day 196: buy 1 unit at price 922.219971, total balance 8309.309937\n",
|
||||
"day 197, sell 1 unit at price 926.960022, investment 1.374688 %, total balance 9236.269959,\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.218797 %, total balance 10147.249939,\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 9217.679932\n",
|
||||
"day 208: buy 1 unit at price 939.330017, total balance 8278.349915\n",
|
||||
"day 209, sell 1 unit at price 937.340027, investment 0.835872 %, total balance 9215.689942,\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment -1.158273 %, total balance 10144.139954,\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 9216.329956\n",
|
||||
"day 212, sell 1 unit at price 935.950012, investment 0.877336 %, total balance 10152.279968,\n",
|
||||
"day 214: buy 1 unit at price 929.080017, total balance 9223.199951\n",
|
||||
"day 215, sell 1 unit at price 932.070007, investment 0.321823 %, total balance 10155.269958,\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 9210.779968\n",
|
||||
"day 227, sell 1 unit at price 949.500000, investment 0.530446 %, total balance 10160.279968,\n",
|
||||
"day 233: buy 1 unit at price 978.890015, total balance 9181.389953\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment -0.193077 %, total balance 10158.389953,\n",
|
||||
"day 243: buy 1 unit at price 988.200012, total balance 9170.189941\n",
|
||||
"day 244, sell 1 unit at price 968.450012, investment -1.998583 %, total balance 10138.639953,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+555
@@ -0,0 +1,555 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Actor:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * size_layer))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(size_layer, state_is_tuple = False)\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X, cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" tensor_action, tensor_validation = tf.split(self.rnn[:,-1],2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + tf.subtract(feed_action,\n",
|
||||
" tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
"\n",
|
||||
"class Critic:\n",
|
||||
" def __init__(self, name, input_size, output_size, size_layer, learning_rate):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * size_layer))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None, 1))\n",
|
||||
" feed_critic = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(size_layer, state_is_tuple = False)\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X, cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" tensor_action, tensor_validation = tf.split(self.rnn[:,-1],2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" feed_critic = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" feed_critic = tf.nn.relu(feed_critic) + self.Y\n",
|
||||
" feed_critic = tf.layers.dense(feed_critic, size_layer//2, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_critic, 1)\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.REWARD - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.001\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
"\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.skip = skip\n",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.actor = Actor('actor-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.actor_target = Actor('actor-target', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
||||
" self.critic = Critic('critic-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.critic_target = Critic('critic-target', self.state_size, self.OUTPUT_SIZE, \n",
|
||||
" self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)\n",
|
||||
" self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])\n",
|
||||
" weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='actor')\n",
|
||||
" self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)\n",
|
||||
" grads = zip(self.grad_actor, weights_actor)\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X:[state]})[0]\n",
|
||||
" action = np.argmax(prediction)\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories_and_train(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.actor.logits, feed_dict={self.actor.X: states,\n",
|
||||
" self.actor.hidden_layer: init_values})\n",
|
||||
" Q_target = self.sess.run(self.actor_target.logits, feed_dict={self.actor_target.X: states,\n",
|
||||
" self.actor_target.hidden_layer: init_values})\n",
|
||||
" grads = self.sess.run(self.grad_critic, feed_dict={self.critic.X:states, self.critic.Y:Q,\n",
|
||||
" self.critic.hidden_layer: init_values})[0]\n",
|
||||
" self.sess.run(self.optimizer, feed_dict={self.actor.X:states, self.actor_critic_grad:grads,\n",
|
||||
" self.actor.hidden_layer: init_values})\n",
|
||||
" \n",
|
||||
" rewards = np.array([a[2] for a in replay]).reshape((-1, 1))\n",
|
||||
" rewards_target = self.sess.run(self.critic_target.logits, \n",
|
||||
" feed_dict={self.critic_target.X:new_states,self.critic_target.Y:Q_target,\n",
|
||||
" self.critic_target.hidden_layer: init_values})\n",
|
||||
" for i in range(len(replay)):\n",
|
||||
" if not replay[0][-2]:\n",
|
||||
" rewards[i] += self.GAMMA * rewards_target[i]\n",
|
||||
" cost, _ = self.sess.run([self.critic.cost, self.critic.optimizer], \n",
|
||||
" feed_dict={self.critic.X:states, self.critic.Y:Q, self.critic.REWARD:rewards,\n",
|
||||
" self.critic.hidden_layer: init_values})\n",
|
||||
" return cost\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.actor.logits,\n",
|
||||
" self.actor.last_state],\n",
|
||||
" feed_dict={self.actor.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.actor.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('actor-original', 'actor-target')\n",
|
||||
" self._assign('critic-original', 'critic-target')\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.actor.logits,\n",
|
||||
" self.actor.last_state],\n",
|
||||
" feed_dict={self.actor.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.actor.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories_and_train(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f8ac3f890b8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:From <ipython-input-3-b82c6dfdfdbf>:17: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f8a4343d2b0>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f8a42e484e0>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f8a42670c50>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 1217.199710.3, cost: 0.428947, total money: 9258.459720\n",
|
||||
"epoch: 20, total rewards: 154.669988.3, cost: 0.205311, total money: 8167.020025\n",
|
||||
"epoch: 30, total rewards: 225.259892.3, cost: 0.080974, total money: 10225.259892\n",
|
||||
"epoch: 40, total rewards: 1857.994754.3, cost: 0.147440, total money: 7906.464724\n",
|
||||
"epoch: 50, total rewards: 864.365355.3, cost: 0.133079, total money: 3145.525327\n",
|
||||
"epoch: 60, total rewards: 252.179754.3, cost: 0.349886, total money: 10252.179754\n",
|
||||
"epoch: 70, total rewards: 2285.265256.3, cost: 0.122869, total money: 841.845272\n",
|
||||
"epoch: 80, total rewards: 2273.160095.3, cost: 0.042144, total money: 1779.580078\n",
|
||||
"epoch: 90, total rewards: 695.794921.3, cost: 0.652829, total money: 10695.794921\n",
|
||||
"epoch: 100, total rewards: -63.870359.3, cost: 0.026901, total money: 9936.129641\n",
|
||||
"epoch: 110, total rewards: 1660.049986.3, cost: 0.050525, total money: 236.529905\n",
|
||||
"epoch: 120, total rewards: 2137.930355.3, cost: 0.019048, total money: 635.270319\n",
|
||||
"epoch: 130, total rewards: 1263.700071.3, cost: 0.105621, total money: 836.610044\n",
|
||||
"epoch: 140, total rewards: 2582.234985.3, cost: 0.026973, total money: 1985.844970\n",
|
||||
"epoch: 150, total rewards: 1342.129822.3, cost: 0.045669, total money: 1933.479859\n",
|
||||
"epoch: 160, total rewards: 171.394838.3, cost: 0.186082, total money: 9198.064821\n",
|
||||
"epoch: 170, total rewards: 581.185307.3, cost: 0.243257, total money: 26.655338\n",
|
||||
"epoch: 180, total rewards: 109.954956.3, cost: 0.001933, total money: 9092.844971\n",
|
||||
"epoch: 190, total rewards: -85.549868.3, cost: 0.004746, total money: 9914.450132\n",
|
||||
"epoch: 200, total rewards: 94.994872.3, cost: 0.006849, total money: 10094.994872\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
||||
"day 1, sell 1 unit at price 762.130005, investment -0.854691 %, total balance 9993.429993,\n",
|
||||
"day 3: buy 1 unit at price 782.520020, total balance 9210.909973\n",
|
||||
"day 4, sell 1 unit at price 790.510010, investment 1.021059 %, total balance 10001.419983,\n",
|
||||
"day 22: buy 1 unit at price 762.520020, total balance 9238.899963\n",
|
||||
"day 23: buy 1 unit at price 759.109985, total balance 8479.789978\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 1.137017 %, total balance 9250.979980,\n",
|
||||
"day 26, sell 1 unit at price 789.289978, investment 3.975708 %, total balance 10040.269958,\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 9249.469970\n",
|
||||
"day 32, sell 1 unit at price 794.200012, investment 0.429947 %, total balance 10043.669982,\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 9247.249999\n",
|
||||
"day 34, sell 1 unit at price 794.559998, investment -0.233543 %, total balance 10041.809997,\n",
|
||||
"day 39: buy 1 unit at price 782.789978, total balance 9259.020019\n",
|
||||
"day 40: buy 1 unit at price 771.820007, total balance 8487.200012\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 0.525051 %, total balance 9274.100036,\n",
|
||||
"day 45, sell 1 unit at price 806.650024, investment 4.512712 %, total balance 10080.750060,\n",
|
||||
"day 64: buy 1 unit at price 801.340027, total balance 9279.410033\n",
|
||||
"day 65, sell 1 unit at price 806.969971, investment 0.702566 %, total balance 10086.380004,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 9272.710021\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 0.833265 %, total balance 10093.160033,\n",
|
||||
"day 103: buy 1 unit at price 838.549988, total balance 9254.610045\n",
|
||||
"day 104, sell 1 unit at price 834.570007, investment -0.474627 %, total balance 10089.180052,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 9264.860045\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 10088.420043,\n",
|
||||
"day 114: buy 1 unit at price 838.210022, total balance 9250.210021\n",
|
||||
"day 115, sell 1 unit at price 841.650024, investment 0.410399 %, total balance 10091.860045,\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 9159.690062\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 8230.910033\n",
|
||||
"day 131, sell 1 unit at price 932.219971, investment 0.005363 %, total balance 9163.130004,\n",
|
||||
"day 132, sell 1 unit at price 937.080017, investment 0.893644 %, total balance 10100.210021,\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 9133.260009\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10108.859985,\n",
|
||||
"day 148: buy 1 unit at price 980.940002, total balance 9127.919983\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 0.251796 %, total balance 10111.329956,\n",
|
||||
"day 151: buy 1 unit at price 942.900024, total balance 9168.429932\n",
|
||||
"day 153, sell 1 unit at price 950.760010, investment 0.833597 %, total balance 10119.189942,\n",
|
||||
"day 168: buy 1 unit at price 906.690002, total balance 9212.499940\n",
|
||||
"day 169, sell 1 unit at price 918.590027, investment 1.312469 %, total balance 10131.089967,\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 9200.999940\n",
|
||||
"day 172, sell 1 unit at price 943.830017, investment 1.477275 %, total balance 10144.829957,\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 9191.409974\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment 1.256533 %, total balance 10156.809998,\n",
|
||||
"day 178: buy 1 unit at price 968.150024, total balance 9188.659974\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 0.492688 %, total balance 10161.579957,\n",
|
||||
"day 192: buy 1 unit at price 922.900024, total balance 9238.679933\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -1.696829 %, total balance 10145.919923,\n",
|
||||
"day 194: buy 1 unit at price 914.390015, total balance 9231.529908\n",
|
||||
"day 196: buy 1 unit at price 922.219971, total balance 8309.309937\n",
|
||||
"day 197, sell 1 unit at price 926.960022, investment 1.374688 %, total balance 9236.269959,\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.218797 %, total balance 10147.249939,\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 9217.679932\n",
|
||||
"day 208: buy 1 unit at price 939.330017, total balance 8278.349915\n",
|
||||
"day 209, sell 1 unit at price 937.340027, investment 0.835872 %, total balance 9215.689942,\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment -1.158273 %, total balance 10144.139954,\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 9216.329956\n",
|
||||
"day 212, sell 1 unit at price 935.950012, investment 0.877336 %, total balance 10152.279968,\n",
|
||||
"day 214: buy 1 unit at price 929.080017, total balance 9223.199951\n",
|
||||
"day 215, sell 1 unit at price 932.070007, investment 0.321823 %, total balance 10155.269958,\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 9210.779968\n",
|
||||
"day 227, sell 1 unit at price 949.500000, investment 0.530446 %, total balance 10160.279968,\n",
|
||||
"day 233: buy 1 unit at price 978.890015, total balance 9181.389953\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment -0.193077 %, total balance 10158.389953,\n",
|
||||
"day 243: buy 1 unit at price 988.200012, total balance 9170.189941\n",
|
||||
"day 244, sell 1 unit at price 968.450012, investment -1.998583 %, total balance 10138.639953,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+587
@@ -0,0 +1,587 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 500\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, self.state_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, self.state_size))\n",
|
||||
" self.ACTION = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.batch_size = tf.shape(self.ACTION)[0]\n",
|
||||
" \n",
|
||||
" with tf.variable_scope('curiosity_model'):\n",
|
||||
" action = tf.reshape(self.ACTION, (-1,1))\n",
|
||||
" state_action = tf.concat([self.X, action], axis=1)\n",
|
||||
" save_state = tf.identity(self.Y)\n",
|
||||
" \n",
|
||||
" feed = tf.layers.dense(state_action, 32, activation=tf.nn.relu)\n",
|
||||
" self.curiosity_logits = tf.layers.dense(feed, self.state_size)\n",
|
||||
" self.curiosity_cost = tf.reduce_sum(tf.square(save_state - self.curiosity_logits), axis=1)\n",
|
||||
" \n",
|
||||
" self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
|
||||
" .minimize(tf.reduce_mean(self.curiosity_cost))\n",
|
||||
" \n",
|
||||
" total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"q_model\"):\n",
|
||||
" with tf.variable_scope(\"eval_net\"):\n",
|
||||
" x_action = tf.layers.dense(self.X, 128, tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(x_action, self.OUTPUT_SIZE)\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"target_net\"):\n",
|
||||
" y_action = tf.layers.dense(self.Y, 128, tf.nn.relu)\n",
|
||||
" y_q = tf.layers.dense(y_action, self.OUTPUT_SIZE)\n",
|
||||
" \n",
|
||||
" q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
|
||||
" action = tf.cast(self.ACTION, tf.int32)\n",
|
||||
" action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
|
||||
" q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
|
||||
" self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
|
||||
" self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
|
||||
" self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
|
||||
" \n",
|
||||
" t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
|
||||
" e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
|
||||
" self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
|
||||
" \n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, done):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\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 predict(self, inputs):\n",
|
||||
" return self.sess.run(self.logits, feed_dict={self.X:inputs})\n",
|
||||
" \n",
|
||||
" def get_predicted_action(self, sequence):\n",
|
||||
" prediction = self.predict(np.array(sequence))[0]\n",
|
||||
" return np.argmax(prediction)\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" actions = np.array([a[1] for a in replay])\n",
|
||||
" rewards = np.array([a[2] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.target_replace_op)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
|
||||
" })\n",
|
||||
" \n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
|
||||
" })\n",
|
||||
" return cost\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" state = next_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"epoch: 10, total rewards: 2349.819823.3, cost: 69092.625000, total money: 12349.819823\n",
|
||||
"epoch: 20, total rewards: 648.444882.3, cost: 4775652.000000, total money: 6742.654903\n",
|
||||
"epoch: 30, total rewards: 1543.784977.3, cost: 26533.583984, total money: 7642.034916\n",
|
||||
"epoch: 40, total rewards: 1360.930418.3, cost: 871420.750000, total money: 695.580380\n",
|
||||
"epoch: 50, total rewards: 2233.069826.3, cost: 228718.296875, total money: 6354.209779\n",
|
||||
"epoch: 60, total rewards: 1573.414983.3, cost: 407432.843750, total money: 8625.614995\n",
|
||||
"epoch: 70, total rewards: -7.114931.3, cost: 32132.660156, total money: 5021.405088\n",
|
||||
"epoch: 80, total rewards: 798.045042.3, cost: 435778.562500, total money: 9780.935057\n",
|
||||
"epoch: 90, total rewards: 575.719967.3, cost: 72847.468750, total money: 9559.079952\n",
|
||||
"epoch: 100, total rewards: 338.655157.3, cost: 379671.968750, total money: 820.245184\n",
|
||||
"epoch: 110, total rewards: 277.220155.3, cost: 391019.375000, total money: 3452.330140\n",
|
||||
"epoch: 120, total rewards: 370.379826.3, cost: 429969.843750, total money: 7361.909793\n",
|
||||
"epoch: 130, total rewards: 441.860107.3, cost: 2082513.625000, total money: 2538.970093\n",
|
||||
"epoch: 140, total rewards: 709.099850.3, cost: 558315.562500, total money: 130.919796\n",
|
||||
"epoch: 150, total rewards: 159.675106.3, cost: 2904243.000000, total money: 481.725093\n",
|
||||
"epoch: 160, total rewards: 581.489981.3, cost: 1408646.250000, total money: 5631.309988\n",
|
||||
"epoch: 170, total rewards: 1768.579776.3, cost: 1693698.250000, total money: 15.189760\n",
|
||||
"epoch: 180, total rewards: 952.280210.3, cost: 1472623.250000, total money: 8990.750181\n",
|
||||
"epoch: 190, total rewards: 1418.655145.3, cost: 25627934.000000, total money: 3706.275139\n",
|
||||
"epoch: 200, total rewards: 272.595214.3, cost: 922414.500000, total money: 9255.485229\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
|
||||
"day 8: buy 1 unit at price 736.080017, total balance 8509.899963\n",
|
||||
"day 9: buy 1 unit at price 758.489990, total balance 7751.409973\n",
|
||||
"day 10: buy 1 unit at price 764.479980, total balance 6986.929993\n",
|
||||
"day 11: buy 1 unit at price 771.229980, total balance 6215.700013\n",
|
||||
"day 15, sell 1 unit at price 760.989990, investment 0.924375 %, total balance 6976.690003,\n",
|
||||
"day 18: buy 1 unit at price 770.840027, total balance 6205.849976\n",
|
||||
"day 19: buy 1 unit at price 758.039978, total balance 5447.809998\n",
|
||||
"day 22: buy 1 unit at price 762.520020, total balance 4685.289978\n",
|
||||
"day 23: buy 1 unit at price 759.109985, total balance 3926.179993\n",
|
||||
"day 24, sell 1 unit at price 771.190002, investment 4.769860 %, total balance 4697.369995,\n",
|
||||
"day 27: buy 1 unit at price 789.270020, total balance 3908.099975\n",
|
||||
"day 28, sell 1 unit at price 796.099976, investment 4.958534 %, total balance 4704.199951,\n",
|
||||
"day 29: buy 1 unit at price 797.070007, total balance 3907.129944\n",
|
||||
"day 30, sell 1 unit at price 797.849976, investment 4.365058 %, total balance 4704.979920,\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 3914.179932\n",
|
||||
"day 32, sell 1 unit at price 794.200012, investment 2.978363 %, total balance 4708.379944,\n",
|
||||
"day 33: buy 1 unit at price 796.419983, total balance 3911.959961\n",
|
||||
"day 35: buy 1 unit at price 791.260010, total balance 3120.699951\n",
|
||||
"day 36, sell 1 unit at price 789.909973, investment 2.473917 %, total balance 3910.609924,\n",
|
||||
"day 37: buy 1 unit at price 791.549988, total balance 3119.059936\n",
|
||||
"day 40, sell 1 unit at price 771.820007, investment 1.817850 %, total balance 3890.879943,\n",
|
||||
"day 41, sell 1 unit at price 786.140015, investment 3.097623 %, total balance 4677.019958,\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 3.660871 %, total balance 5463.919982,\n",
|
||||
"day 43, sell 1 unit at price 794.020020, investment 0.601822 %, total balance 6257.940002,\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 5451.789978\n",
|
||||
"day 45: buy 1 unit at price 806.650024, total balance 4645.139954\n",
|
||||
"day 47: buy 1 unit at price 807.909973, total balance 3837.229981\n",
|
||||
"day 48, sell 1 unit at price 806.359985, investment 1.165516 %, total balance 4643.589966,\n",
|
||||
"day 50, sell 1 unit at price 804.609985, investment 1.746332 %, total balance 5448.199951,\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 4642.129944\n",
|
||||
"day 52: buy 1 unit at price 802.174988, total balance 3839.954956\n",
|
||||
"day 54: buy 1 unit at price 819.309998, total balance 3020.644958\n",
|
||||
"day 55, sell 1 unit at price 823.869995, investment 3.446675 %, total balance 3844.514953,\n",
|
||||
"day 56: buy 1 unit at price 835.669983, total balance 3008.844970\n",
|
||||
"day 57: buy 1 unit at price 832.150024, total balance 2176.694946\n",
|
||||
"day 58: buy 1 unit at price 823.309998, total balance 1353.384948\n",
|
||||
"day 60, sell 1 unit at price 796.789978, investment 0.698881 %, total balance 2150.174926,\n",
|
||||
"day 61: buy 1 unit at price 795.695007, total balance 1354.479919\n",
|
||||
"day 62: buy 1 unit at price 798.530029, total balance 555.949890\n",
|
||||
"day 63, sell 1 unit at price 801.489990, investment 1.255764 %, total balance 1357.439880,\n",
|
||||
"day 64, sell 1 unit at price 801.340027, investment -0.596663 %, total balance 2158.779907,\n",
|
||||
"day 65, sell 1 unit at price 806.969971, investment 0.039664 %, total balance 2965.749878,\n",
|
||||
"day 66, sell 1 unit at price 808.380005, investment 0.058179 %, total balance 3774.129883,\n",
|
||||
"day 67: buy 1 unit at price 809.559998, total balance 2964.569885\n",
|
||||
"day 68, sell 1 unit at price 813.669983, investment 0.942843 %, total balance 3778.239868,\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 2.127342 %, total balance 4597.479858,\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 0.139143 %, total balance 5417.929870,\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 4589.859863\n",
|
||||
"day 75: buy 1 unit at price 830.760010, total balance 3759.099853\n",
|
||||
"day 76, sell 1 unit at price 831.330017, investment -0.519340 %, total balance 4590.429870,\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment -0.182662 %, total balance 5421.059875,\n",
|
||||
"day 82, sell 1 unit at price 829.080017, investment 0.700832 %, total balance 6250.139892,\n",
|
||||
"day 83, sell 1 unit at price 827.780029, investment 4.032327 %, total balance 7077.919921,\n",
|
||||
"day 84: buy 1 unit at price 831.909973, total balance 6246.009948\n",
|
||||
"day 87: buy 1 unit at price 843.250000, total balance 5402.759948\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 4557.219970\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 5.897081 %, total balance 5402.839965,\n",
|
||||
"day 92, sell 1 unit at price 852.119995, investment 5.257176 %, total balance 6254.959960,\n",
|
||||
"day 93: buy 1 unit at price 848.400024, total balance 5406.559936\n",
|
||||
"day 94: buy 1 unit at price 830.460022, total balance 4576.099914\n",
|
||||
"day 95, sell 1 unit at price 829.590027, investment 0.183562 %, total balance 5405.689941,\n",
|
||||
"day 99, sell 1 unit at price 820.919983, investment -1.184461 %, total balance 6226.609924,\n",
|
||||
"day 101, sell 1 unit at price 831.500000, investment -0.049281 %, total balance 7058.109924,\n",
|
||||
"day 103, sell 1 unit at price 838.549988, investment -0.557369 %, total balance 7896.659912,\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 7062.089905\n",
|
||||
"day 107, sell 1 unit at price 824.669983, investment -2.468245 %, total balance 7886.759888,\n",
|
||||
"day 109, sell 1 unit at price 823.349976, investment -2.952622 %, total balance 8710.109864,\n",
|
||||
"day 110, sell 1 unit at price 824.320007, investment -0.739351 %, total balance 9534.429871,\n",
|
||||
"day 111: buy 1 unit at price 823.559998, total balance 8710.869873\n",
|
||||
"day 112, sell 1 unit at price 837.169983, investment 0.311535 %, total balance 9548.039856,\n",
|
||||
"day 113, sell 1 unit at price 836.820007, investment 1.610084 %, total balance 10384.859863,\n",
|
||||
"day 122: buy 1 unit at price 912.570007, total balance 9472.289856\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 0.424077 %, total balance 10388.729858,\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 9456.559875\n",
|
||||
"day 129, sell 1 unit at price 928.780029, investment -0.363663 %, total balance 10385.339904,\n",
|
||||
"day 130: buy 1 unit at price 930.599976, total balance 9454.739928\n",
|
||||
"day 132: buy 1 unit at price 937.080017, total balance 8517.659911\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 1.332476 %, total balance 9460.659911,\n",
|
||||
"day 134, sell 1 unit at price 919.619995, investment -1.863237 %, total balance 10380.279906,\n",
|
||||
"day 140: buy 1 unit at price 969.539978, total balance 9410.739928\n",
|
||||
"day 141, sell 1 unit at price 971.469971, investment 0.199063 %, total balance 10382.209899,\n",
|
||||
"day 145: buy 1 unit at price 975.599976, total balance 9406.609923\n",
|
||||
"day 146: buy 1 unit at price 983.679993, total balance 8422.929930\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 0.800533 %, total balance 9406.339903,\n",
|
||||
"day 150: buy 1 unit at price 949.830017, total balance 8456.509886\n",
|
||||
"day 151, sell 1 unit at price 942.900024, investment -4.145654 %, total balance 9399.409910,\n",
|
||||
"day 152, sell 1 unit at price 953.400024, investment 0.375857 %, total balance 10352.809934,\n",
|
||||
"day 159: buy 1 unit at price 957.090027, total balance 9395.719907\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 8430.129880\n",
|
||||
"day 161: buy 1 unit at price 952.270020, total balance 7477.859860\n",
|
||||
"day 164: buy 1 unit at price 917.789978, total balance 6560.069882\n",
|
||||
"day 167: buy 1 unit at price 911.710022, total balance 5648.359860\n",
|
||||
"day 170: buy 1 unit at price 928.799988, total balance 4719.559872\n",
|
||||
"day 171, sell 1 unit at price 930.090027, investment -2.821051 %, total balance 5649.649899,\n",
|
||||
"day 173: buy 1 unit at price 947.159973, total balance 4702.489926\n",
|
||||
"day 174: buy 1 unit at price 955.989990, total balance 3746.499936\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 2793.079953\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment -0.019677 %, total balance 3758.479977,\n",
|
||||
"day 177: buy 1 unit at price 970.890015, total balance 2787.589962\n",
|
||||
"day 178, sell 1 unit at price 968.150024, investment 1.667595 %, total balance 3755.739986,\n",
|
||||
"day 179: buy 1 unit at price 972.919983, total balance 2782.820003\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 1802.479976\n",
|
||||
"day 181: buy 1 unit at price 950.700012, total balance 851.779964\n",
|
||||
"day 183, sell 1 unit at price 934.090027, investment 1.776011 %, total balance 1785.869991,\n",
|
||||
"day 184, sell 1 unit at price 941.530029, investment 3.270778 %, total balance 2727.400020,\n",
|
||||
"day 185, sell 1 unit at price 930.500000, investment 0.183033 %, total balance 3657.900020,\n",
|
||||
"day 186: buy 1 unit at price 930.830017, total balance 2727.070003\n",
|
||||
"day 190: buy 1 unit at price 929.359985, total balance 1797.710018\n",
|
||||
"day 191: buy 1 unit at price 926.789978, total balance 870.920040\n",
|
||||
"day 192, sell 1 unit at price 922.900024, investment -2.561336 %, total balance 1793.820064,\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -5.099426 %, total balance 2701.060054,\n",
|
||||
"day 194, sell 1 unit at price 914.390015, investment -4.093681 %, total balance 3615.450069,\n",
|
||||
"day 195: buy 1 unit at price 922.669983, total balance 2692.780086\n",
|
||||
"day 196, sell 1 unit at price 922.219971, investment -5.012931 %, total balance 3615.000057,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 2688.040035\n",
|
||||
"day 198: buy 1 unit at price 910.979980, total balance 1777.060055\n",
|
||||
"day 199: buy 1 unit at price 910.669983, total balance 866.390072\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment -6.810427 %, total balance 1773.050045,\n",
|
||||
"day 201, sell 1 unit at price 924.690002, investment -5.676604 %, total balance 2697.740047,\n",
|
||||
"day 202: buy 1 unit at price 927.000000, total balance 1770.740047\n",
|
||||
"day 204, sell 1 unit at price 915.890015, investment -3.661512 %, total balance 2686.630062,\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment -0.255686 %, total balance 3615.080074,\n",
|
||||
"day 214: buy 1 unit at price 929.080017, total balance 2686.000057\n",
|
||||
"day 215: buy 1 unit at price 932.070007, total balance 1753.930050\n",
|
||||
"day 216: buy 1 unit at price 935.090027, total balance 818.840023\n",
|
||||
"day 220, sell 1 unit at price 921.809998, investment -0.812386 %, total balance 1740.650021,\n",
|
||||
"day 221, sell 1 unit at price 931.580017, investment 0.516842 %, total balance 2672.230038,\n",
|
||||
"day 222, sell 1 unit at price 932.450012, investment 1.059970 %, total balance 3604.680050,\n",
|
||||
"day 224, sell 1 unit at price 920.969971, investment -0.646204 %, total balance 4525.650021,\n",
|
||||
"day 226, sell 1 unit at price 944.489990, investment 3.678457 %, total balance 5470.140011,\n",
|
||||
"day 227, sell 1 unit at price 949.500000, investment 4.263896 %, total balance 6419.640011,\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 3.463860 %, total balance 7378.749996,\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 2.603651 %, total balance 8332.020016,\n",
|
||||
"day 230, sell 1 unit at price 957.789978, investment 2.759446 %, total balance 9289.809994,\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 3.729052 %, total balance 10259.770016,\n",
|
||||
"day 235: buy 1 unit at price 972.599976, total balance 9287.170040\n",
|
||||
"day 236, sell 1 unit at price 989.250000, investment 1.711909 %, total balance 10276.420040,\n",
|
||||
"day 237: buy 1 unit at price 987.830017, total balance 9288.590023\n",
|
||||
"day 238, sell 1 unit at price 989.679993, investment 0.187277 %, total balance 10278.270016,\n",
|
||||
"day 241: buy 1 unit at price 992.809998, total balance 9285.460018\n",
|
||||
"day 242, sell 1 unit at price 984.450012, investment -0.842053 %, total balance 10269.910030,\n",
|
||||
"day 245: buy 1 unit at price 970.539978, total balance 9299.370052\n",
|
||||
"day 246: buy 1 unit at price 973.330017, total balance 8326.040035\n",
|
||||
"day 247, sell 1 unit at price 972.559998, investment 0.208134 %, total balance 9298.600033,\n",
|
||||
"day 249: buy 1 unit at price 1017.109985, total balance 8281.490048\n",
|
||||
"day 250, sell 1 unit at price 1016.640015, investment 4.449672 %, total balance 9298.130063,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd81PX9wPHXfe8uO4SQIXsJfhiyoSwZ7gHiwIJ7VWOl1lHHz6qtWq1VW1vbWkfdFQeKAywO3APBCogokA8jEFYCIYSQAZfc+P3x/d5xudwll73ez8cjD8l3fr6XT+Ln/X1/hs3n8yGEEEIIIYQQov0yWroAQgghhBBCCCGalgR+QgghhBBCCNHOSeAnhBBCCCGEEO2cBH5CCCGEEEII0c5J4CeEEEIIIYQQ7ZwEfkIIIYQQQgjRzkngJ4QQFqXUC0qp+5vgulOUUrqxryvaFqXU5UqpryPs662UKlVK2Zu7XEIIIToGR0sXQAghoqWU2gZcpbX+uCmObypa668A1dT3UUq9D0wJ2hRj3l4Ps/b3BZ4HxgPbgev8n41S6ljgEWAMkKa1ttVyrxOAvwADgH3Ag1rrfwftzwD+DswAvMB7WuuLrH09gMetspYD92utnww690zgT0BfYC3mz3C9te984F6gK+AC3gd+rbU+aO0vDSlqPPC41vrXNT2Pde4LwE6t9V21HVuf42uitd4OJDX0OvWllJoOzNda92yh+39u3f+ZOpyzDugTtCkOeF9rfWaE4y/ErFfpwEfAlVrr/da+64DLgWHAq1rry0POnYNZ73oCO4A7tNbvBO3vD/wDmIZZL5/TWt9m7RsM/Avzd6sAuFVr/XbQuVcBt2PW6a+tcu0OKvMj1jWv0Fp/Zm0/GngJmKK19kT7mQkhOjbJ+AkhRDuhtT5da53k/wK+Ad4IOuRV4HsgDbgTWGgFaACVwOvAL2q7j1LKCbwNPAWkAHOBvyqlRgQd9haQD/QGMjGDRL/5wFbgKMzA8AGl1PHWtQcCLwO/BDoD7wKLlVL+F5XLgMla6xSgP+YLzECWNuT5uwKHQj4D0U5orYcG/ayTMQOysD9rpdRQzPp6CWa9K8d8+eC3G7MePRfm3B6YdfY3QCfgVuAVpVSmtT8GM5D8FLPO9bSOx6q3i4D/Al2ALGC+UuoYa/904AHgLGv/VszfU/+5DwKjgeuAfwYV6x/ATRL0CSHqQjJ+Qog2QSn1EmYQ8a5SygP8QWv9sFJqFuZb/B7AGuBarfWGGo5/AzPTFA/8YB2/Lor724GHgcuAEsy38P8EnFprt1LqCuA2zEZfAfCQ1vop69zpBGVTrEzkY8ClmBmLD4DLtNaHlVLpwAvAcZiZsnXANK21t46fV1/rOS+3vj8GswF5itb6EPCmUupGYDbwpNZaA1opNSCKy3fBbAC/pLX2Ad8ppTYAQ4AflFKnAL2A6UEN0++tciQB04E5WutK6/iFwJXAZ8CpwFda66+t4x8Cfo+ZSflEa70jpCwezKxjOLOBvcBXtT2QUioLuAjwWZ/LZ1rrM61szRPASGAX8Fut9eIajr8duBoz2N0B3Bmc3anh/n0xG/3++vS5Ve4TgOHAcuBCrfU+K7O7RGv9WND5PwD3aq3fUkoNwqyb/gzT77TWr1vHnYEZhPcCDgJ/s57vfSA2KGN6DGaQMhQz23QWsM36TGcDN1nbf6G1XmpdOwX4K3AGZt19Hrhba+1RSl0OXAWswHy5cACYp7V+Xyn1R8y6OkEp9Sjwgtb6uto+sxBTMTN5b0bYfxHwrtb6S6usvwM2KKWStdYlWuu3rO1jMX+Hg/UEDmit37e+X6KUKgOOxqxflwO7tdZ/DTpnrfXfQUB34G/W78qnSqllmAHo74CZwBv+v0FKqfuAXVZGrxTYpbXOU0p9jPmiA6XUedb2b+v2EQkhOjrJ+Akh2gSt9SWY3RPPtN7yP2wFM68CNwIZwHuYgV5MuOOtS70PDMRsmK/GzC5F42rgdMwAYDRwdsj+vZiNuE7AFcDflFKja7jeHOA0oB9mw/5ya/vNwE7reY4C7gB8UZYx2KWYAdQ26/uhQI7WuiTomB+s7XWitd6D+blfoZSyK6UmYgaw/vFrEwANvKiUKlRKfaeUmmbts4X81//vY0O+D/53lf1KqeOUUsWYAfhs4NEIRb0M+I/V4K7tmf6NWRceturLmVZm811gKWZ9+TXwslJKhTveutQWzCAmBbNr4HylVLfa7h/BhZh1KROz2+4t1vZXgQv8BymlhmB+/kuUUomY2adXrPPOBx63jgF4FrhGa52M+Zl+qrUuw6zbu4Myprut48/E7FKYihm8f4jZdugB/AEzi+b3AuDGDMRHAadgBnt+4zHrRTrmS5RnlVI2rfWdmEHudda96xr0gfmzftN6lnCGYtZ3ALTWW4AKzAC3Nisxg8RZVn0/GzPo9Qd3E4BtSqn3lVL7lFKfK6WG1XC92uo71v4CIE0p1RM4GVinlEoG7gJ+G0W5hRCiCgn8hBBt2VzMzMdHVvboL5iZvEmRTtBaP2e94XcB9wAjrExFbeYAf9da79RaF2F2wQq+7hKt9RattU9r/QVmsDAl3IUs/9Ba77bGGL2LGVCC2eWyG9BHa12ptf4qmsAljEsxG+J+SUBxyDHFmF3k6uNVzEycC7PRfmdQNq4nZqP/M8yub48Ai5RS6VbguQz4nVIqzgqOZwMJ1rkfA9OUUtOtLnR3YAY9/v1orb+2unr2BP6MmYmqQinVBzNL+GI9nw/MBn0S5vjFCq31p5hd9i6IdILW+g3r5+rVWi8ANgE/q+f9n9dab7QytK9zpI68DYy0nhHMbNZbVp2eCWzTWj+vtXZrrb/HzIL93Dq2EhiilOqktS7SWq+upQxfaa0/1Fq7MbtRZmB+HpXAa0BfpVRnpdRRmJm+G7XWZVrrvZjZxPODrpWrtX7aygK/iFnPj6rnZxOglEoAzqNqfQ9V7/pvlfc/mMG0y/rvNUFBZk/M5/wHZnZvCWZ9j8EMdPcCtyqlnFY2fBpH6vMHwByl1HClVDzm75QPSLCy/NcCCzGD/qsxXyb8ExiulPpMKfWhNT5XCCFqJYGfEKIt6w7k+r+xGko7MLMR1Vhv6x9USm1RSh3kSMCQHuW9grsZVulyqJQ6XSm1Qim1Xyl1ALMRXNN184P+Xc6RiT3+DGwGliqlcqyug+Ge5Q5lzgJZqpR6MmTfcZgB18KgzaWY2chgnTCzZnVidSV8DTO4jMHMptymlJphHXIIM/h41gpeX8P8vCZb+y/CzHTuwOxmOB8zy4nWOhsze/MYkIf5Ga737w+mtd6F2XB+LUwxLwG+1lpvrevzBekO7AjpZptLhPoFoJS6VCm1Ril1wKoHxxJd/QonbB2xguclHAmqLuBI5roPMN5/f6sMF2HWBzCD7DOAXKXUF1a2tiZ7gv59CNgX1H33kPXfJOu+TiAv6L5PYWYdqz2P1ro86NxaKaWeDKrvd4TsPhfYD3xRwyXqXf+VUidhZiinY9b3acAzSil/IH4Is669r7WuwHwBlQYMtgLkszHHsuZjZvRf50h9/xi4GzM432Z9lQTt/0RrPUFrPQ0zIByLGeD+B7OXwH1A1BPiCCE6NhnjJ4RoS0IzX7sxZ+EDQCllwxy7tCvC8RdijlU6CbOBlQIUUbWrVSR5VB370yvovrGYDbdLgUVa60ql1DtRXrcKq1F/M3Cz9Sb/U6XUd1rrT0KOewBzUohwLsPMAAXPcLkO6O8f02RtG4GZvairY4GNWusP/cVRSi3B7C64BLMLXOjMioGfhdY6FzMzBYBS6hXgf0H7F2IFrUqpzphjwr6LUBYH5lirUJcSkpWNQrj61UspZQQFf72BjeGOtzJwTwMnAsutsW1rqEc9iMKrwN1KqS8xZ7P8zNq+A/hCa31yuJO01t8BZ1ndWK/DDEJ6hT5LPezAzIalW9nBuqrx/lrrX2JO+BNONF1612HWdyAwC2csR36WNRkJfKm1Xml9/51S6lvMvyNrMOv75Egna63XYgaL/nt/Q1AmWmv9L8xZP/1jce8Cfgq+hvW37THM7sbpgF1rnauUysfsKi6EELWSwE8I0ZbswZrgwPI6cLtS6kTgS+AGzMbnNxGOT7b2F2J2tYoUOIXzOnCDFeCUAf8XtC8GsxFZALiVUqdjdnX8qdpVaqGUmglkY44VK8acvCTqiV2s7mJzgHOCt2utN1pByN1Kqbswg7ThmBkgf8My1noWlFJxgM/qPhjqe2CgMpd0+AzzM56JmRUBsyviX5RSl2Fm887BDJqXWdcejJnRcFllPQUYHPQMYzAb1F0wG8SLrUwgSqmLMLsfbrcCrT8CVYJipdQkzKxctRkelVI+4Hit9edhniu0vnyLmWm7TSn1CGbj/kxgXITjEzEDmALrXldQdSxXY3oPcwbKPwALggLT/wIPKqUu4UgmdCRmxmsLZpfP/2qti62st/+8PZjjyVK01qFdImtlTUCyFHhEmROnlGJmdXtaXZ9rE/pZRsUa/3Y8kYNCv5eB5UqpKZhje/+A+XKkxLqOA7NNZAfsVv13W0Hsd5h/Z0ZqrdcopUZhduP2zwo6H/NFzUmYvw/XYy5xssG69nDMANMA5mF2cX3B2heHOSZyHWYA/m/MLuVFIeW/Clht3d8BxFvjNnsDOXX4yIQQHZh09RRCtCV/Au6yupLdorXWwMWYY172YTbKz7S6W1U7HrN7VC5mRnA95gyD0Xoac9zeWszA5z3MiSw8VuPxeszgsAgzs7i4ns84EHOcWynmTI6Pa2vtriidjTljYrhzzsfsKuYfo3ie1rrA2tcHs8uaf4bTQ5jjkwBzjUB/FztrYowrMcc0HcTsYvcmVpcza9ziLMxxScWYa5SdpbXeZ13uVMzGahFmg/20oHKAuf7fAev+RZhjm/yGAN8oc1bFZdYxwfvhSMazSjc+pVQvzG50P4b5bMCLine truncated
|
||||
"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
|
||||
}
|
||||
+527
@@ -0,0 +1,527 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 128\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * self.LAYER_SIZE))\n",
|
||||
" self.ACTION = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.batch_size = tf.shape(self.ACTION)[0]\n",
|
||||
" self.seq_len = tf.shape(self.X)[1]\n",
|
||||
" \n",
|
||||
" with tf.variable_scope('curiosity_model'):\n",
|
||||
" action = tf.reshape(self.ACTION, (-1,1,1))\n",
|
||||
" repeat_action = tf.tile(action, [1,self.seq_len,1])\n",
|
||||
" state_action = tf.concat([self.X, repeat_action], axis=-1)\n",
|
||||
" save_state = tf.identity(self.Y)\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
|
||||
" self.rnn,last_state = tf.nn.dynamic_rnn(inputs=state_action,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" self.curiosity_logits = tf.layers.dense(self.rnn[:,-1], self.state_size)\n",
|
||||
" self.curiosity_cost = tf.reduce_sum(tf.square(save_state[:,-1] - self.curiosity_logits), axis=1)\n",
|
||||
" \n",
|
||||
" self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
|
||||
" .minimize(tf.reduce_mean(self.curiosity_cost))\n",
|
||||
" \n",
|
||||
" total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"q_model\"):\n",
|
||||
" with tf.variable_scope(\"eval_net\"):\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
|
||||
" rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" self.logits = tf.layers.dense(rnn[:,-1], self.OUTPUT_SIZE)\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"target_net\"):\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
|
||||
" rnn,last_state = tf.nn.dynamic_rnn(inputs=self.Y,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" y_q = tf.layers.dense(rnn[:,-1], self.OUTPUT_SIZE)\n",
|
||||
" \n",
|
||||
" q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
|
||||
" action = tf.cast(self.ACTION, tf.int32)\n",
|
||||
" action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
|
||||
" q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
|
||||
" self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
|
||||
" self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
|
||||
" self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
|
||||
" \n",
|
||||
" t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
|
||||
" e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
|
||||
" self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
|
||||
" \n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, done, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, done, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\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 _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" actions = np.array([a[1] for a in replay])\n",
|
||||
" rewards = np.array([a[2] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.target_replace_op)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards,\n",
|
||||
" self.hidden_layer: init_values\n",
|
||||
" })\n",
|
||||
" \n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards,\n",
|
||||
" self.hidden_layer: init_values\n",
|
||||
" })\n",
|
||||
" return cost\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.logits,\n",
|
||||
" self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.logits,\n",
|
||||
" self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff38845bba8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff2f112ed68>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff2f112eac8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 685.860168.3, cost: 4139534.500000, total money: 977.580137\n",
|
||||
"epoch: 20, total rewards: 1724.255003.3, cost: 5132677.500000, total money: 5851.904966\n",
|
||||
"epoch: 30, total rewards: 493.970035.3, cost: 3979546.750000, total money: 8528.600039\n",
|
||||
"epoch: 40, total rewards: 1580.255128.3, cost: 5099559.000000, total money: 4018.855103\n",
|
||||
"epoch: 50, total rewards: 1467.990231.3, cost: 4410721.500000, total money: 8490.720211\n",
|
||||
"epoch: 60, total rewards: 1285.420161.3, cost: 3993190.000000, total money: 2688.440118\n",
|
||||
"epoch: 70, total rewards: 391.130068.3, cost: 3420379.000000, total money: 6491.710085\n",
|
||||
"epoch: 80, total rewards: 1276.110108.3, cost: 3443612.750000, total money: 3698.110047\n",
|
||||
"epoch: 90, total rewards: 672.475340.3, cost: 2882908.000000, total money: 208.605285\n",
|
||||
"epoch: 100, total rewards: 706.604982.3, cost: 3108476.500000, total money: 1169.724916\n",
|
||||
"epoch: 110, total rewards: 979.940367.3, cost: 2024909.750000, total money: 3200.720335\n",
|
||||
"epoch: 120, total rewards: 853.199893.3, cost: 4572564.500000, total money: 6070.309879\n",
|
||||
"epoch: 130, total rewards: 1339.975223.3, cost: 3904469.500000, total money: 7475.465274\n",
|
||||
"epoch: 140, total rewards: 1136.924864.3, cost: 4352429.000000, total money: 4448.164854\n",
|
||||
"epoch: 150, total rewards: 1499.745116.3, cost: 2398584.500000, total money: 3999.355042\n",
|
||||
"epoch: 160, total rewards: 481.755190.3, cost: 3168836.250000, total money: 7573.215212\n",
|
||||
"epoch: 170, total rewards: 1733.610290.3, cost: 1907320.875000, total money: 6940.950254\n",
|
||||
"epoch: 180, total rewards: 390.074828.3, cost: 2862924.000000, total money: 5516.364805\n",
|
||||
"epoch: 190, total rewards: 714.815121.3, cost: 2666878.750000, total money: 9726.615109\n",
|
||||
"epoch: 200, total rewards: 1474.129822.3, cost: 3016419.000000, total money: 1901.589906\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
||||
"day 1, sell 1 unit at price 762.130005, investment -0.854691 %, total balance 9993.429993,\n",
|
||||
"day 4: buy 1 unit at price 790.510010, total balance 9202.919983\n",
|
||||
"day 5: buy 1 unit at price 785.309998, total balance 8417.609985\n",
|
||||
"day 8: buy 1 unit at price 736.080017, total balance 7681.529968\n",
|
||||
"day 9: buy 1 unit at price 758.489990, total balance 6923.039978\n",
|
||||
"day 11, sell 1 unit at price 771.229980, investment -2.438936 %, total balance 7694.269958,\n",
|
||||
"day 13: buy 1 unit at price 769.200012, total balance 6925.069946\n",
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 6156.829956\n",
|
||||
"day 19, sell 1 unit at price 758.039978, investment -3.472517 %, total balance 6914.869934,\n",
|
||||
"day 25, sell 1 unit at price 776.419983, investment 5.480378 %, total balance 7691.289917,\n",
|
||||
"day 26: buy 1 unit at price 789.289978, total balance 6901.999939\n",
|
||||
"day 28: buy 1 unit at price 796.099976, total balance 6105.899963\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 5315.099975\n",
|
||||
"day 40, sell 1 unit at price 771.820007, investment 1.757441 %, total balance 6086.919982,\n",
|
||||
"day 46, sell 1 unit at price 804.789978, investment 4.626881 %, total balance 6891.709960,\n",
|
||||
"day 47, sell 1 unit at price 807.909973, investment 5.163749 %, total balance 7699.619933,\n",
|
||||
"day 50: buy 1 unit at price 804.609985, total balance 6895.009948\n",
|
||||
"day 57: buy 1 unit at price 832.150024, total balance 6062.859924\n",
|
||||
"day 58, sell 1 unit at price 823.309998, investment 4.310205 %, total balance 6886.169922,\n",
|
||||
"day 61: buy 1 unit at price 795.695007, total balance 6090.474915\n",
|
||||
"day 62: buy 1 unit at price 798.530029, total balance 5291.944886\n",
|
||||
"day 70: buy 1 unit at price 820.450012, total balance 4471.494874\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 3643.424867\n",
|
||||
"day 76: buy 1 unit at price 831.330017, total balance 2812.094850\n",
|
||||
"day 85: buy 1 unit at price 835.369995, total balance 1976.724855\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 6.220327 %, total balance 2822.344850,\n",
|
||||
"day 91: buy 1 unit at price 848.780029, total balance 1973.564821\n",
|
||||
"day 98: buy 1 unit at price 819.510010, total balance 1154.054811\n",
|
||||
"day 100: buy 1 unit at price 831.409973, total balance 322.644838\n",
|
||||
"day 102, sell 1 unit at price 829.559998, investment 4.901367 %, total balance 1152.204836,\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment 2.355180 %, total balance 1975.764834,\n",
|
||||
"day 113: buy 1 unit at price 836.820007, total balance 1138.944827\n",
|
||||
"day 114, sell 1 unit at price 838.210022, investment 0.728234 %, total balance 1977.154849,\n",
|
||||
"day 117: buy 1 unit at price 862.760010, total balance 1114.394839\n",
|
||||
"day 118: buy 1 unit at price 872.299988, total balance 242.094851\n",
|
||||
"day 132, sell 1 unit at price 937.080017, investment 17.768744 %, total balance 1179.174868,\n",
|
||||
"day 138: buy 1 unit at price 948.820007, total balance 230.354861\n",
|
||||
"day 139, sell 1 unit at price 954.960022, investment 19.589745 %, total balance 1185.314883,\n",
|
||||
"day 140: buy 1 unit at price 969.539978, total balance 215.774905\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment 14.852823 %, total balance 1158.084903,\n",
|
||||
"day 158, sell 1 unit at price 959.450012, investment 15.865809 %, total balance 2117.534915,\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 1151.944888\n",
|
||||
"day 168: buy 1 unit at price 906.690002, total balance 245.254886\n",
|
||||
"day 169, sell 1 unit at price 918.590027, investment 10.496434 %, total balance 1163.844913,\n",
|
||||
"day 176: buy 1 unit at price 965.400024, total balance 198.444889\n",
|
||||
"day 189, sell 1 unit at price 927.960022, investment 11.083715 %, total balance 1126.404911,\n",
|
||||
"day 191: buy 1 unit at price 926.789978, total balance 199.614933\n",
|
||||
"day 195, sell 1 unit at price 922.669983, investment 8.705430 %, total balance 1122.284916,\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment 10.634399 %, total balance 2028.944889,\n",
|
||||
"day 201: buy 1 unit at price 924.690002, total balance 1104.254887\n",
|
||||
"day 202, sell 1 unit at price 927.000000, investment 11.497339 %, total balance 2031.254887,\n",
|
||||
"day 206: buy 1 unit at price 921.289978, total balance 1109.964909\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 182.154911\n",
|
||||
"day 220, sell 1 unit at price 921.809998, investment 10.156305 %, total balance 1103.964909,\n",
|
||||
"day 226, sell 1 unit at price 944.489990, investment 9.473084 %, total balance 2048.454899,\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 9.951851 %, total balance 3007.564884,\n",
|
||||
"day 230: buy 1 unit at price 957.789978, total balance 2049.774906\n",
|
||||
"day 231, sell 1 unit at price 951.679993, investment 0.301426 %, total balance 3001.454899,\n",
|
||||
"day 234: buy 1 unit at price 977.000000, total balance 2024.454899\n",
|
||||
"day 237: buy 1 unit at price 987.830017, total balance 1036.624882\n",
|
||||
"day 238, sell 1 unit at price 989.679993, investment 2.077275 %, total balance 2026.304875,\n",
|
||||
"day 240: buy 1 unit at price 992.179993, total balance 1034.124882\n",
|
||||
"day 241: buy 1 unit at price 992.809998, total balance 41.314884\n",
|
||||
"day 242, sell 1 unit at price 984.450012, investment 1.953208 %, total balance 1025.764896,\n",
|
||||
"day 248, sell 1 unit at price 1019.270020, investment 12.416594 %, total balance 2045.034916,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"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
|
||||
}
|
||||
+866
@@ -0,0 +1,866 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\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": [
|
||||
{
|
||||
"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>signal</th>\n",
|
||||
" <th>short_ma</th>\n",
|
||||
" <th>long_ma</th>\n",
|
||||
" <th>positions</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>768.700012</td>\n",
|
||||
" <td>768.700012</td>\n",
|
||||
" <td>NaN</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>765.415008</td>\n",
|
||||
" <td>765.415008</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>764.283346</td>\n",
|
||||
" <td>764.283346</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>768.842514</td>\n",
|
||||
" <td>768.842514</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>773.176013</td>\n",
|
||||
" <td>773.176013</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>5</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>775.198344</td>\n",
|
||||
" <td>775.198344</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>6</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>774.175008</td>\n",
|
||||
" <td>773.392866</td>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>7</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>772.823344</td>\n",
|
||||
" <td>770.971260</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>8</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>768.500010</td>\n",
|
||||
" <td>767.094456</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>9</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>764.495005</td>\n",
|
||||
" <td>766.234009</td>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>10</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>760.156667</td>\n",
|
||||
" <td>766.074552</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>11</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>757.809998</td>\n",
|
||||
" <td>766.504171</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>12</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>757.473327</td>\n",
|
||||
" <td>765.824168</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>13</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>760.003326</td>\n",
|
||||
" <td>766.413335</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>14</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>765.368327</td>\n",
|
||||
" <td>766.934169</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>15</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>765.784993</td>\n",
|
||||
" <td>765.139999</td>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>16</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>765.318329</td>\n",
|
||||
" <td>762.737498</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>17</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>764.819997</td>\n",
|
||||
" <td>761.314997</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>18</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>766.536672</td>\n",
|
||||
" <td>762.005000</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>19</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>764.676666</td>\n",
|
||||
" <td>762.339996</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>20</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>761.284993</td>\n",
|
||||
" <td>763.326660</td>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>21</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>759.536662</td>\n",
|
||||
" <td>762.660828</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>22</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>759.676666</td>\n",
|
||||
" <td>762.497498</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>23</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>758.154999</td>\n",
|
||||
" <td>761.487498</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>24</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>758.213328</td>\n",
|
||||
" <td>762.375000</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>25</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>761.276662</td>\n",
|
||||
" <td>762.976664</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>26</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>768.171661</td>\n",
|
||||
" <td>764.728327</td>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>27</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>774.633331</td>\n",
|
||||
" <td>767.084997</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>28</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>780.229991</td>\n",
|
||||
" <td>769.953328</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>29</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>786.556661</td>\n",
|
||||
" <td>772.355830</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>...</th>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>222</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>924.373332</td>\n",
|
||||
" <td>927.728338</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>223</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>924.943339</td>\n",
|
||||
" <td>927.788340</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>224</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>925.056671</td>\n",
|
||||
" <td>926.540003</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>225</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>926.700002</td>\n",
|
||||
" <td>926.403335</td>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>226</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>930.480001</td>\n",
|
||||
" <td>927.687500</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>227</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>933.466664</td>\n",
|
||||
" <td>929.139999</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>228</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>937.909993</td>\n",
|
||||
" <td>931.141662</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>229</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>942.033325</td>\n",
|
||||
" <td>933.488332</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>230</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>948.169993</td>\n",
|
||||
" <td>936.613332</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>231</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>952.639994</td>\n",
|
||||
" <td>939.669998</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>232</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>956.885000</td>\n",
|
||||
" <td>943.682500</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>233</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>961.783335</td>\n",
|
||||
" <td>947.625000</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>234</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>964.765005</td>\n",
|
||||
" <td>951.337499</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>235</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>967.986664</td>\n",
|
||||
" <td>955.009995</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>236</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>973.230001</td>\n",
|
||||
" <td>960.699997</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>237</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>979.255005</td>\n",
|
||||
" <td>965.947500</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>238</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>982.541667</td>\n",
|
||||
" <td>969.713333</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>239</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>984.726664</td>\n",
|
||||
" <td>973.255000</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>240</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>987.256663</td>\n",
|
||||
" <td>976.010834</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>241</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>990.625000</td>\n",
|
||||
" <td>979.305832</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>242</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>989.825002</td>\n",
|
||||
" <td>981.527502</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>243</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>989.886668</td>\n",
|
||||
" <td>984.570836</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>244</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>986.348338</td>\n",
|
||||
" <td>984.445002</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>245</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>982.771667</td>\n",
|
||||
" <td>983.749166</td>\n",
|
||||
" <td>-1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>246</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>979.630005</td>\n",
|
||||
" <td>983.443334</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>247</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>976.255005</td>\n",
|
||||
" <td>983.440002</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>248</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>982.058339</td>\n",
|
||||
" <td>985.941671</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>249</th>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" <td>986.876668</td>\n",
|
||||
" <td>988.381668</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>250</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>994.908335</td>\n",
|
||||
" <td>990.628337</td>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>251</th>\n",
|
||||
" <td>1.0</td>\n",
|
||||
" <td>1004.068339</td>\n",
|
||||
" <td>993.420003</td>\n",
|
||||
" <td>0.0</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"<p>252 rows × 4 columns</p>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" signal short_ma long_ma positions\n",
|
||||
"0 0.0 768.700012 768.700012 NaN\n",
|
||||
"1 0.0 765.415008 765.415008 0.0\n",
|
||||
"2 0.0 764.283346 764.283346 0.0\n",
|
||||
"3 0.0 768.842514 768.842514 0.0\n",
|
||||
"4 0.0 773.176013 773.176013 0.0\n",
|
||||
"5 0.0 775.198344 775.198344 0.0\n",
|
||||
"6 1.0 774.175008 773.392866 1.0\n",
|
||||
"7 1.0 772.823344 770.971260 0.0\n",
|
||||
"8 1.0 768.500010 767.094456 0.0\n",
|
||||
"9 0.0 764.495005 766.234009 -1.0\n",
|
||||
"10 0.0 760.156667 766.074552 0.0\n",
|
||||
"11 0.0 757.809998 766.504171 0.0\n",
|
||||
"12 0.0 757.473327 765.824168 0.0\n",
|
||||
"13 0.0 760.003326 766.413335 0.0\n",
|
||||
"14 0.0 765.368327 766.934169 0.0\n",
|
||||
"15 1.0 765.784993 765.139999 1.0\n",
|
||||
"16 1.0 765.318329 762.737498 0.0\n",
|
||||
"17 1.0 764.819997 761.314997 0.0\n",
|
||||
"18 1.0 766.536672 762.005000 0.0\n",
|
||||
"19 1.0 764.676666 762.339996 0.0\n",
|
||||
"20 0.0 761.284993 763.326660 -1.0\n",
|
||||
"21 0.0 759.536662 762.660828 0.0\n",
|
||||
"22 0.0 759.676666 762.497498 0.0\n",
|
||||
"23 0.0 758.154999 761.487498 0.0\n",
|
||||
"24 0.0 758.213328 762.375000 0.0\n",
|
||||
"25 0.0 761.276662 762.976664 0.0\n",
|
||||
"26 1.0 768.171661 764.728327 1.0\n",
|
||||
"27 1.0 774.633331 767.084997 0.0\n",
|
||||
"28 1.0 780.229991 769.953328 0.0\n",
|
||||
"29 1.0 786.556661 772.355830 0.0\n",
|
||||
".. ... ... ... ...\n",
|
||||
"222 0.0 924.373332 927.728338 0.0\n",
|
||||
"223 0.0 924.943339 927.788340 0.0\n",
|
||||
"224 0.0 925.056671 926.540003 0.0\n",
|
||||
"225 1.0 926.700002 926.403335 1.0\n",
|
||||
"226 1.0 930.480001 927.687500 0.0\n",
|
||||
"227 1.0 933.466664 929.139999 0.0\n",
|
||||
"228 1.0 937.909993 931.141662 0.0\n",
|
||||
"229 1.0 942.033325 933.488332 0.0\n",
|
||||
"230 1.0 948.169993 936.613332 0.0\n",
|
||||
"231 1.0 952.639994 939.669998 0.0\n",
|
||||
"232 1.0 956.885000 943.682500 0.0\n",
|
||||
"233 1.0 961.783335 947.625000 0.0\n",
|
||||
"234 1.0 964.765005 951.337499 0.0\n",
|
||||
"235 1.0 967.986664 955.009995 0.0\n",
|
||||
"236 1.0 973.230001 960.699997 0.0\n",
|
||||
"237 1.0 979.255005 965.947500 0.0\n",
|
||||
"238 1.0 982.541667 969.713333 0.0\n",
|
||||
"239 1.0 984.726664 973.255000 0.0\n",
|
||||
"240 1.0 987.256663 976.010834 0.0\n",
|
||||
"241 1.0 990.625000 979.305832 0.0\n",
|
||||
"242 1.0 989.825002 981.527502 0.0\n",
|
||||
"243 1.0 989.886668 984.570836 0.0\n",
|
||||
"244 1.0 986.348338 984.445002 0.0\n",
|
||||
"245 0.0 982.771667 983.749166 -1.0\n",
|
||||
"246 0.0 979.630005 983.443334 0.0\n",
|
||||
"247 0.0 976.255005 983.440002 0.0\n",
|
||||
"248 0.0 982.058339 985.941671 0.0\n",
|
||||
"249 0.0 986.876668 988.381668 0.0\n",
|
||||
"250 1.0 994.908335 990.628337 1.0\n",
|
||||
"251 1.0 1004.068339 993.420003 0.0\n",
|
||||
"\n",
|
||||
"[252 rows x 4 columns]"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"short_window = int(0.025 * len(df))\n",
|
||||
"long_window = int(0.05 * len(df))\n",
|
||||
"\n",
|
||||
"signals = pd.DataFrame(index=df.index)\n",
|
||||
"signals['signal'] = 0.0\n",
|
||||
"\n",
|
||||
"signals['short_ma'] = df['Close'].rolling(window=short_window, min_periods=1, center=False).mean()\n",
|
||||
"signals['long_ma'] = df['Close'].rolling(window=long_window, min_periods=1, center=False).mean()\n",
|
||||
"\n",
|
||||
"signals['signal'][short_window:] = np.where(signals['short_ma'][short_window:] \n",
|
||||
" > signals['long_ma'][short_window:], 1.0, 0.0) \n",
|
||||
"signals['positions'] = signals['signal'].diff()\n",
|
||||
"\n",
|
||||
"signals"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def buy_stock(\n",
|
||||
" real_movement,\n",
|
||||
" signal,\n",
|
||||
" initial_money = 10000,\n",
|
||||
" max_buy = 1,\n",
|
||||
" max_sell = 1,\n",
|
||||
"):\n",
|
||||
" \"\"\"\n",
|
||||
" real_movement = actual movement in the real world\n",
|
||||
" delay = how much interval you want to delay to change our decision from buy to sell, vice versa\n",
|
||||
" initial_state = 1 is buy, 0 is sell\n",
|
||||
" initial_money = 1000, ignore what kind of currency\n",
|
||||
" max_buy = max quantity for share to buy\n",
|
||||
" max_sell = max quantity for share to sell\n",
|
||||
" \"\"\"\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" current_inventory = 0\n",
|
||||
"\n",
|
||||
" def buy(i, initial_money, current_inventory):\n",
|
||||
" shares = initial_money // real_movement[i]\n",
|
||||
" if shares < 1:\n",
|
||||
" print(\n",
|
||||
" 'day %d: total balances %f, not enough money to buy a unit price %f'\n",
|
||||
" % (i, initial_money, real_movement[i])\n",
|
||||
" )\n",
|
||||
" else:\n",
|
||||
" if shares > max_buy:\n",
|
||||
" buy_units = max_buy\n",
|
||||
" else:\n",
|
||||
" buy_units = shares\n",
|
||||
" initial_money -= buy_units * real_movement[i]\n",
|
||||
" current_inventory += buy_units\n",
|
||||
" print(\n",
|
||||
" 'day %d: buy %d units at price %f, total balance %f'\n",
|
||||
" % (i, buy_units, buy_units * real_movement[i], initial_money)\n",
|
||||
" )\n",
|
||||
" states_buy.append(0)\n",
|
||||
" return initial_money, current_inventory\n",
|
||||
"\n",
|
||||
" for i in range(real_movement.shape[0] - int(0.025 * len(df))):\n",
|
||||
" state = signal[i]\n",
|
||||
" if state == 1:\n",
|
||||
" initial_money, current_inventory = buy(\n",
|
||||
" i, initial_money, current_inventory\n",
|
||||
" )\n",
|
||||
" states_buy.append(i)\n",
|
||||
" elif state == -1:\n",
|
||||
" if current_inventory == 0:\n",
|
||||
" print('day %d: cannot sell anything, inventory 0' % (i))\n",
|
||||
" else:\n",
|
||||
" if current_inventory > max_sell:\n",
|
||||
" sell_units = max_sell\n",
|
||||
" else:\n",
|
||||
" sell_units = current_inventory\n",
|
||||
" current_inventory -= sell_units\n",
|
||||
" total_sell = sell_units * real_movement[i]\n",
|
||||
" initial_money += total_sell\n",
|
||||
" try:\n",
|
||||
" invest = (\n",
|
||||
" (real_movement[i] - real_movement[states_buy[-1]])\n",
|
||||
" / real_movement[states_buy[-1]]\n",
|
||||
" ) * 100\n",
|
||||
" except:\n",
|
||||
" invest = 0\n",
|
||||
" print(\n",
|
||||
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
|
||||
" % (i, sell_units, total_sell, invest, initial_money)\n",
|
||||
" )\n",
|
||||
" states_sell.append(i)\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": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 6: buy 1 units at price 762.559998, total balance 9237.440002\n",
|
||||
"day 9, sell 1 units at price 758.489990, investment -0.533730 %, total balance 9995.929992,\n",
|
||||
"day 15: buy 1 units at price 760.989990, total balance 9234.940002\n",
|
||||
"day 20, sell 1 units at price 747.919983, investment -1.717501 %, total balance 9982.859985,\n",
|
||||
"day 26: buy 1 units at price 789.289978, total balance 9193.570007\n",
|
||||
"day 37, sell 1 units at price 791.549988, investment 0.286335 %, total balance 9985.119995,\n",
|
||||
"day 45: buy 1 units at price 806.650024, total balance 9178.469971\n",
|
||||
"day 62, sell 1 units at price 798.530029, investment -1.006632 %, total balance 9977.000000,\n",
|
||||
"day 69: buy 1 units at price 819.239990, total balance 9157.760010\n",
|
||||
"day 84, sell 1 units at price 831.909973, investment 1.546553 %, total balance 9989.669983,\n",
|
||||
"day 85: buy 1 units at price 835.369995, total balance 9154.299988\n",
|
||||
"day 96, sell 1 units at price 817.580017, investment -2.129593 %, total balance 9971.880005,\n",
|
||||
"day 104: buy 1 units at price 834.570007, total balance 9137.309998\n",
|
||||
"day 109, sell 1 units at price 823.349976, investment -1.344409 %, total balance 9960.659974,\n",
|
||||
"day 114: buy 1 units at price 838.210022, total balance 9122.449952\n",
|
||||
"day 151, sell 1 units at price 942.900024, investment 12.489710 %, total balance 10065.349976,\n",
|
||||
"day 160: buy 1 units at price 965.590027, total balance 9099.759949\n",
|
||||
"day 164, sell 1 units at price 917.789978, investment -4.950346 %, total balance 10017.549927,\n",
|
||||
"day 173: buy 1 units at price 947.159973, total balance 9070.389954\n",
|
||||
"day 184, sell 1 units at price 941.530029, investment -0.594403 %, total balance 10011.919983,\n",
|
||||
"day 204: buy 1 units at price 915.890015, total balance 9096.029968\n",
|
||||
"day 218, sell 1 units at price 920.289978, investment 0.480403 %, total balance 10016.319946,\n",
|
||||
"day 225: buy 1 units at price 924.859985, total balance 9091.459961\n",
|
||||
"day 245, sell 1 units at price 970.539978, investment 4.939125 %, total balance 10061.999939,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = buy_stock(df.Close, signals['positions'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1080x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df['Close']\n",
|
||||
"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
|
||||
}
|
||||
+623
@@ -0,0 +1,623 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 500\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, self.state_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, self.state_size))\n",
|
||||
" self.ACTION = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.REWARD = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.batch_size = tf.shape(self.ACTION)[0]\n",
|
||||
" \n",
|
||||
" with tf.variable_scope('curiosity_model'):\n",
|
||||
" action = tf.reshape(self.ACTION, (-1,1))\n",
|
||||
" state_action = tf.concat([self.X, action], axis=1)\n",
|
||||
" save_state = tf.identity(self.Y)\n",
|
||||
" \n",
|
||||
" feed = tf.layers.dense(state_action, 32, activation=tf.nn.relu)\n",
|
||||
" self.curiosity_logits = tf.layers.dense(feed, self.state_size)\n",
|
||||
" self.curiosity_cost = tf.reduce_sum(tf.square(save_state - self.curiosity_logits), axis=1)\n",
|
||||
" \n",
|
||||
" self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
|
||||
" .minimize(tf.reduce_mean(self.curiosity_cost))\n",
|
||||
" \n",
|
||||
" total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"q_model\"):\n",
|
||||
" with tf.variable_scope(\"eval_net\"):\n",
|
||||
" x_action = tf.layers.dense(self.X, 128, tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(x_action,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" self.logits = feed_validation + \\\n",
|
||||
" tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" \n",
|
||||
" with tf.variable_scope(\"target_net\"):\n",
|
||||
" y_action = tf.layers.dense(self.Y, 128, tf.nn.relu)\n",
|
||||
" tensor_action, tensor_validation = tf.split(y_action,2,1)\n",
|
||||
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
|
||||
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
||||
" y_q = feed_validation + \\\n",
|
||||
" tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
||||
" \n",
|
||||
" q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
|
||||
" action = tf.cast(self.ACTION, tf.int32)\n",
|
||||
" action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
|
||||
" q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
|
||||
" self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
|
||||
" self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
|
||||
" self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
|
||||
" \n",
|
||||
" t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
|
||||
" e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
|
||||
" self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
|
||||
" \n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, done):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\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 predict(self, inputs):\n",
|
||||
" return self.sess.run(self.logits, feed_dict={self.X:inputs})\n",
|
||||
" \n",
|
||||
" def get_predicted_action(self, sequence):\n",
|
||||
" prediction = self.predict(np.array(sequence))[0]\n",
|
||||
" return np.argmax(prediction)\n",
|
||||
" \n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
" \n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" actions = np.array([a[1] for a in replay])\n",
|
||||
" rewards = np.array([a[2] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.target_replace_op)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
|
||||
" })\n",
|
||||
" \n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
|
||||
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
|
||||
" })\n",
|
||||
" return cost\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" state = next_state\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" cost = self._construct_memories(replay)\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From <ipython-input-3-e49b5b607a66>:53: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"keep_dims is deprecated, use keepdims instead\n",
|
||||
"epoch: 10, total rewards: 698.460085.3, cost: 596251.000000, total money: 10698.460085\n",
|
||||
"epoch: 20, total rewards: 1683.164917.3, cost: 5890915.500000, total money: 6720.204895\n",
|
||||
"epoch: 30, total rewards: 1686.875004.3, cost: 75077.554688, total money: 6721.424992\n",
|
||||
"epoch: 40, total rewards: 541.999876.3, cost: 2707843.750000, total money: 9525.359861\n",
|
||||
"epoch: 50, total rewards: 1668.824950.3, cost: 32719.388672, total money: 7666.774900\n",
|
||||
"epoch: 60, total rewards: 751.654909.3, cost: 1165742.750000, total money: 8743.134889\n",
|
||||
"epoch: 70, total rewards: 1637.889772.3, cost: 325201.937500, total money: 6669.909730\n",
|
||||
"epoch: 80, total rewards: 587.055053.3, cost: 1527037.250000, total money: 892.705077\n",
|
||||
"epoch: 90, total rewards: 2170.969727.3, cost: 122936.546875, total money: 8204.549683\n",
|
||||
"epoch: 100, total rewards: 1565.850155.3, cost: 844705.187500, total money: 19.270138\n",
|
||||
"epoch: 110, total rewards: 1733.244930.3, cost: 557043.125000, total money: 6744.174861\n",
|
||||
"epoch: 120, total rewards: 1282.489866.3, cost: 3785043.750000, total money: 8328.149839\n",
|
||||
"epoch: 130, total rewards: 1260.559873.3, cost: 596946.312500, total money: 6319.639890\n",
|
||||
"epoch: 140, total rewards: 1346.769778.3, cost: 26543662.000000, total money: 10330.129763\n",
|
||||
"epoch: 150, total rewards: 2415.594848.3, cost: 851761.625000, total money: 9467.174865\n",
|
||||
"epoch: 160, total rewards: 1033.800112.3, cost: 3596937.500000, total money: 9044.600099\n",
|
||||
"epoch: 170, total rewards: 1597.439823.3, cost: 511038.375000, total money: 93.789859\n",
|
||||
"epoch: 180, total rewards: 1736.860354.3, cost: 3795484.000000, total money: 1011.990359\n",
|
||||
"epoch: 190, total rewards: 1682.540215.3, cost: 657330.250000, total money: 8675.460198\n",
|
||||
"epoch: 200, total rewards: 875.094668.3, cost: 30907612.000000, total money: 10875.094668\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 3: buy 1 unit at price 782.520020, total balance 9217.479980\n",
|
||||
"day 4: buy 1 unit at price 790.510010, total balance 8426.969970\n",
|
||||
"day 5: buy 1 unit at price 785.309998, total balance 7641.659972\n",
|
||||
"day 6: buy 1 unit at price 762.559998, total balance 6879.099974\n",
|
||||
"day 7: buy 1 unit at price 754.020020, total balance 6125.079954\n",
|
||||
"day 9: buy 1 unit at price 758.489990, total balance 5366.589964\n",
|
||||
"day 10, sell 1 unit at price 764.479980, investment -2.305377 %, total balance 6131.069944,\n",
|
||||
"day 11: buy 1 unit at price 771.229980, total balance 5359.839964\n",
|
||||
"day 13: buy 1 unit at price 769.200012, total balance 4590.639952\n",
|
||||
"day 15: buy 1 unit at price 760.989990, total balance 3829.649962\n",
|
||||
"day 16: buy 1 unit at price 761.679993, total balance 3067.969969\n",
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 2299.729979\n",
|
||||
"day 19: buy 1 unit at price 758.039978, total balance 1541.690001\n",
|
||||
"day 21: buy 1 unit at price 750.500000, total balance 791.190001\n",
|
||||
"day 22, sell 1 unit at price 762.520020, investment -3.540751 %, total balance 1553.710021,\n",
|
||||
"day 23, sell 1 unit at price 759.109985, investment -3.336264 %, total balance 2312.820006,\n",
|
||||
"day 24: buy 1 unit at price 771.190002, total balance 1541.630004\n",
|
||||
"day 25, sell 1 unit at price 776.419983, investment 1.817560 %, total balance 2318.049987,\n",
|
||||
"day 27, sell 1 unit at price 789.270020, investment 4.674942 %, total balance 3107.320007,\n",
|
||||
"day 29, sell 1 unit at price 797.070007, investment 5.086424 %, total balance 3904.390014,\n",
|
||||
"day 30, sell 1 unit at price 797.849976, investment 3.451629 %, total balance 4702.239990,\n",
|
||||
"day 32: buy 1 unit at price 794.200012, total balance 3908.039978\n",
|
||||
"day 33, sell 1 unit at price 796.419983, investment 3.538738 %, total balance 4704.459961,\n",
|
||||
"day 34, sell 1 unit at price 794.559998, investment 4.411360 %, total balance 5499.019959,\n",
|
||||
"day 38: buy 1 unit at price 785.049988, total balance 4713.969971\n",
|
||||
"day 39, sell 1 unit at price 782.789978, investment 2.771503 %, total balance 5496.759949,\n",
|
||||
"day 40, sell 1 unit at price 771.820007, investment 0.466002 %, total balance 6268.579956,\n",
|
||||
"day 41: buy 1 unit at price 786.140015, total balance 5482.439941\n",
|
||||
"day 45: buy 1 unit at price 806.650024, total balance 4675.789917\n",
|
||||
"day 47, sell 1 unit at price 807.909973, investment 6.578808 %, total balance 5483.699890,\n",
|
||||
"day 50: buy 1 unit at price 804.609985, total balance 4679.089905\n",
|
||||
"day 51, sell 1 unit at price 806.070007, investment 7.404398 %, total balance 5485.159912,\n",
|
||||
"day 52, sell 1 unit at price 802.174988, investment 4.017815 %, total balance 6287.334900,\n",
|
||||
"day 53: buy 1 unit at price 805.020020, total balance 5482.314880\n",
|
||||
"day 54, sell 1 unit at price 819.309998, investment 3.161670 %, total balance 6301.624878,\n",
|
||||
"day 56: buy 1 unit at price 835.669983, total balance 5465.954895\n",
|
||||
"day 58, sell 1 unit at price 823.309998, investment 4.873576 %, total balance 6289.264893,\n",
|
||||
"day 59, sell 1 unit at price 802.320007, investment 2.058157 %, total balance 7091.584900,\n",
|
||||
"day 60: buy 1 unit at price 796.789978, total balance 6294.794922\n",
|
||||
"day 61, sell 1 unit at price 795.695007, investment -1.358088 %, total balance 7090.489929,\n",
|
||||
"day 62, sell 1 unit at price 798.530029, investment -0.755640 %, total balance 7889.019958,\n",
|
||||
"day 63, sell 1 unit at price 801.489990, investment -0.438502 %, total balance 8690.509948,\n",
|
||||
"day 66: buy 1 unit at price 808.380005, total balance 7882.129943\n",
|
||||
"day 67, sell 1 unit at price 809.559998, investment -3.124437 %, total balance 8691.689941,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 7878.019958\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 2.817557 %, total balance 8697.259948,\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 1.493111 %, total balance 9517.709960,\n",
|
||||
"day 72, sell 1 unit at price 824.159973, investment 1.289219 %, total balance 10341.869933,\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 9513.799926\n",
|
||||
"day 74, sell 1 unit at price 831.659973, investment 0.433534 %, total balance 10345.459899,\n",
|
||||
"day 75: buy 1 unit at price 830.760010, total balance 9514.699889\n",
|
||||
"day 76: buy 1 unit at price 831.330017, total balance 8683.369872\n",
|
||||
"day 78: buy 1 unit at price 829.280029, total balance 7854.089843\n",
|
||||
"day 79: buy 1 unit at price 823.210022, total balance 7030.879821\n",
|
||||
"day 80: buy 1 unit at price 835.239990, total balance 6195.639831\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment -0.015649 %, total balance 7026.269836,\n",
|
||||
"day 82, sell 1 unit at price 829.080017, investment -0.270651 %, total balance 7855.349853,\n",
|
||||
"day 84, sell 1 unit at price 831.909973, investment 0.317136 %, total balance 8687.259826,\n",
|
||||
"day 85: buy 1 unit at price 835.369995, total balance 7851.889831\n",
|
||||
"day 86: buy 1 unit at price 838.679993, total balance 7013.209838\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 6167.669860\n",
|
||||
"day 89: buy 1 unit at price 845.619995, total balance 5322.049865\n",
|
||||
"day 90, sell 1 unit at price 847.200012, investment 2.914200 %, total balance 6169.249877,\n",
|
||||
"day 91: buy 1 unit at price 848.780029, total balance 5320.469848\n",
|
||||
"day 92: buy 1 unit at price 852.119995, total balance 4468.349853\n",
|
||||
"day 93, sell 1 unit at price 848.400024, investment 1.575599 %, total balance 5316.749877,\n",
|
||||
"day 94: buy 1 unit at price 830.460022, total balance 4486.289855\n",
|
||||
"day 95: buy 1 unit at price 829.590027, total balance 3656.699828\n",
|
||||
"day 96, sell 1 unit at price 817.580017, investment -2.129593 %, total balance 4474.279845,\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 3659.849852\n",
|
||||
"day 98, sell 1 unit at price 819.510010, investment -2.285733 %, total balance 4479.359862,\n",
|
||||
"day 100: buy 1 unit at price 831.409973, total balance 3647.949889\n",
|
||||
"day 101, sell 1 unit at price 831.500000, investment -1.660475 %, total balance 4479.449889,\n",
|
||||
"day 103: buy 1 unit at price 838.549988, total balance 3640.899901\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 2806.329894\n",
|
||||
"day 105, sell 1 unit at price 831.409973, investment -1.680426 %, total balance 3637.739867,\n",
|
||||
"day 106: buy 1 unit at price 827.880005, total balance 2809.859862\n",
|
||||
"day 108: buy 1 unit at price 824.729980, total balance 1985.129882\n",
|
||||
"day 109: buy 1 unit at price 823.349976, total balance 1161.779906\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 337.459899\n",
|
||||
"day 112, sell 1 unit at price 837.169983, investment -1.367851 %, total balance 1174.629882,\n",
|
||||
"day 113: buy 1 unit at price 836.820007, total balance 337.809875\n",
|
||||
"day 115, sell 1 unit at price 841.650024, investment -1.228697 %, total balance 1179.459899,\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 1.532883 %, total balance 2022.649901,\n",
|
||||
"day 117, sell 1 unit at price 862.760010, investment 3.998358 %, total balance 2885.409911,\n",
|
||||
"day 118: buy 1 unit at price 872.299988, total balance 2013.109923\n",
|
||||
"day 119, sell 1 unit at price 871.729980, investment 7.035594 %, total balance 2884.839903,\n",
|
||||
"day 120, sell 1 unit at price 874.250000, investment 5.152696 %, total balance 3759.089903,\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 9.288655 %, total balance 4675.529905,\n",
|
||||
"day 124: buy 1 unit at price 927.039978, total balance 3748.489927\n",
|
||||
"day 126, sell 1 unit at price 927.130005, investment 11.090741 %, total balance 4675.619932,\n",
|
||||
"day 127, sell 1 unit at price 934.299988, investment 12.854518 %, total balance 5609.919920,\n",
|
||||
"day 128, sell 1 unit at price 932.169983, investment 13.027294 %, total balance 6542.089903,\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 5613.309874\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 14.532098 %, total balance 6556.309874,\n",
|
||||
"day 137, sell 1 unit at price 941.859985, investment 14.259023 %, total balance 7498.169859,\n",
|
||||
"day 140, sell 1 unit at price 969.539978, investment 15.860038 %, total balance 8467.709837,\n",
|
||||
"day 141: buy 1 unit at price 971.469971, total balance 7496.239866\n",
|
||||
"day 142, sell 1 unit at price 975.880005, investment 11.874357 %, total balance 8472.119871,\n",
|
||||
"day 143, sell 1 unit at price 964.859985, investment 4.079652 %, total balance 9436.979856,\n",
|
||||
"day 144, sell 1 unit at price 966.950012, investment 4.109690 %, total balance 10403.929868,\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.425129 %, total balance 11379.529844,\n",
|
||||
"day 147: buy 1 unit at price 976.570007, total balance 10402.959837\n",
|
||||
"day 148: buy 1 unit at price 980.940002, total balance 9422.019835\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 0.700407 %, total balance 10405.429808,\n",
|
||||
"day 150: buy 1 unit at price 949.830017, total balance 9455.599791\n",
|
||||
"day 151, sell 1 unit at price 942.900024, investment -3.877911 %, total balance 10398.499815,\n",
|
||||
"day 152, sell 1 unit at price 953.400024, investment 0.375857 %, total balance 11351.899839,\n",
|
||||
"day 153: buy 1 unit at price 950.760010, total balance 10401.139829\n",
|
||||
"day 155, sell 1 unit at price 939.780029, investment -1.154864 %, total balance 11340.919858,\n",
|
||||
"day 156: buy 1 unit at price 957.369995, total balance 10383.549863\n",
|
||||
"day 157: buy 1 unit at price 950.630005, total balance 9432.919858\n",
|
||||
"day 158: buy 1 unit at price 959.450012, total balance 8473.469846\n",
|
||||
"day 159, sell 1 unit at price 957.090027, investment -0.029243 %, total balance 9430.559873,\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 8464.969846\n",
|
||||
"day 162, sell 1 unit at price 927.330017, investment -2.451005 %, total balance 9392.299863,\n",
|
||||
"day 163: buy 1 unit at price 940.489990, total balance 8451.809873\n",
|
||||
"day 164: buy 1 unit at price 917.789978, total balance 7534.019895\n",
|
||||
"day 165: buy 1 unit at price 908.729980, total balance 6625.289915\n",
|
||||
"day 166, sell 1 unit at price 898.700012, investment -6.331752 %, total balance 7523.989927,\n",
|
||||
"day 167, sell 1 unit at price 911.710022, investment -5.580008 %, total balance 8435.699949,\n",
|
||||
"day 169: buy 1 unit at price 918.590027, total balance 7517.109922\n",
|
||||
"day 170: buy 1 unit at price 928.799988, total balance 6588.309934\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 5658.219907\n",
|
||||
"day 172: buy 1 unit at price 943.830017, total balance 4714.389890\n",
|
||||
"day 173: buy 1 unit at price 947.159973, total balance 3767.229917\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 2813.809934\n",
|
||||
"day 177: buy 1 unit at price 970.890015, total balance 1842.919919\n",
|
||||
"day 178, sell 1 unit at price 968.150024, investment 2.941024 %, total balance 2811.069943,\n",
|
||||
"day 179: buy 1 unit at price 972.919983, total balance 1838.149960\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 857.809933\n",
|
||||
"day 187, sell 1 unit at price 930.390015, investment 1.372867 %, total balance 1788.199948,\n",
|
||||
"day 189, sell 1 unit at price 927.960022, investment 2.116145 %, total balance 2716.159970,\n",
|
||||
"day 190, sell 1 unit at price 929.359985, investment 1.172444 %, total balance 3645.519955,\n",
|
||||
"day 191, sell 1 unit at price 926.789978, investment -0.216409 %, total balance 4572.309933,\n",
|
||||
"day 192, sell 1 unit at price 922.900024, investment -0.773044 %, total balance 5495.209957,\n",
|
||||
"day 193: buy 1 unit at price 907.239990, total balance 4587.969967\n",
|
||||
"day 196, sell 1 unit at price 922.219971, investment -2.289612 %, total balance 5510.189938,\n",
|
||||
"day 197, sell 1 unit at price 926.960022, investment -2.132686 %, total balance 6437.149960,\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -4.451344 %, total balance 7348.129940,\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment -6.615584 %, total balance 8254.789913,\n",
|
||||
"day 201: buy 1 unit at price 924.690002, total balance 7330.099911\n",
|
||||
"day 202: buy 1 unit at price 927.000000, total balance 6403.099911\n",
|
||||
"day 204: buy 1 unit at price 915.890015, total balance 5487.209896\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 4573.399898\n",
|
||||
"day 206: buy 1 unit at price 921.289978, total balance 3652.109920\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 2722.539913\n",
|
||||
"day 208: buy 1 unit at price 939.330017, total balance 1783.209896\n",
|
||||
"day 209: buy 1 unit at price 937.340027, total balance 845.869869\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment -4.570774 %, total balance 1774.319881,\n",
|
||||
"day 211: buy 1 unit at price 927.809998, total balance 846.509883\n",
|
||||
"day 215, sell 1 unit at price 932.070007, investment -4.923804 %, total balance 1778.579890,\n",
|
||||
"day 218: buy 1 unit at price 920.289978, total balance 858.289912\n",
|
||||
"day 219, sell 1 unit at price 915.000000, investment 0.855343 %, total balance 1773.289912,\n",
|
||||
"day 220, sell 1 unit at price 921.809998, investment -0.311456 %, total balance 2695.099910,\n",
|
||||
"day 221, sell 1 unit at price 931.580017, investment 0.494069 %, total balance 3626.679927,\n",
|
||||
"day 223: buy 1 unit at price 928.530029, total balance 2698.149898\n",
|
||||
"day 225, sell 1 unit at price 924.859985, investment 0.979372 %, total balance 3623.009883,\n",
|
||||
"day 228: buy 1 unit at price 959.109985, total balance 2663.899898\n",
|
||||
"day 230, sell 1 unit at price 957.789978, investment 4.812814 %, total balance 3621.689876,\n",
|
||||
"day 231, sell 1 unit at price 951.679993, investment 3.298637 %, total balance 4573.369869,\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 4.345021 %, total balance 5543.329891,\n",
|
||||
"day 233, sell 1 unit at price 978.890015, investment 4.211512 %, total balance 6522.219906,\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment 4.231119 %, total balance 7499.219906,\n",
|
||||
"day 235, sell 1 unit at price 972.599976, investment 4.827495 %, total balance 8471.819882,\n",
|
||||
"day 236, sell 1 unit at price 989.250000, investment 7.493293 %, total balance 9461.069882,\n",
|
||||
"day 239: buy 1 unit at price 992.000000, total balance 8469.069882\n",
|
||||
"day 240, sell 1 unit at price 992.179993, investment 6.854917 %, total balance 9461.249875,\n",
|
||||
"day 242, sell 1 unit at price 984.450012, investment 2.642036 %, total balance 10445.699887,\n",
|
||||
"day 243: buy 1 unit at price 988.200012, total balance 9457.499875\n",
|
||||
"day 245, sell 1 unit at price 970.539978, investment -2.163309 %, total balance 10428.039853,\n",
|
||||
"day 246, sell 1 unit at price 973.330017, investment -1.504756 %, total balance 11401.369870,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+633
@@ -0,0 +1,633 @@
|
||||
{
|
||||
"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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 truncated
|
||||
"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
|
||||
}
|
||||
+680
@@ -0,0 +1,680 @@
|
||||
{
|
||||
"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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 truncated
|
||||
"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
|
||||
}
|
||||
+399
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\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": 14,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def abcd(trend, skip_loop = 4, ma = 7):\n",
|
||||
" ma = pd.Series(trend).rolling(ma).mean().values\n",
|
||||
" x = []\n",
|
||||
" for a in range(ma.shape[0]):\n",
|
||||
" for b in range(a, ma.shape[0], skip_loop):\n",
|
||||
" for c in range(b, ma.shape[0], skip_loop):\n",
|
||||
" for d in range(c, ma.shape[0], skip_loop):\n",
|
||||
" if ma[b] > ma[a] and \\\n",
|
||||
" (ma[c] < ma[b] and ma[c] > ma[a]) \\\n",
|
||||
" and ma[d] > ma[b]:\n",
|
||||
" x.append([a,b,c,d])\n",
|
||||
" x_np = np.array(x)\n",
|
||||
" ac = x_np[:,0].tolist() + x_np[:,2].tolist()\n",
|
||||
" bd = x_np[:,1].tolist() + x_np[:,3].tolist()\n",
|
||||
" ac_set = set(ac)\n",
|
||||
" bd_set = set(bd)\n",
|
||||
" signal = np.zeros(len(trend))\n",
|
||||
" buy = list(ac_set - bd_set)\n",
|
||||
" sell = list(list(bd_set - ac_set))\n",
|
||||
" signal[buy] = 1.0\n",
|
||||
" signal[sell] = -1.0\n",
|
||||
" return signal"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 1.08 s, sys: 8 ms, total: 1.09 s\n",
|
||||
"Wall time: 1.09 s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%%time\n",
|
||||
"signal = abcd(df['Close'])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def buy_stock(\n",
|
||||
" real_movement,\n",
|
||||
" signal,\n",
|
||||
" initial_money = 10000,\n",
|
||||
" max_buy = 1,\n",
|
||||
" max_sell = 1,\n",
|
||||
"):\n",
|
||||
" \"\"\"\n",
|
||||
" real_movement = actual movement in the real world\n",
|
||||
" delay = how much interval you want to delay to change our decision from buy to sell, vice versa\n",
|
||||
" initial_state = 1 is buy, 0 is sell\n",
|
||||
" initial_money = 10000, ignore what kind of currency\n",
|
||||
" max_buy = max quantity for share to buy\n",
|
||||
" max_sell = max quantity for share to sell\n",
|
||||
" \"\"\"\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" states_money = []\n",
|
||||
" current_inventory = 0\n",
|
||||
" \n",
|
||||
" def buy(i, initial_money, current_inventory):\n",
|
||||
" shares = initial_money // real_movement[i]\n",
|
||||
" if shares < 1:\n",
|
||||
" print(\n",
|
||||
" 'day %d: total balances %f, not enough money to buy a unit price %f'\n",
|
||||
" % (i, initial_money, real_movement[i])\n",
|
||||
" )\n",
|
||||
" else:\n",
|
||||
" if shares > max_buy:\n",
|
||||
" buy_units = max_buy\n",
|
||||
" else:\n",
|
||||
" buy_units = shares\n",
|
||||
" initial_money -= buy_units * real_movement[i]\n",
|
||||
" current_inventory += buy_units\n",
|
||||
" print(\n",
|
||||
" 'day %d: buy %d units at price %f, total balance %f'\n",
|
||||
" % (i, buy_units, buy_units * real_movement[i], initial_money)\n",
|
||||
" )\n",
|
||||
" states_buy.append(0)\n",
|
||||
" return initial_money, current_inventory\n",
|
||||
" \n",
|
||||
" for i in range(real_movement.shape[0]):\n",
|
||||
" state = signal[i]\n",
|
||||
" if state == 1:\n",
|
||||
" initial_money, current_inventory = buy(\n",
|
||||
" i, initial_money, current_inventory\n",
|
||||
" )\n",
|
||||
" states_buy.append(i)\n",
|
||||
" elif state == -1:\n",
|
||||
" if current_inventory == 0:\n",
|
||||
" print('day %d: cannot sell anything, inventory 0' % (i))\n",
|
||||
" else:\n",
|
||||
" if current_inventory > max_sell:\n",
|
||||
" sell_units = max_sell\n",
|
||||
" else:\n",
|
||||
" sell_units = current_inventory\n",
|
||||
" current_inventory -= sell_units\n",
|
||||
" total_sell = sell_units * real_movement[i]\n",
|
||||
" initial_money += total_sell\n",
|
||||
" try:\n",
|
||||
" invest = (\n",
|
||||
" (real_movement[i] - real_movement[states_buy[-1]])\n",
|
||||
" / real_movement[states_buy[-1]]\n",
|
||||
" ) * 100\n",
|
||||
" except:\n",
|
||||
" invest = 0\n",
|
||||
" print(\n",
|
||||
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
|
||||
" % (i, sell_units, total_sell, invest, initial_money)\n",
|
||||
" )\n",
|
||||
" states_sell.append(i)\n",
|
||||
" states_money.append(initial_money)\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, states_money"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 6: buy 1 units at price 762.559998, total balance 9237.440002\n",
|
||||
"day 7: buy 1 units at price 754.020020, total balance 8483.419982\n",
|
||||
"day 8: buy 1 units at price 736.080017, total balance 7747.339965\n",
|
||||
"day 9: buy 1 units at price 758.489990, total balance 6988.849975\n",
|
||||
"day 10: buy 1 units at price 764.479980, total balance 6224.369995\n",
|
||||
"day 11: buy 1 units at price 771.229980, total balance 5453.140015\n",
|
||||
"day 12: buy 1 units at price 760.539978, total balance 4692.600037\n",
|
||||
"day 13: buy 1 units at price 769.200012, total balance 3923.400025\n",
|
||||
"day 14: buy 1 units at price 768.270020, total balance 3155.130005\n",
|
||||
"day 15: buy 1 units at price 760.989990, total balance 2394.140015\n",
|
||||
"day 19: buy 1 units at price 758.039978, total balance 1636.100037\n",
|
||||
"day 21: buy 1 units at price 750.500000, total balance 885.600037\n",
|
||||
"day 22: buy 1 units at price 762.520020, total balance 123.080017\n",
|
||||
"day 23: total balances 123.080017, not enough money to buy a unit price 759.109985\n",
|
||||
"day 24: total balances 123.080017, not enough money to buy a unit price 771.190002\n",
|
||||
"day 25: total balances 123.080017, not enough money to buy a unit price 776.419983\n",
|
||||
"day 26: total balances 123.080017, not enough money to buy a unit price 789.289978\n",
|
||||
"day 27: total balances 123.080017, not enough money to buy a unit price 789.270020\n",
|
||||
"day 43: total balances 123.080017, not enough money to buy a unit price 794.020020\n",
|
||||
"day 148, sell 1 units at price 980.940002, investment 23.540966 %, total balance 1104.020019,\n",
|
||||
"day 149, sell 1 units at price 983.409973, investment 23.852038 %, total balance 2087.429992,\n",
|
||||
"day 239, sell 1 units at price 992.000000, investment 24.933878 %, total balance 3079.429992,\n",
|
||||
"day 240, sell 1 units at price 992.179993, investment 24.956546 %, total balance 4071.609985,\n",
|
||||
"day 241, sell 1 units at price 992.809998, investment 25.035890 %, total balance 5064.419983,\n",
|
||||
"day 242, sell 1 units at price 984.450012, investment 23.983021 %, total balance 6048.869995,\n",
|
||||
"day 243, sell 1 units at price 988.200012, investment 24.455302 %, total balance 7037.070007,\n",
|
||||
"day 244, sell 1 units at price 968.450012, investment 21.967959 %, total balance 8005.520019,\n",
|
||||
"day 245, sell 1 units at price 970.539978, investment 22.231172 %, total balance 8976.059997,\n",
|
||||
"day 248, sell 1 units at price 1019.270020, investment 28.368302 %, total balance 9995.330017,\n",
|
||||
"day 249, sell 1 units at price 1017.109985, investment 28.096264 %, total balance 11012.440002,\n",
|
||||
"day 250, sell 1 units at price 1016.640015, investment 28.037076 %, total balance 12029.080017,\n",
|
||||
"day 251, sell 1 units at price 1025.500000, investment 29.152915 %, total balance 13054.580017,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest, states_money = buy_stock(df.Close, signal)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1080x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df['Close']\n",
|
||||
"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": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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(states_money, color='r', lw=2.)\n",
|
||||
"plt.plot(states_money, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
|
||||
"plt.plot(states_money, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\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
|
||||
}
|
||||
+337
@@ -0,0 +1,337 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\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": [
|
||||
"def buy_stock(\n",
|
||||
" real_movement,\n",
|
||||
" delay = 5,\n",
|
||||
" initial_state = 1,\n",
|
||||
" initial_money = 10000,\n",
|
||||
" max_buy = 1,\n",
|
||||
" max_sell = 1,\n",
|
||||
"):\n",
|
||||
" \"\"\"\n",
|
||||
" real_movement = actual movement in the real world\n",
|
||||
" delay = how much interval you want to delay to change our decision from buy to sell, vice versa\n",
|
||||
" initial_state = 1 is buy, 0 is sell\n",
|
||||
" initial_money = 1000, ignore what kind of currency\n",
|
||||
" max_buy = max quantity for share to buy\n",
|
||||
" max_sell = max quantity for share to sell\n",
|
||||
" \"\"\"\n",
|
||||
" starting_money = initial_money\n",
|
||||
" delay_change_decision = delay\n",
|
||||
" current_decision = 0\n",
|
||||
" state = initial_state\n",
|
||||
" current_val = real_movement[0]\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" current_inventory = 0\n",
|
||||
"\n",
|
||||
" def buy(i, initial_money, current_inventory):\n",
|
||||
" shares = initial_money // real_movement[i]\n",
|
||||
" if shares < 1:\n",
|
||||
" print(\n",
|
||||
" 'day %d: total balances %f, not enough money to buy a unit price %f'\n",
|
||||
" % (i, initial_money, real_movement[i])\n",
|
||||
" )\n",
|
||||
" else:\n",
|
||||
" if shares > max_buy:\n",
|
||||
" buy_units = max_buy\n",
|
||||
" else:\n",
|
||||
" buy_units = shares\n",
|
||||
" initial_money -= buy_units * real_movement[i]\n",
|
||||
" current_inventory += buy_units\n",
|
||||
" print(\n",
|
||||
" 'day %d: buy %d units at price %f, total balance %f'\n",
|
||||
" % (i, buy_units, buy_units * real_movement[i], initial_money)\n",
|
||||
" )\n",
|
||||
" states_buy.append(0)\n",
|
||||
" return initial_money, current_inventory\n",
|
||||
"\n",
|
||||
" if state == 1:\n",
|
||||
" initial_money, current_inventory = buy(\n",
|
||||
" 0, initial_money, current_inventory\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" for i in range(1, real_movement.shape[0], 1):\n",
|
||||
" if real_movement[i] < current_val and state == 0:\n",
|
||||
" if current_decision < delay_change_decision:\n",
|
||||
" current_decision += 1\n",
|
||||
" else:\n",
|
||||
" state = 1\n",
|
||||
" initial_money, current_inventory = buy(\n",
|
||||
" i, initial_money, current_inventory\n",
|
||||
" )\n",
|
||||
" current_decision = 0\n",
|
||||
" states_buy.append(i)\n",
|
||||
" if real_movement[i] > current_val and state == 1:\n",
|
||||
" if current_decision < delay_change_decision:\n",
|
||||
" current_decision += 1\n",
|
||||
" else:\n",
|
||||
" state = 0\n",
|
||||
"\n",
|
||||
" if current_inventory == 0:\n",
|
||||
" print('day %d: cannot sell anything, inventory 0' % (i))\n",
|
||||
" else:\n",
|
||||
" if current_inventory > max_sell:\n",
|
||||
" sell_units = max_sell\n",
|
||||
" else:\n",
|
||||
" sell_units = current_inventory\n",
|
||||
" current_inventory -= sell_units\n",
|
||||
" total_sell = sell_units * real_movement[i]\n",
|
||||
" initial_money += total_sell\n",
|
||||
" try:\n",
|
||||
" invest = (\n",
|
||||
" (real_movement[i] - real_movement[states_buy[-1]])\n",
|
||||
" / real_movement[states_buy[-1]]\n",
|
||||
" ) * 100\n",
|
||||
" except:\n",
|
||||
" invest = 0\n",
|
||||
" print(\n",
|
||||
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
|
||||
" % (i, sell_units, total_sell, invest, initial_money)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" current_decision = 0\n",
|
||||
" states_sell.append(i)\n",
|
||||
" current_val = real_movement[i]\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": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 units at price 768.700012, total balance 9231.299988\n",
|
||||
"day 11, sell 1 units at price 771.229980, investment 0.329123 %, total balance 10002.529968,\n",
|
||||
"day 20: buy 1 units at price 747.919983, total balance 9254.609985\n",
|
||||
"day 26, sell 1 units at price 789.289978, investment 5.531340 %, total balance 10043.899963,\n",
|
||||
"day 36: buy 1 units at price 789.909973, total balance 9253.989990\n",
|
||||
"day 44, sell 1 units at price 806.150024, investment 2.055937 %, total balance 10060.140014,\n",
|
||||
"day 57: buy 1 units at price 832.150024, total balance 9227.989990\n",
|
||||
"day 67, sell 1 units at price 809.559998, investment -2.714658 %, total balance 10037.549988,\n",
|
||||
"day 81: buy 1 units at price 830.630005, total balance 9206.919983\n",
|
||||
"day 88, sell 1 units at price 845.539978, investment 1.795020 %, total balance 10052.459961,\n",
|
||||
"day 97: buy 1 units at price 814.429993, total balance 9238.029968\n",
|
||||
"day 103, sell 1 units at price 838.549988, investment 2.961580 %, total balance 10076.579956,\n",
|
||||
"day 109: buy 1 units at price 823.349976, total balance 9253.229980\n",
|
||||
"day 116, sell 1 units at price 843.190002, investment 2.409671 %, total balance 10096.419982,\n",
|
||||
"day 134: buy 1 units at price 919.619995, total balance 9176.799987\n",
|
||||
"day 139, sell 1 units at price 954.960022, investment 3.842895 %, total balance 10131.760009,\n",
|
||||
"day 153: buy 1 units at price 950.760010, total balance 9180.999999\n",
|
||||
"day 167, sell 1 units at price 911.710022, investment -4.107239 %, total balance 10092.710021,\n",
|
||||
"day 182: buy 1 units at price 947.799988, total balance 9144.910033\n",
|
||||
"day 194, sell 1 units at price 914.390015, investment -3.525002 %, total balance 10059.300048,\n",
|
||||
"day 203: buy 1 units at price 921.280029, total balance 9138.020019\n",
|
||||
"day 214, sell 1 units at price 929.080017, investment 0.846647 %, total balance 10067.100036,\n",
|
||||
"day 224: buy 1 units at price 920.969971, total balance 9146.130065\n",
|
||||
"day 230, sell 1 units at price 957.789978, investment 3.997960 %, total balance 10103.920043,\n",
|
||||
"day 242: buy 1 units at price 984.450012, total balance 9119.470031\n",
|
||||
"day 251, sell 1 units at price 1025.500000, investment 4.169840 %, total balance 10144.970031,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = buy_stock(df.Close, initial_state = 1, \n",
|
||||
" delay = 4, initial_money = 10000)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XW4VNX6wPHv1OkOumsRSiMdih0YeDGuHXh/eK+J7TWu2NcuvCgWBgYmBgYCIoiU9KI5hzjdNefMzP79sWcO5xxOd7yf5+GR2Xvttdee2YP7nXeFxTAMhBBCCCGEEEK0XtamboAQQgghhBBCiIYlgZ8QQgghhBBCtHIS+AkhhBBCCCFEKyeBnxBCCCGEEEK0chL4CSGEEEIIIUQrJ4GfEEIIIYQQQrRyEvgJIUQllFJvK6XmNEC9E5VSur7rFc2XUmqKUupgJftzlFK9GrNNQggh2g57UzdACCHqQim1H7hOa/1TQ5RvKFrrFYCq73qVUo8A5wEDgDla64cqKDcfuBroq7XeXWZfX2Az8KnW+rIKjo8AXgDO8G561XcupVQ3YFuZQ4KB2VrrZ7xlLgUeB2KAH4FrtNZp3n1RwJvAqUAKcI/W+gPvvhOBF4GugBtYDvxTa33Iu38GcAswFFijtZ5S8bt1zDU9BPSp6JrrWr4qWuuQ+qinNpRSPYB9gENr7WqC878NHNRa319JmWrd22WO8QP+AkK11l3K2X8F8A5wvdb6De+2prq3hwAfAO2Bx7TWz3q3O4DfgAu11vFVXbMQQlREMn5CCNG67AbuBBZXVEApNQHoXUkdrwB/VnGe54AgoAdwAnC5UupqAK11nNY6xPcHOB7wAJ95zz8IeB24HPMhNw94tcz5C737/g685j0GzIfu07TWEUAnYBfwWolj04DngSeqaL9oeaq8t8txB5Bc3g6lVCRwL7C1zK6murcfB2YDQ4D7lFIdvNtvAz6ToE8IUVeS8RNCtFhKqfeAbsDXSik38B+t9VNKqWmYD1GdgY3A/2mtt1dS/hNgIhCImR34P6112YfB8s5vA54CrgSygWeAl/BmTbwPi3cCXTAfPp/UWr/uPXYKsMCXhfBmIl8GrgC6A98DV2qtC5RSMcDbwATMh8ytwGSttadsm7TW73jr+3sFbbZ723il91rL7r8YyAB+B/pUcvnnAGdorfOA/UqpN4FrgLfKKXsFsFxrvd/7+u/A11rr5d5z/hvYrpQK9V7fdOA4rXUO8JtS6ivMB+m7tdaJZep2l2ynL5OrlLqukrYfQyl1OmYQYFFKnQfs0VoPUUp1AuZivvdpmJ/hvErKV/iZV6MNBt4MrDcDlosZfEzCDHgv1VrvUUq9BuRqrWeXOPZLYJnW+llvm1/yHpcDPKe1ftFb7gTMQKQfkA+8r7W+DTNzCpChlAI4BTMjfT2wBjM7nAZc5j32EcAfuKPEPecPPArM8O77HLhVa53vu98xg6q7MD+3e7XWbymlZmLeE4ZS6hZgqdb6nLLvT1X3djnvZ09ve28D5pVT5HHM7PGMMtub5N4GegK/aK2dSqldQDfvezodGF+daxZCiMpIxk8I0WJprS8H4oBzvL/AP6WU6gd8iNndLxb4FjPQ8yuvvLeq74C+QDtgPfB+NZtwPWZ3sKHAcMxuaCUlAWcDYZgPzs8ppYZXUt8M4HTMB8DBwFXe7bcDB73X0x4z4DCq2caybsV8UN1UdodSKgz4D+aDcnVYyvz9uHLqtGA+HL9TYvMgSgSdWus9mFmQft4/Lq31zhLl//Ie46uzm1IqAzNwmY0ZfNeJ1vp74DFgoffeGOLd9RHme98JuBB4TCl1UiXla/qZV+Zi4GEgEjPb9ah3+4fARd731pe5OhX4SCllBb7GfM86A1OBW5RSp3mPfQF4QWsdhpn1/di7fZL3vxHe61nlfT0a2AREY3ZD/AgYhRlsXwa8rJTydVF9AvPzG+rd3xl4oMT1dADCvduvBV5RSkVqrf+H+Z17ynvuY4K+WnoJ87uSX3aHNwAeiRnUl6cp7u0twKlKqS6YAf8ezM/rDq11UUUXKYQQ1SUZPyFEa3MRsFhr/SOAUuq/wM3AOODX8g7QWs/3/d07bitdKRWutc6s4lwzMB+iD3qPfQLzQdtXb8kuacuUUkswM4vrK6jvRa31YW9dX2M+QAMUAR2B7t7xeCuqaFe5lFJdgRuAERUUeQR4U2t90Jv1qcz3wN1KqSsxg9FrMLvHlTXBu//TEttCgLLvbSYQipkJyqpgH2B2twMivOOlrgd2VNXY2vC+X+OBs7TWBcBGpdQbmA/7v5R3TC0+88p8rrVe423L+8Cz3u0rMAP/iZiZuguBVVrrw0qp0UCs1vo/3rJ7lVLzMIPIHzDvpT5KqRitdQqwuoo27NNav+Vtw0LgPsxMuRNYopQq9Nb3FzATGFxiPNtjmMHiPd66irzHuoBvlVI5mFnFqtpQY0qp8wGb1vpzb7ax5D4bZtbzn1prTzn3elPd27Mxuy13wPyBZjxmT4J93oxuBPCy1vqTiq9cCCEqJoGfEKK16QQc8L3wPtjFY2YZjuF9CHwU+BtmRs3XfTKGYx/gyjtXyXE3pcbgKKXOAB7E/KXfivnwuLmS+hJK/D3PWz/A08BDmA/aAP/TWtdmDNvzmA/ex1yXUmoocDIwrJp13YSZUdkFpGJmoS4pp9yVmOOTckpsy8HMiJUUhvmQ66lkXyla6zSl1DvAX0qpzg0wKUknIE1rXfLcBzAzReWqxWdembL3QwiA1tpQSn2E+X4vBy7F7EYJZjfhTt6MqI+Noz8WXIuZ1d2hlNoHPKy1/qaSNpTsWpvvPX/ZbSGY350gYF2JQMriPbdPapnPqPia6pNSKhgzC3xmBUVmAZu01hUFnE1yb2utD/jarJQKAlZhZnJfAhZijm3copT62RdcCyFETUjgJ4Ro6cp2eTyMOeECUNwdqytwqILylwLnYgY9+zG7oqVTuqtXRY5gjuXy6VrivP6YEz5cAXyptS5SSn1RzXpL8QYetwO3K6WOA35RSv2ptf65hlVNBSYopUp2jVyllLoZs5trDyDO++AeAtiUUgO11sd0VfQ+eBaPtfJmd9aULKOUCsQMqM8vc/hWzAksfOV6YY4J24n5cGxXSvXVWu/yFhnCsRNw+Ni9bQ/DHINWF+XdS1FKqdASwV83KriX6vMzr4YPMX8IeAKzO6bvPY7HzNL1Le8g73t6ibdL6AXAp0qp6LLXUgspmEHgIO2dYbWG6nr+kvpi3ssrvPeyHxCulEoAxmB+DyYrpXyBYRQwTCk1VGv9z2Zybz8AzNNaJyqljgfu11pnKnM5kD5l2yOEENUhgZ8QoqVLBEquffYxZjetqZjZkJsBJ+ZkJeWVD/XuT8XMWDxWg3N/DNyslFqMORHHXSX2+WE+8CUDLm8m6FTMcTw1opQ6G7M74x7MLKSbo5nJsmUdmFkWK+ZDZgBQpLV2czQL5XMEcyKLvzCDk49K7JuN+fD8fxWcpzfmJDAZ3uuaCUwuU+x8zCB6aZnt72MGnL4ukP8BFvmCK6XUIuA/ypygZShmYD7Ou+8CzAflXZjjzp4FNpToXmgDHJj/f7N6r9/tGyOlzEl0HtJav13OZSUCpyilrFprj9Y6Xin1O/C4Umq29/27lqNBQany1ONnXhWt9QalVArwBvCD1tqX4VsDZCul7sKcuKQQc/mDQK31n0qpy7zlk0tkBT3eNnswvxslx6BVtz0eb5fS55RS/9RaJymlOmNOZPJDNaoo+708RhX3dklbKPEjDOa98zLmONxkzLGzASX2L8Lsrvmm9zxNcm+XuM6BwBSOTuiyDzhJKZWJGdTGlff+CCFEVWRyFyFES/c4cL9SKkMpNVtrrTEnnXgJMwtxDuZkLoXllQfexey+dwhz5sSajDeaByzBnPxiA+ZEMi7MQCMbs8vYx5gPiJcCX9XyGvsCP2F2I1uFua5Y2QfOkm3Kx+yadp/375cDaK2TtNYJvj/e8ila63ytdV6ZfTlAgdY6GYoXnC/ZpW0EZhfGbMz39O/62JlQrwTe01qXyuZ4y/0D8yE5CTP4nlWiyCzMGVaTMDNbJWdZ7Yw5Bivbe34PpbMul3uv+TXMMXD53vfEt6ZbNBV/xr6xU6lKKd+YvEswA+DDmLNUPqiPrgFZqnw9f+bV8QFmpvoD3wZvEHQ2ZlCxD/M78AZmJhvMyYO2ej/LF4CLfZ8/Zpfnld7vxphatOcuzEloViulsjDv2equVfkmMNB77i8qKFPhvV3y/tRau8rcy2mAx/varbXOKLO/EMgq0QW6qe5tn1eAm0sEtPdg3ldbMdf3S0AIIWrBYhj12btCCCHaLm+GZ67WuntTt0UcS5nrF96otS5vvJYQQgjRqkngJ4QQteQd53MiZtavPeb4rtVa61uatGFCCCGEEGVIV08hhKg9C+Y6a+mYXT23U3rdMiGEEEKIZkEyfkIIIYQQQgjRyknGTwghhBBCCCFauZa4nIM/MApzGvKyUzgLIYQQQgghRGtnAzoCf2IuS1Wllhj4jQJWNHUjhBBCCCGEEKKJTQR+q07Blhj4HQFIT8/F42le4xOjo0NITc2puqAQNST3lmhIcn+JhiL3lmhIcn+JhtTc7y+r1UJkZDB4Y6PqaImBnxvA4zGaXeAHNMs2idZB7i3RkOT+Eg1F7i3RkOT+Eg2phdxf1R76JpO7CCGEEEIIIUQrJ4GfEEIIIYQQQrRyLbGrZ7ncbhfp6cm4XIVN1oakJCsej6fJzt+SWa02AgNDCAkJx2KxNHVzhBBCCCGEaFVaTeCXnp5MQEAQwcEdmixwsNutuFwS+NWUYRi43S6yszNIT08mKqpdUzdJCCGEEEKIVqXVBH4uV2GTBn2i9iwWC3a7g4iIaBITDzZ1c4QQQgghRBt10UXnofWOKssp1Z+FC79ohBbVn1Y1xk+CvpbNYrECLWL2JCGEEEILine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1080x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df['Close']\n",
|
||||
"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
|
||||
}
|
||||
+526
@@ -0,0 +1,526 @@
|
||||
{
|
||||
"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": [
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 1e-4\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" GAMMA = 0.9\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
"\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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.X = tf.placeholder(tf.float32, (None, self.state_size))\n",
|
||||
" self.REWARDS = tf.placeholder(tf.float32, (None))\n",
|
||||
" self.ACTIONS = tf.placeholder(tf.int32, (None))\n",
|
||||
" feed_forward = tf.layers.dense(self.X, self.LAYER_SIZE, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_forward, self.OUTPUT_SIZE, activation = tf.nn.softmax)\n",
|
||||
" input_y = tf.one_hot(self.ACTIONS, self.OUTPUT_SIZE)\n",
|
||||
" loglike = tf.log((input_y * (input_y - self.logits) + (1 - input_y) * (input_y + self.logits)) + 1)\n",
|
||||
" rewards = tf.tile(tf.reshape(self.REWARDS, (-1,1)), [1, self.OUTPUT_SIZE])\n",
|
||||
" self.cost = -tf.reduce_mean(loglike * (rewards + 1)) \n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = self.LEARNING_RATE).minimize(self.cost)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def predict(self, inputs):\n",
|
||||
" return self.sess.run(self.logits, feed_dict={self.X:inputs})\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 discount_rewards(self, r):\n",
|
||||
" discounted_r = np.zeros_like(r)\n",
|
||||
" running_add = 0\n",
|
||||
" for t in reversed(range(0, r.size)):\n",
|
||||
" running_add = running_add * self.GAMMA + r[t]\n",
|
||||
" discounted_r[t] = running_add\n",
|
||||
" return discounted_r\n",
|
||||
" \n",
|
||||
" def get_predicted_action(self, sequence):\n",
|
||||
" prediction = self.predict(np.array(sequence))[0]\n",
|
||||
" return np.argmax(prediction)\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self.get_predicted_action(state)\n",
|
||||
" next_state = self.get_state(t + 1)\n",
|
||||
" \n",
|
||||
" if action == 1 and initial_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
||||
" \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",
|
||||
" \n",
|
||||
" state = next_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" ep_history = []\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self.get_predicted_action(state)\n",
|
||||
" next_state = self.get_state(t + 1)\n",
|
||||
" if action == 1 and starting_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" ep_history.append([state,action,starting_money,next_state])\n",
|
||||
" state = next_state\n",
|
||||
" ep_history = np.array(ep_history)\n",
|
||||
" ep_history[:,2] = self.discount_rewards(ep_history[:,2])\n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict={self.X:np.vstack(ep_history[:,0]),\n",
|
||||
" self.REWARDS:ep_history[:,2],\n",
|
||||
" self.ACTIONS:ep_history[:,1]})\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"epoch: 10, total rewards: 1781.590144.3, cost: -3782.833740, total money: 7062.900203\n",
|
||||
"epoch: 20, total rewards: 1808.720396.3, cost: -6238.727539, total money: 10819.470396\n",
|
||||
"epoch: 30, total rewards: 644.675288.3, cost: -10399.220703, total money: 10644.675288\n",
|
||||
"epoch: 40, total rewards: 1696.944943.3, cost: -9798.079102, total money: 11696.944943\n",
|
||||
"epoch: 50, total rewards: 593.719845.3, cost: -13938.982422, total money: 10593.719845\n",
|
||||
"epoch: 60, total rewards: 634.539913.3, cost: -14890.398438, total money: 9645.289913\n",
|
||||
"epoch: 70, total rewards: 1586.160156.3, cost: -10411.115234, total money: 11586.160156\n",
|
||||
"epoch: 80, total rewards: 368.749937.3, cost: -15986.910156, total money: 10368.749937\n",
|
||||
"epoch: 90, total rewards: 733.844603.3, cost: -15352.789062, total money: 8857.304625\n",
|
||||
"epoch: 100, total rewards: 645.715148.3, cost: -15976.339844, total money: 10645.715148\n",
|
||||
"epoch: 110, total rewards: 994.814937.3, cost: -11198.958984, total money: 4471.054988\n",
|
||||
"epoch: 120, total rewards: 1771.289852.3, cost: -6539.313477, total money: 5164.829891\n",
|
||||
"epoch: 130, total rewards: 1643.744995.3, cost: -11630.438477, total money: 11643.744995\n",
|
||||
"epoch: 140, total rewards: 1877.095029.3, cost: -7103.230957, total money: 9104.255063\n",
|
||||
"epoch: 150, total rewards: 481.749932.3, cost: -18531.593750, total money: 10481.749932\n",
|
||||
"epoch: 160, total rewards: 638.035152.3, cost: -16995.314453, total money: 10638.035152\n",
|
||||
"epoch: 170, total rewards: 1188.049925.3, cost: -13348.065430, total money: 10263.189940\n",
|
||||
"epoch: 180, total rewards: 633.885008.3, cost: -14666.952148, total money: 10633.885008\n",
|
||||
"epoch: 190, total rewards: 1675.079952.3, cost: -9106.298828, total money: 5977.189998\n",
|
||||
"epoch: 200, total rewards: 567.955136.3, cost: -17828.587891, total money: 10567.955136\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"agent = Agent(state_size = window_size,\n",
|
||||
" window_size = window_size,\n",
|
||||
" trend = close,\n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 12: buy 1 unit at price 760.539978, total balance 9239.460022\n",
|
||||
"day 19, sell 1 unit at price 758.039978, investment -0.328714 %, total balance 9997.500000,\n",
|
||||
"day 23: buy 1 unit at price 759.109985, total balance 9238.390015\n",
|
||||
"day 26, sell 1 unit at price 789.289978, investment 3.975708 %, total balance 10027.679993,\n",
|
||||
"day 27: buy 1 unit at price 789.270020, total balance 9238.409973\n",
|
||||
"day 28, sell 1 unit at price 796.099976, investment 0.865351 %, total balance 10034.509949,\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 9243.709961\n",
|
||||
"day 33, sell 1 unit at price 796.419983, investment 0.710672 %, total balance 10040.129944,\n",
|
||||
"day 35: buy 1 unit at price 791.260010, total balance 9248.869934\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 8458.959961\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment 0.036648 %, total balance 9250.509949,\n",
|
||||
"day 38: buy 1 unit at price 785.049988, total balance 8465.459961\n",
|
||||
"day 39: buy 1 unit at price 782.789978, total balance 7682.669983\n",
|
||||
"day 40: buy 1 unit at price 771.820007, total balance 6910.849976\n",
|
||||
"day 41, sell 1 unit at price 786.140015, investment -0.477264 %, total balance 7696.989991,\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 0.235658 %, total balance 8483.890015,\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 7677.739991\n",
|
||||
"day 46: buy 1 unit at price 804.789978, total balance 6872.950013\n",
|
||||
"day 50: buy 1 unit at price 804.609985, total balance 6068.340028\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 5262.270021\n",
|
||||
"day 52, sell 1 unit at price 802.174988, investment 2.476400 %, total balance 6064.445009,\n",
|
||||
"day 53, sell 1 unit at price 805.020020, investment 4.301523 %, total balance 6869.465029,\n",
|
||||
"day 54, sell 1 unit at price 819.309998, investment 1.632447 %, total balance 7688.775027,\n",
|
||||
"day 56: buy 1 unit at price 835.669983, total balance 6853.105044\n",
|
||||
"day 57: buy 1 unit at price 832.150024, total balance 6020.955020\n",
|
||||
"day 59, sell 1 unit at price 802.320007, investment -0.306909 %, total balance 6823.275027,\n",
|
||||
"day 61: buy 1 unit at price 795.695007, total balance 6027.580020\n",
|
||||
"day 63: buy 1 unit at price 801.489990, total balance 5226.090030\n",
|
||||
"day 64, sell 1 unit at price 801.340027, investment -0.406403 %, total balance 6027.430057,\n",
|
||||
"day 65: buy 1 unit at price 806.969971, total balance 5220.460086\n",
|
||||
"day 71: buy 1 unit at price 818.979980, total balance 4401.480106\n",
|
||||
"day 72: buy 1 unit at price 824.159973, total balance 3577.320133\n",
|
||||
"day 73, sell 1 unit at price 828.070007, investment 2.729291 %, total balance 4405.390140,\n",
|
||||
"day 74, sell 1 unit at price 831.659973, investment -0.479856 %, total balance 5237.050113,\n",
|
||||
"day 78, sell 1 unit at price 829.280029, investment -0.344889 %, total balance 6066.330142,\n",
|
||||
"day 79: buy 1 unit at price 823.210022, total balance 5243.120120\n",
|
||||
"day 80: buy 1 unit at price 835.239990, total balance 4407.880130\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment 4.390501 %, total balance 5238.510135,\n",
|
||||
"day 83: buy 1 unit at price 827.780029, total balance 4410.730106\n",
|
||||
"day 86, sell 1 unit at price 838.679993, investment 4.640108 %, total balance 5249.410099,\n",
|
||||
"day 88, sell 1 unit at price 845.539978, investment 4.779609 %, total balance 6094.950077,\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 3.252829 %, total balance 6940.570072,\n",
|
||||
"day 90: buy 1 unit at price 847.200012, total balance 6093.370060\n",
|
||||
"day 92, sell 1 unit at price 852.119995, investment 3.392548 %, total balance 6945.490055,\n",
|
||||
"day 93, sell 1 unit at price 848.400024, investment 3.059973 %, total balance 7793.890079,\n",
|
||||
"day 94: buy 1 unit at price 830.460022, total balance 6963.430057\n",
|
||||
"day 95, sell 1 unit at price 829.590027, investment -0.676448 %, total balance 7793.020084,\n",
|
||||
"day 98: buy 1 unit at price 819.510010, total balance 6973.510074\n",
|
||||
"day 101: buy 1 unit at price 831.500000, total balance 6142.010074\n",
|
||||
"day 102: buy 1 unit at price 829.559998, total balance 5312.450076\n",
|
||||
"day 103, sell 1 unit at price 838.549988, investment 1.301065 %, total balance 6151.000064,\n",
|
||||
"day 105, sell 1 unit at price 831.409973, investment -1.863791 %, total balance 6982.410037,\n",
|
||||
"day 106: buy 1 unit at price 827.880005, total balance 6154.530032\n",
|
||||
"day 108, sell 1 unit at price 824.729980, investment -0.689984 %, total balance 6979.260012,\n",
|
||||
"day 109: buy 1 unit at price 823.349976, total balance 6155.910036\n",
|
||||
"day 110, sell 1 unit at price 824.320007, investment 0.586936 %, total balance 6980.230043,\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.954901 %, total balance 7803.790041,\n",
|
||||
"day 113, sell 1 unit at price 836.820007, investment 0.875164 %, total balance 8640.610048,\n",
|
||||
"day 114: buy 1 unit at price 838.210022, total balance 7802.400026\n",
|
||||
"day 115: buy 1 unit at price 841.650024, total balance 6960.750002\n",
|
||||
"day 116, sell 1 unit at price 843.190002, investment 1.849301 %, total balance 7803.940004,\n",
|
||||
"day 117, sell 1 unit at price 862.760010, investment 4.786547 %, total balance 8666.700014,\n",
|
||||
"day 118, sell 1 unit at price 872.299988, investment 4.066996 %, total balance 9539.000002,\n",
|
||||
"day 119: buy 1 unit at price 871.729980, total balance 8667.270022\n",
|
||||
"day 120, sell 1 unit at price 874.250000, investment 3.873341 %, total balance 9541.520022,\n",
|
||||
"day 121: buy 1 unit at price 905.960022, total balance 8635.560000\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 5.128884 %, total balance 9552.000002,\n",
|
||||
"day 124: buy 1 unit at price 927.039978, total balance 8624.960024\n",
|
||||
"day 127: buy 1 unit at price 934.299988, total balance 7690.660036\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 6758.490053\n",
|
||||
"day 129, sell 1 unit at price 928.780029, investment 2.518876 %, total balance 7687.270082,\n",
|
||||
"day 130: buy 1 unit at price 930.599976, total balance 6756.670106\n",
|
||||
"day 131: buy 1 unit at price 932.219971, total balance 5824.450135\n",
|
||||
"day 132: buy 1 unit at price 937.080017, total balance 4887.370118\n",
|
||||
"day 133: buy 1 unit at price 943.000000, total balance 3944.370118\n",
|
||||
"day 134, sell 1 unit at price 919.619995, investment -0.800395 %, total balance 4863.990113,\n",
|
||||
"day 135: buy 1 unit at price 930.239990, total balance 3933.750123\n",
|
||||
"day 136: buy 1 unit at price 934.010010, total balance 2999.740113\n",
|
||||
"day 137, sell 1 unit at price 941.859985, investment 0.809162 %, total balance 3941.600098,\n",
|
||||
"day 138, sell 1 unit at price 948.820007, investment 1.786157 %, total balance 4890.420105,\n",
|
||||
"day 139: buy 1 unit at price 954.960022, total balance 3935.460083\n",
|
||||
"day 140, sell 1 unit at price 969.539978, investment 4.184397 %, total balance 4905.000061,\n",
|
||||
"day 141: buy 1 unit at price 971.469971, total balance 3933.530090\n",
|
||||
"day 142: buy 1 unit at price 975.880005, total balance 2957.650085\n",
|
||||
"day 143, sell 1 unit at price 964.859985, investment 3.501321 %, total balance 3922.510070,\n",
|
||||
"day 145: buy 1 unit at price 975.599976, total balance 2946.910094\n",
|
||||
"day 146, sell 1 unit at price 983.679993, investment 4.972892 %, total balance 3930.590087,\n",
|
||||
"day 147: buy 1 unit at price 976.570007, total balance 2954.020080\n",
|
||||
"day 148, sell 1 unit at price 980.940002, investment 4.023330 %, total balance 3934.960082,\n",
|
||||
"day 149, sell 1 unit at price 983.409973, investment 5.715728 %, total balance 4918.370055,\n",
|
||||
"day 150: buy 1 unit at price 949.830017, total balance 3968.540038\n",
|
||||
"day 151: buy 1 unit at price 942.900024, total balance 3025.640014\n",
|
||||
"day 153, sell 1 unit at price 950.760010, investment 1.793343 %, total balance 3976.400024,\n",
|
||||
"day 154: buy 1 unit at price 942.309998, total balance 3034.090026\n",
|
||||
"day 155: buy 1 unit at price 939.780029, total balance 2094.309997\n",
|
||||
"day 156: buy 1 unit at price 957.369995, total balance 1136.940002\n",
|
||||
"day 157, sell 1 unit at price 950.630005, investment -0.453424 %, total balance 2087.570007,\n",
|
||||
"day 158: buy 1 unit at price 959.450012, total balance 1128.119995\n",
|
||||
"day 159: buy 1 unit at price 957.090027, total balance 171.029968\n",
|
||||
"day 161, sell 1 unit at price 952.270020, investment -1.976381 %, total balance 1123.299988,\n",
|
||||
"day 164, sell 1 unit at price 917.789978, investment -5.952579 %, total balance 2041.089966,\n",
|
||||
"day 165, sell 1 unit at price 908.729980, investment -6.854243 %, total balance 2949.819946,\n",
|
||||
"day 166: buy 1 unit at price 898.700012, total balance 2051.119934\n",
|
||||
"day 168, sell 1 unit at price 906.690002, investment -7.155658 %, total balance 2957.809936,\n",
|
||||
"day 170: buy 1 unit at price 928.799988, total balance 2029.009948\n",
|
||||
"day 172, sell 1 unit at price 943.830017, investment -0.631692 %, total balance 2972.839965,\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 0.451792 %, total balance 3919.999938,\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 2966.579955\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment 2.450364 %, total balance 3931.979979,\n",
|
||||
"day 177, sell 1 unit at price 970.890015, investment 3.310348 %, total balance 4902.869994,\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 1.624240 %, total balance 5875.789977,\n",
|
||||
"day 182, sell 1 unit at price 947.799988, investment -1.214240 %, total balance 6823.589965,\n",
|
||||
"day 184: buy 1 unit at price 941.530029, total balance 5882.059936\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 4951.559936\n",
|
||||
"day 186, sell 1 unit at price 930.830017, investment -2.743735 %, total balance 5882.389953,\n",
|
||||
"day 187: buy 1 unit at price 930.390015, total balance 4951.999938\n",
|
||||
"day 188, sell 1 unit at price 923.650024, investment 2.776234 %, total balance 5875.649962,\n",
|
||||
"day 189: buy 1 unit at price 927.960022, total balance 4947.689940\n",
|
||||
"day 191, sell 1 unit at price 926.789978, investment -0.216409 %, total balance 5874.479918,\n",
|
||||
"day 192, sell 1 unit at price 922.900024, investment -3.201103 %, total balance 6797.379942,\n",
|
||||
"day 194, sell 1 unit at price 914.390015, investment -2.882544 %, total balance 7711.769957,\n",
|
||||
"day 195, sell 1 unit at price 922.669983, investment -0.841485 %, total balance 8634.439940,\n",
|
||||
"day 196: buy 1 unit at price 922.219971, total balance 7712.219969\n",
|
||||
"day 198: buy 1 unit at price 910.979980, total balance 6801.239989\n",
|
||||
"day 199, sell 1 unit at price 910.669983, investment -2.119545 %, total balance 7711.909972,\n",
|
||||
"day 201: buy 1 unit at price 924.690002, total balance 6787.219970\n",
|
||||
"day 202, sell 1 unit at price 927.000000, investment -0.103455 %, total balance 7714.219970,\n",
|
||||
"day 203, sell 1 unit at price 921.280029, investment -0.101922 %, total balance 8635.499999,\n",
|
||||
"day 204: buy 1 unit at price 915.890015, total balance 7719.609984\n",
|
||||
"day 206: buy 1 unit at price 921.289978, total balance 6798.320006\n",
|
||||
"day 207, sell 1 unit at price 929.570007, investment 2.040663 %, total balance 7727.890013,\n",
|
||||
"day 208, sell 1 unit at price 939.330017, investment 1.583235 %, total balance 8667.220030,\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment 1.371343 %, total balance 9595.670042,\n",
|
||||
"day 213: buy 1 unit at price 926.500000, total balance 8669.170042\n",
|
||||
"day 215: buy 1 unit at price 932.070007, total balance 7737.100035\n",
|
||||
"day 217, sell 1 unit at price 925.109985, investment 0.414637 %, total balance 8662.210020,\n",
|
||||
"day 218: buy 1 unit at price 920.289978, total balance 7741.920042\n",
|
||||
"day 219: buy 1 unit at price 915.000000, total balance 6826.920042\n",
|
||||
"day 221: buy 1 unit at price 931.580017, total balance 5895.340025\n",
|
||||
"day 222, sell 1 unit at price 932.450012, investment 0.642203 %, total balance 6827.790037,\n",
|
||||
"day 223, sell 1 unit at price 928.530029, investment -0.379797 %, total balance 7756.320066,\n",
|
||||
"day 224: buy 1 unit at price 920.969971, total balance 6835.350095\n",
|
||||
"day 225: buy 1 unit at price 924.859985, total balance 5910.490110\n",
|
||||
"day 227, sell 1 unit at price 949.500000, investment 3.174002 %, total balance 6859.990110,\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 4.820763 %, total balance 7819.100095,\n",
|
||||
"day 230: buy 1 unit at price 957.789978, total balance 6861.310117\n",
|
||||
"day 233, sell 1 unit at price 978.890015, investment 5.078469 %, total balance 7840.200132,\n",
|
||||
"day 234, sell 1 unit at price 977.000000, investment 6.083806 %, total balance 8817.200132,\n",
|
||||
"day 235: buy 1 unit at price 972.599976, total balance 7844.600156\n",
|
||||
"day 236: buy 1 unit at price 989.250000, total balance 6855.350156\n",
|
||||
"day 237, sell 1 unit at price 987.830017, investment 6.808602 %, total balance 7843.180173,\n",
|
||||
"day 240, sell 1 unit at price 992.179993, investment 3.590559 %, total balance 8835.360166,\n",
|
||||
"day 243, sell 1 unit at price 988.200012, investment 1.603952 %, total balance 9823.560178,\n",
|
||||
"day 245, sell 1 unit at price 970.539978, investment -1.891334 %, total balance 10794.100156,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+497
@@ -0,0 +1,497 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
" def __init__(self, state_size, window_size, trend, skip, batch_size):\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.action_size = 3\n",
|
||||
" self.batch_size = batch_size\n",
|
||||
" self.memory = deque(maxlen = 1000)\n",
|
||||
" self.inventory = []\n",
|
||||
"\n",
|
||||
" self.gamma = 0.95\n",
|
||||
" self.epsilon = 0.5\n",
|
||||
" self.epsilon_min = 0.01\n",
|
||||
" self.epsilon_decay = 0.999\n",
|
||||
"\n",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.X = tf.placeholder(tf.float32, [None, self.state_size])\n",
|
||||
" self.Y = tf.placeholder(tf.float32, [None, self.action_size])\n",
|
||||
" feed = tf.layers.dense(self.X, 256, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed, self.action_size)\n",
|
||||
" self.cost = tf.reduce_mean(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.GradientDescentOptimizer(1e-5).minimize(\n",
|
||||
" self.cost\n",
|
||||
" )\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
"\n",
|
||||
" def act(self, state):\n",
|
||||
" if random.random() <= self.epsilon:\n",
|
||||
" return random.randrange(self.action_size)\n",
|
||||
" return np.argmax(\n",
|
||||
" self.sess.run(self.logits, feed_dict = {self.X: state})[0]\n",
|
||||
" )\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 replay(self, batch_size):\n",
|
||||
" mini_batch = []\n",
|
||||
" l = len(self.memory)\n",
|
||||
" for i in range(l - batch_size, l):\n",
|
||||
" mini_batch.append(self.memory[i])\n",
|
||||
" replay_size = len(mini_batch)\n",
|
||||
" X = np.empty((replay_size, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.action_size))\n",
|
||||
" states = np.array([a[0][0] for a in mini_batch])\n",
|
||||
" new_states = np.array([a[3][0] for a in mini_batch])\n",
|
||||
" Q = self.sess.run(self.logits, feed_dict = {self.X: states})\n",
|
||||
" Q_new = self.sess.run(self.logits, feed_dict = {self.X: new_states})\n",
|
||||
" for i in range(len(mini_batch)):\n",
|
||||
" state, action, reward, next_state, done = mini_batch[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action] = reward\n",
|
||||
" if not done:\n",
|
||||
" target[action] += self.gamma * np.amax(Q_new[i])\n",
|
||||
" X[i] = state\n",
|
||||
" Y[i] = target\n",
|
||||
" cost, _ = self.sess.run(\n",
|
||||
" [self.cost, self.optimizer], feed_dict = {self.X: X, self.Y: Y}\n",
|
||||
" )\n",
|
||||
" if self.epsilon > self.epsilon_min:\n",
|
||||
" self.epsilon *= self.epsilon_decay\n",
|
||||
" return cost\n",
|
||||
" \n",
|
||||
" def buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(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 initial_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
||||
" \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",
|
||||
" \n",
|
||||
" state = next_state\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 train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\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] and t < (len(self.trend) - self.half_window):\n",
|
||||
" inventory.append(self.trend[t])\n",
|
||||
" starting_money -= self.trend[t]\n",
|
||||
" \n",
|
||||
" elif action == 2 and len(inventory) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" self.memory.append((state, action, invest, \n",
|
||||
" next_state, starting_money < initial_money))\n",
|
||||
" state = next_state\n",
|
||||
" batch_size = min(self.batch_size, len(self.memory))\n",
|
||||
" cost = self.replay(batch_size)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"epoch: 10, total rewards: 274.710201.3, cost: 0.810730, total money: 10274.710201\n",
|
||||
"epoch: 20, total rewards: 161.429929.3, cost: 0.406487, total money: 10161.429929\n",
|
||||
"epoch: 30, total rewards: 89.659849.3, cost: 0.225568, total money: 10089.659849\n",
|
||||
"epoch: 40, total rewards: 121.209836.3, cost: 0.152499, total money: 10121.209836\n",
|
||||
"epoch: 50, total rewards: 94.869810.3, cost: 0.120762, total money: 10094.869810\n",
|
||||
"epoch: 60, total rewards: 123.609922.3, cost: 0.097353, total money: 10123.609922\n",
|
||||
"epoch: 70, total rewards: 130.149901.3, cost: 0.131718, total money: 10130.149901\n",
|
||||
"epoch: 80, total rewards: 55.369871.3, cost: 0.072531, total money: 10055.369871\n",
|
||||
"epoch: 90, total rewards: 177.780026.3, cost: 0.062346, total money: 10177.780026\n",
|
||||
"epoch: 100, total rewards: 151.249997.3, cost: 0.056566, total money: 10151.249997\n",
|
||||
"epoch: 110, total rewards: 101.629942.3, cost: 0.050717, total money: 10101.629942\n",
|
||||
"epoch: 120, total rewards: 138.329892.3, cost: 0.075178, total money: 10138.329892\n",
|
||||
"epoch: 130, total rewards: 187.559812.3, cost: 0.039170, total money: 10187.559812\n",
|
||||
"epoch: 140, total rewards: 125.699889.3, cost: 0.035156, total money: 10125.699889\n",
|
||||
"epoch: 150, total rewards: 138.249876.3, cost: 0.403965, total money: 10138.249876\n",
|
||||
"epoch: 160, total rewards: 141.329832.3, cost: 0.029966, total money: 10141.329832\n",
|
||||
"epoch: 170, total rewards: 179.989928.3, cost: 0.027219, total money: 10179.989928\n",
|
||||
"epoch: 180, total rewards: 191.619871.3, cost: 0.025002, total money: 10191.619871\n",
|
||||
"epoch: 190, total rewards: 191.929868.3, cost: 0.149151, total money: 10191.929868\n",
|
||||
"epoch: 200, total rewards: 113.759886.3, cost: 0.021398, total money: 10113.759886\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip, \n",
|
||||
" batch_size = batch_size)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 4: buy 1 unit at price 790.510010, total balance 9209.489990\n",
|
||||
"day 5, sell 1 unit at price 785.309998, investment -0.657805 %, total balance 9994.799988,\n",
|
||||
"day 14: buy 1 unit at price 768.270020, total balance 9226.529968\n",
|
||||
"day 16, sell 1 unit at price 761.679993, investment -0.857775 %, total balance 9988.209961,\n",
|
||||
"day 22: buy 1 unit at price 762.520020, total balance 9225.689941\n",
|
||||
"day 23, sell 1 unit at price 759.109985, investment -0.447206 %, total balance 9984.799926,\n",
|
||||
"day 28: buy 1 unit at price 796.099976, total balance 9188.699950\n",
|
||||
"day 29, sell 1 unit at price 797.070007, investment 0.121848 %, total balance 9985.769957,\n",
|
||||
"day 32: buy 1 unit at price 794.200012, total balance 9191.569945\n",
|
||||
"day 35: buy 1 unit at price 791.260010, total balance 8400.309935\n",
|
||||
"day 36: buy 1 unit at price 789.909973, total balance 7610.399962\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment -0.333672 %, total balance 8401.949950,\n",
|
||||
"day 38, sell 1 unit at price 785.049988, investment -0.784827 %, total balance 9186.999938,\n",
|
||||
"day 39, sell 1 unit at price 782.789978, investment -0.901368 %, total balance 9969.789916,\n",
|
||||
"day 42: buy 1 unit at price 786.900024, total balance 9182.889892\n",
|
||||
"day 43: buy 1 unit at price 794.020020, total balance 8388.869872\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 7582.719848\n",
|
||||
"day 45: buy 1 unit at price 806.650024, total balance 6776.069824\n",
|
||||
"day 46: buy 1 unit at price 804.789978, total balance 5971.279846\n",
|
||||
"day 48, sell 1 unit at price 806.359985, investment 2.472990 %, total balance 6777.639831,\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment 1.745546 %, total balance 7585.519836,\n",
|
||||
"day 50, sell 1 unit at price 804.609985, investment -0.191036 %, total balance 8390.129821,\n",
|
||||
"day 51, sell 1 unit at price 806.070007, investment -0.071904 %, total balance 9196.199828,\n",
|
||||
"day 53: buy 1 unit at price 805.020020, total balance 8391.179808\n",
|
||||
"day 56, sell 1 unit at price 835.669983, investment 3.837027 %, total balance 9226.849791,\n",
|
||||
"day 57, sell 1 unit at price 832.150024, investment 3.370103 %, total balance 10058.999815,\n",
|
||||
"day 63: buy 1 unit at price 801.489990, total balance 9257.509825\n",
|
||||
"day 66: buy 1 unit at price 808.380005, total balance 8449.129820\n",
|
||||
"day 67, sell 1 unit at price 809.559998, investment 1.006876 %, total balance 9258.689818,\n",
|
||||
"day 68, sell 1 unit at price 813.669983, investment 0.654392 %, total balance 10072.359801,\n",
|
||||
"day 71: buy 1 unit at price 818.979980, total balance 9253.379821\n",
|
||||
"day 72: buy 1 unit at price 824.159973, total balance 8429.219848\n",
|
||||
"day 73: buy 1 unit at price 828.070007, total balance 7601.149841\n",
|
||||
"day 74: buy 1 unit at price 831.659973, total balance 6769.489868\n",
|
||||
"day 75: buy 1 unit at price 830.760010, total balance 5938.729858\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment 1.422504 %, total balance 6769.359863,\n",
|
||||
"day 82, sell 1 unit at price 829.080017, investment 0.596977 %, total balance 7598.439880,\n",
|
||||
"day 85, sell 1 unit at price 835.369995, investment 0.881567 %, total balance 8433.809875,\n",
|
||||
"day 87, sell 1 unit at price 843.250000, investment 1.393602 %, total balance 9277.059875,\n",
|
||||
"day 88, sell 1 unit at price 845.539978, investment 1.779090 %, total balance 10122.599853,\n",
|
||||
"day 92: buy 1 unit at price 852.119995, total balance 9270.479858\n",
|
||||
"day 93, sell 1 unit at price 848.400024, investment -0.436555 %, total balance 10118.879882,\n",
|
||||
"day 99: buy 1 unit at price 820.919983, total balance 9297.959899\n",
|
||||
"day 101: buy 1 unit at price 831.500000, total balance 8466.459899\n",
|
||||
"day 104, sell 1 unit at price 834.570007, investment 1.662772 %, total balance 9301.029906,\n",
|
||||
"day 105, sell 1 unit at price 831.409973, investment -0.010827 %, total balance 10132.439879,\n",
|
||||
"day 111: buy 1 unit at price 823.559998, total balance 9308.879881\n",
|
||||
"day 113, sell 1 unit at price 836.820007, investment 1.610084 %, total balance 10145.699888,\n",
|
||||
"day 116: buy 1 unit at price 843.190002, total balance 9302.509886\n",
|
||||
"day 117: buy 1 unit at price 862.760010, total balance 8439.749876\n",
|
||||
"day 118: buy 1 unit at price 872.299988, total balance 7567.449888\n",
|
||||
"day 119, sell 1 unit at price 871.729980, investment 3.384762 %, total balance 8439.179868,\n",
|
||||
"day 120: buy 1 unit at price 874.250000, total balance 7564.929868\n",
|
||||
"day 121: buy 1 unit at price 905.960022, total balance 6658.969846\n",
|
||||
"day 122, sell 1 unit at price 912.570007, investment 5.773332 %, total balance 7571.539853,\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 5.060187 %, total balance 8487.979855,\n",
|
||||
"day 124, sell 1 unit at price 927.039978, investment 6.038316 %, total balance 9415.019833,\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 8483.359860\n",
|
||||
"day 126: buy 1 unit at price 927.130005, total balance 7556.229855\n",
|
||||
"day 127: buy 1 unit at price 934.299988, total balance 6621.929867\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 5689.759884\n",
|
||||
"day 129, sell 1 unit at price 928.780029, investment 2.518876 %, total balance 6618.539913,\n",
|
||||
"day 130, sell 1 unit at price 930.599976, investment -0.113775 %, total balance 7549.139889,\n",
|
||||
"day 131: buy 1 unit at price 932.219971, total balance 6616.919918\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 1.711734 %, total balance 7559.919918,\n",
|
||||
"day 134, sell 1 unit at price 919.619995, investment -1.571229 %, total balance 8479.539913,\n",
|
||||
"day 136, sell 1 unit at price 934.010010, investment 0.197392 %, total balance 9413.549923,\n",
|
||||
"day 137, sell 1 unit at price 941.859985, investment 1.034092 %, total balance 10355.409908,\n",
|
||||
"day 139: buy 1 unit at price 954.960022, total balance 9400.449886\n",
|
||||
"day 141, sell 1 unit at price 971.469971, investment 1.728863 %, total balance 10371.919857,\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 9404.969845\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10380.569821,\n",
|
||||
"day 149: buy 1 unit at price 983.409973, total balance 9397.159848\n",
|
||||
"day 151: buy 1 unit at price 942.900024, total balance 8454.259824\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment -4.179333 %, total balance 9396.569822,\n",
|
||||
"day 157: buy 1 unit at price 950.630005, total balance 8445.939817\n",
|
||||
"day 159, sell 1 unit at price 957.090027, investment 1.504932 %, total balance 9403.029844,\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 8437.439817\n",
|
||||
"day 161, sell 1 unit at price 952.270020, investment 0.172519 %, total balance 9389.709837,\n",
|
||||
"day 162, sell 1 unit at price 927.330017, investment -3.962345 %, total balance 10317.039854,\n",
|
||||
"day 173: buy 1 unit at price 947.159973, total balance 9369.879881\n",
|
||||
"day 176, sell 1 unit at price 965.400024, investment 1.925762 %, total balance 10335.279905,\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 9354.939878\n",
|
||||
"day 184, sell 1 unit at price 941.530029, investment -3.958830 %, total balance 10296.469907,\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 9365.969907\n",
|
||||
"day 186: buy 1 unit at price 930.830017, total balance 8435.139890\n",
|
||||
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 9365.529905,\n",
|
||||
"day 189, sell 1 unit at price 927.960022, investment -0.308326 %, total balance 10293.489927,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9366.529905\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment -2.189959 %, total balance 10273.189878,\n",
|
||||
"day 203: buy 1 unit at price 921.280029, total balance 9351.909849\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 8438.099851\n",
|
||||
"day 210, sell 1 unit at price 928.450012, investment 0.778263 %, total balance 9366.549863,\n",
|
||||
"day 213, sell 1 unit at price 926.500000, investment 1.388692 %, total balance 10293.049863,\n",
|
||||
"day 229: buy 1 unit at price 953.270020, total balance 9339.779843\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 1.750816 %, total balance 10309.739865,\n",
|
||||
"day 234: buy 1 unit at price 977.000000, total balance 9332.739865\n",
|
||||
"day 239, sell 1 unit at price 992.000000, investment 1.535312 %, total balance 10324.739865,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4VFX6wPHvnZJGCiGF3hQ4NCkCC4gidl0VVFiwi66ioqKuZW1rxbo/XdeK3VUsYAN2UewFUVCaIMKhB0ghIYT0TDLl98e9EyZlkkkjIXk/z8MDmXvvuWdmbnjue99z3mP4fD6EEEIIIYQQQrRetubugBBCCCGEEEKIpiWBnxBCCCGEEEK0chL4CSGEEEIIIUQrJ4GfEEIIIYQQQrRyEvgJIYQQQgghRCsngZ8QQgghhBBCtHIS+AkhRBBKqTeVUrOboN3jlFK6sdsVLZtSaqdS6uQg2+Yopf5xqPskhBCi7XA0dweEEKK+lFI7gSu11l81xf5NRWu9FFCN3a5S6ltgMBAO7ADu1VovtLadCdxpbS8B/gfcrLXOr9RGB0Cb3dTHBjnPHODigJecQKnWOsbaPhc4CWgHZABPaK1fDTj+SuAOoBPwI3CF1jrN2hYO/Bs412p3GXCN1jo14PjzgfuAHlb707XWS5VSvaz3XRjQt8e11g+F8Nn5j3Vqrd2NvX9ttNbXNLSNhlBKfQfMDfyeDuG5J1jn7lbDPjcDNwCJQAEwD7itus9eKTUGeAgYAXiA74BZWuv0SvuFAb8BMf5zK6WOAz6r1GQ7YIrW+iPr2nsA89p1WfveoLXOs44fADxvnTvL6uMnAees6dq/EHjSavdyrfW31utHAm8Dx2mtPcE+IyGEqI1k/IQQovW4EeistY4FZgBzlVKdrW1xwGygCzAA6Ar8s5o2Hgc21nQSrfU1Wuto/x/gPeCDgF0eBXpZ/ZgIzFZKjYDym/xHgElAB8zg6b1K72EsMMTqaw7wrH+jUuoUq4+XAzHAeGB7pS62D+hfrUGfOCwsAo62rqnBwFBgVpB944GXgV5ATyAfeKOa/W7DDM7Kaa2XVrq2z8IMNJdYuywDxmmt44AjMB+gzwZQSjmAhZgPVTpw8Hewn7V9AkGufevYx4CjgesJuOaBZzAf0kjQJ4RoEMn4CSEOS0qptzEzPv9VSnmAB7XWTyilJmIGHl2BtcC1WuuNNez/AXAcEIn59P9arfWGEM5vB54ALsO8sXwS82bNqbV2K6UuB24HumHeXD6utX7JOnYCARkOKxP5HHAp5o3qEuAyrXWJUioReBM4FvACG4Djtdbeyn3SWq8L+NGHmTHrDqRrrd8N2FaklHoFM3MR+J6Owbypfhn4a22fgXVMO2Ay5g2yvx+Bn5/P+nMksMra7wP/Pkqph4BUpdSRWuttQG/gc631Xmv7POCpgPYewPzulls/p9I4frD+PqCUAjgFWAHcBVyFeX0swczu5AbZPxN4BTMo8QGfA9dprQ/UdnKl1JvAHq31Pf7rA/gX8HfMrNVdWus3lFKjMYOLrv5AQCl1LvCA1nqIUsqGed1dBbQHvsbMmO5XSkUArwJnAHZgC+b3MQvzd2CMUupp4E2t9fVKKR9wHXAzZobqacxr8W3M62QJcLHWutTqx1mYQVAv4A/rvOusbTup5hq3+vEZEK6UKrA+jn7+LJifdW34GZi/C32q+yy11hUydkqp54DvK73WGzNr/TfM7yyYy4APtdaFVtu7K233BPSjP+bDin9prX3AN0qpZcAlwD+o4drHDC5TtdbpSqmvMINKlFJTrNdX1NBHIYQIiWT8hBCHJa31JcAu4Gzr6fwT1pP194CbgCTgU8xAL6y6/a2mPgP6AsnAauCdELtwFeYN9DDMp/TnVNqeiXmjF4uZnfqXUuroGtqbCpyOGfgMAaZbr98C7LHeT0fMQMQXrBGl1P+UUiWYQct3wMogu47HDCL9x9kxb8yvr6n9akzGDGx/CHxRKfWCUqoI2ASkY34XfkY1/x5s/f0aME4p1UUpFQVchDX0zurjSCBJKbVVKbVHKfWcUiqyUp9SrG1vWIFzKMZbf/uzhT9jfgfTgRMwb8SjMT+jYPsbmA8d/FnV7sD9IZ6/sk6YWdqumEH480qpeCsAKARODNj3QsAf2N+AeS0ez8GM6fPWtsusNrsDCcA1QLHW+m5gKXC99V6uD2j7NMxhi2MwA8qXMQOm7pjf2QUASqnhwOvA1VbbLwGLrKG7flWucSugOgNIC8i0VQj6/JRSFyql8oB9mMH1S7V9iJYK17rlWczfpeJgB1kPNaYA/6n0+rFKqVzMBz6TMQPiYAwOXtv+nyv/ezDm71CCUqob5kOEDUqpGOAezCHaQgjRYBL4CSFak2nAYq31l1rrMuD/MDM1xwQ7QGv9utY6X2vtwrxJH6qUigvhXFOBf2ut92itczCHaQW2u1hrvU1r7dNafw98gZlVCeYZrXWa1no/8F/MgBKgDOgM9NRal1lD0YIGZlrrszCHQP4Z+KK6zKA1XPIy4N6Al2cBK7TWq2p535VdBrxVuU9a65lWP44DPsactwRmpmeqUmqIFbDdixloRlnbtwC7MTN5eZgB1IPWto6YWcwpVrvDgOGYN8dgBgSjMDNKI6zzhxrIV+ci4Cmt9XatdQHmDfj51rC8KrTWW61rz6W1zsLMVB5fz3OXYWY2y7TWn2JmhPzzQt/jYMDl/679w2WvAe62rkv/NT3F6nMZZlDWR2vt0Vqv8s9Nq8ETWus8K0v1O+Y1td3Ken6G+fmDOazxJa31Cqvt/2B+52MC2gp2jYdEa/2uNdSzHzAH2FvbMUqpIZjX2G0Br50L2APn3gVxHuY1VSFbqLX+0Rrq2Q1zuPRO/ybMBz63KaWcSqlTMb9//7Ud9Nq3fk+vBT4EbsV8sPQAZoA6RCn1rVLqc6VUYBAphBB1IkM9hRCtSRcgxf+D1tqrlNqNmTWpwsogPQz8BTOj5g+SEoHcEM4VOOyrwhAwpdQZmAVI+mE+ZIsC1tfQXkbAv4us9sG8sbwf+MIaUviy1voxamAFvZ8ppW5USm3VWi8K6NcYzOzQFK31Zuu1LpiB34ia2q1MKdUDmIB5k1pdPzzAj0qpizFvap/RWn+llLoP+AgzG/o0ZuZkj3XY85jFaRIwM1u3YwYYozmYnXlWW4U6lFJPYQZ+d1vBmT/DuVcpdT2QrpSK0ZWK2ISowvVk/duBGYBWoZTqiFmY5jjMoNOGmXGrj2xdsXBJEWbGEczv7yel1LWYwclqrbW/nz2BT5RSgQG/x+rz25iZuveVUu0xh5PebV0vwQQGV8XV/Nwp4LyXKaVuCNgexsHrGIJf43Witd6ilNoAvID5/qullOqDee3cqM2CSv4s3hOYwXJtqn2oEdCPVKXUEuB9zPmHZUqpczCDtb9jXovzsR561Hbta62/xhyai1JqKGZ2+zbMwPJYzO/uVSoG00IIETIJ/IQQh7PKN2RpwFH+H5RSBubNUmqQ/S/ELLRwMubNVRzmjbpB7dIxn/j7dQ84bzjmzd2lwELrhnBBiO1WYAUstwC3WE/7v1FK/WrdJNbGgTm3zt+v4ZhFMq6odPyfMLOKf1jBZSQQqZTKIGAuWTUuAZZprSsXV6mxH1rr57GGH1rDc+/BzCaBmQW628oKoZR6FnhQKZWotd6nlNpDxe+xpmGp/m2hjG6prp00zIDGrwfgxgx+qnuY8IjVzlHWnLpzODg0tNForf9QSqVgDpEMHOYJ5gOIK7TWy4Ic/gDwgDKrkn6KmaV6jboN763ObuBhrfXD9Ti2PueucE1VppTqCXwFPKS1fjtgU1/MOYhLrWs9DIizrvUxWuud1vHdMR9qXF2XflhzGsuzvEqpnwgYKlrLte8/xsC8bvxVTO1a6xSrj0Nq6Y8QQgQlgZ8Q4nC2F6sIgmU+cIdS6iTMOWc3Yj5t/ynI/jHW9mzMjNwjdTj3fOBGpdRizMzU3wO2hWFmrbIAt5X9O5VKN3ihsApmbAK2YWYhPRzMTAbu1x9z7tR3mMHJNMy5Tbdb2/3FOG7QWv+30uGfYd4M+03DCoprCPrADGwfr9SPZMz5Z//DzAidjDks0T80MQKzGMYGzGD5Zcwhs/7M2K/ApcpcXqAImIk5/2uftf0N4AYr01KGWXjkf1bbo4EDmMNF4zGrIX5nDUtEKXU/MEFrPaGa95KF+bkeAWy2XnsP+LtS6jNr+yPAPG0W76lu/xjM7yhXKdWVgOGFTeBdzOt7DOaQVL85wMNKqcusYCEJOEZrvVApdQLm0MU/MIfRlnHwWqr8u1FXr2BmGr8CfsH8fZoA/BBCtnUv5vy2OP93VZkyl0FYpLXOVEoNxBx2+3mQfbsC3wDPaa3nVNr8OwEPaTCHgT+HOU83sMLnJcBPlYrKoJS6CFiqtd5lBZcPY2XprO1DMK8HG+a12xmzIE4o177flZhZ3LXWEN1I6z33oGoFWyGECJnM8RNCHM4eBe5RSh1QSt2qtdaYhSeexbzBPRuzmEtpdfsDb2EO30vFvBleXuUMwb2COW9vHbAGM3viBjzWje4szOAwBzOIWhSkndr0xcxcFAA/Ay9oa32vSgzMIaGZmDewNwLTtNarre23YA5nfU0pVWD92QBgzUnL8P/BDF7KrH+jlOph7d/DfzKl1FjMjGfgMg5gZm+uxRy+loM5z/KmgOGmEZhBSwFmgPAzZsVDv1sx1xncYr2PP2Ou6ef3EGZwuBlz2Yk1mDffYAYuSzCHz/2OGdRfEHBsd8xy/FVorYusdpZZ18cYzGIlb2M+RNhh9euGGvZ/ADOAyAUWY85tbCrvYWaWvgkIisEcaroIc2hwPuY1Pdra1glzDlke5mf3vfX+/MdNUUrlKKWeqWtntNYrMYf8Pof5vW/lYIGi2o7dZL2f7dZnWd0Q0HHAeqVUIebv2qeYxVkAUEptsIIyMAOnI4D7A67Line truncated
|
||||
"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
|
||||
}
|
||||
+673
@@ -0,0 +1,673 @@
|
||||
{
|
||||
"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": "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 truncated
|
||||
"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
|
||||
}
|
||||
+548
@@ -0,0 +1,548 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Model:\n",
|
||||
" def __init__(self, input_size, output_size, layer_size, learning_rate):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" feed_forward = tf.layers.dense(self.X, layer_size, activation = tf.nn.relu)\n",
|
||||
" self.logits = tf.layers.dense(feed_forward, output_size)\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 500\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" self.trainable = tf.trainable_variables()\n",
|
||||
" \n",
|
||||
" def _assign(self):\n",
|
||||
" for i in range(len(self.trainable)//2):\n",
|
||||
" assign_op = self.trainable[i+len(self.trainable)//2].assign(self.trainable[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
"\n",
|
||||
" def _memorize(self, state, action, reward, new_state, done):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" Q = self.predict(states)\n",
|
||||
" Q_new = self.predict(new_states)\n",
|
||||
" Q_new_negative = self.sess.run(self.model_negative.logits, feed_dict={self.model_negative.X:new_states})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, done_r = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not done_r:\n",
|
||||
" target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" return X, Y\n",
|
||||
"\n",
|
||||
" def predict(self, inputs):\n",
|
||||
" return self.sess.run(self.model.logits, feed_dict={self.model.X:inputs})\n",
|
||||
" \n",
|
||||
" def get_predicted_action(self, sequence):\n",
|
||||
" prediction = self.predict(np.array(sequence))[0]\n",
|
||||
" return np.argmax(prediction)\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action = self._select_action(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",
|
||||
" \n",
|
||||
" state = next_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign()\n",
|
||||
" \n",
|
||||
" action = self._select_action(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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" \n",
|
||||
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" state = next_state\n",
|
||||
" X, Y = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n",
|
||||
" feed_dict={self.model.X: X, self.model.Y:Y})\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"epoch: 10, total rewards: 1241.885127.3, cost: 1.110860, total money: 1744.875178\n",
|
||||
"epoch: 20, total rewards: 89.105106.3, cost: 0.649060, total money: 8097.275088\n",
|
||||
"epoch: 30, total rewards: 719.079470.3, cost: 0.823131, total money: 9699.809450\n",
|
||||
"epoch: 40, total rewards: 684.040043.3, cost: 1.931746, total money: 134.750004\n",
|
||||
"epoch: 50, total rewards: 1744.829771.3, cost: 0.895153, total money: 11744.829771\n",
|
||||
"epoch: 60, total rewards: 149.195010.3, cost: 1.097174, total money: 5196.854982\n",
|
||||
"epoch: 70, total rewards: 1389.289786.3, cost: 0.860031, total money: 9399.319754\n",
|
||||
"epoch: 80, total rewards: 529.019898.3, cost: 0.305593, total money: 10529.019898\n",
|
||||
"epoch: 90, total rewards: 1285.264893.3, cost: 1.882383, total money: 9251.514893\n",
|
||||
"epoch: 100, total rewards: 409.474970.3, cost: 0.146280, total money: 551.414972\n",
|
||||
"epoch: 110, total rewards: 1074.725155.3, cost: 0.661549, total money: 2231.475154\n",
|
||||
"epoch: 120, total rewards: 1713.854676.3, cost: 1.219318, total money: 11713.854676\n",
|
||||
"epoch: 130, total rewards: 871.945621.3, cost: 1.460638, total money: 8947.665652\n",
|
||||
"epoch: 140, total rewards: 1564.314818.3, cost: 1.133385, total money: 2767.354796\n",
|
||||
"epoch: 150, total rewards: 855.729796.3, cost: 1.886093, total money: 10855.729796\n",
|
||||
"epoch: 160, total rewards: 302.970157.3, cost: 0.642825, total money: 6320.700137\n",
|
||||
"epoch: 170, total rewards: 512.139521.3, cost: 3.411159, total money: 1801.649470\n",
|
||||
"epoch: 180, total rewards: 769.354739.3, cost: 0.379282, total money: 10769.354739\n",
|
||||
"epoch: 190, total rewards: 332.274720.3, cost: 1.111366, total money: 10332.274720\n",
|
||||
"epoch: 200, total rewards: 395.419923.3, cost: 0.270106, total money: 5401.389893\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
|
||||
"day 9, sell 1 unit at price 758.489990, investment 0.592818 %, total balance 10004.469970,\n",
|
||||
"day 10: buy 1 unit at price 764.479980, total balance 9239.989990\n",
|
||||
"day 11: buy 1 unit at price 771.229980, total balance 8468.760010\n",
|
||||
"day 12, sell 1 unit at price 760.539978, investment -0.515383 %, total balance 9229.299988,\n",
|
||||
"day 13, sell 1 unit at price 769.200012, investment -0.263212 %, total balance 9998.500000,\n",
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 9230.260010\n",
|
||||
"day 19, sell 1 unit at price 758.039978, investment -1.327712 %, total balance 9988.299988,\n",
|
||||
"day 21: buy 1 unit at price 750.500000, total balance 9237.799988\n",
|
||||
"day 22, sell 1 unit at price 762.520020, investment 1.601602 %, total balance 10000.320008,\n",
|
||||
"day 26: buy 1 unit at price 789.289978, total balance 9211.030030\n",
|
||||
"day 27, sell 1 unit at price 789.270020, investment -0.002529 %, total balance 10000.300050,\n",
|
||||
"day 30: buy 1 unit at price 797.849976, total balance 9202.450074\n",
|
||||
"day 33, sell 1 unit at price 796.419983, investment -0.179231 %, total balance 9998.870057,\n",
|
||||
"day 41: buy 1 unit at price 786.140015, total balance 9212.730042\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 0.096676 %, total balance 9999.630066,\n",
|
||||
"day 45: buy 1 unit at price 806.650024, total balance 9192.980042\n",
|
||||
"day 46: buy 1 unit at price 804.789978, total balance 8388.190064\n",
|
||||
"day 47, sell 1 unit at price 807.909973, investment 0.156195 %, total balance 9196.100037,\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment 0.383954 %, total balance 10003.980042,\n",
|
||||
"day 54: buy 1 unit at price 819.309998, total balance 9184.670044\n",
|
||||
"day 55, sell 1 unit at price 823.869995, investment 0.556566 %, total balance 10008.540039,\n",
|
||||
"day 61: buy 1 unit at price 795.695007, total balance 9212.845032\n",
|
||||
"day 62, sell 1 unit at price 798.530029, investment 0.356295 %, total balance 10011.375061,\n",
|
||||
"day 64: buy 1 unit at price 801.340027, total balance 9210.035034\n",
|
||||
"day 65, sell 1 unit at price 806.969971, investment 0.702566 %, total balance 10017.005005,\n",
|
||||
"day 66: buy 1 unit at price 808.380005, total balance 9208.625000\n",
|
||||
"day 67: buy 1 unit at price 809.559998, total balance 8399.065002\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 7585.395019\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 1.343426 %, total balance 8404.635009,\n",
|
||||
"day 70, sell 1 unit at price 820.450012, investment 1.345177 %, total balance 9225.085021,\n",
|
||||
"day 71, sell 1 unit at price 818.979980, investment 0.652598 %, total balance 10044.065001,\n",
|
||||
"day 74: buy 1 unit at price 831.659973, total balance 9212.405028\n",
|
||||
"day 76, sell 1 unit at price 831.330017, investment -0.039674 %, total balance 10043.735045,\n",
|
||||
"day 79: buy 1 unit at price 823.210022, total balance 9220.525023\n",
|
||||
"day 80, sell 1 unit at price 835.239990, investment 1.461349 %, total balance 10055.765013,\n",
|
||||
"day 83: buy 1 unit at price 827.780029, total balance 9227.984984\n",
|
||||
"day 84, sell 1 unit at price 831.909973, investment 0.498918 %, total balance 10059.894957,\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 9245.464964\n",
|
||||
"day 98, sell 1 unit at price 819.510010, investment 0.623751 %, total balance 10064.974974,\n",
|
||||
"day 102: buy 1 unit at price 829.559998, total balance 9235.414976\n",
|
||||
"day 103, sell 1 unit at price 838.549988, investment 1.083706 %, total balance 10073.964964,\n",
|
||||
"day 104: buy 1 unit at price 834.570007, total balance 9239.394957\n",
|
||||
"day 105, sell 1 unit at price 831.409973, investment -0.378642 %, total balance 10070.804930,\n",
|
||||
"day 107: buy 1 unit at price 824.669983, total balance 9246.134947\n",
|
||||
"day 108: buy 1 unit at price 824.729980, total balance 8421.404967\n",
|
||||
"day 109, sell 1 unit at price 823.349976, investment -0.160065 %, total balance 9244.754943,\n",
|
||||
"day 110, sell 1 unit at price 824.320007, investment -0.049710 %, total balance 10069.074950,\n",
|
||||
"day 113: buy 1 unit at price 836.820007, total balance 9232.254943\n",
|
||||
"day 114, sell 1 unit at price 838.210022, investment 0.166107 %, total balance 10070.464965,\n",
|
||||
"day 117: buy 1 unit at price 862.760010, total balance 9207.704955\n",
|
||||
"day 118, sell 1 unit at price 872.299988, investment 1.105751 %, total balance 10080.004943,\n",
|
||||
"day 120: buy 1 unit at price 874.250000, total balance 9205.754943\n",
|
||||
"day 123, sell 1 unit at price 916.440002, investment 4.825851 %, total balance 10122.194945,\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 9190.534972\n",
|
||||
"day 126: buy 1 unit at price 927.130005, total balance 8263.404967\n",
|
||||
"day 127, sell 1 unit at price 934.299988, investment 0.283367 %, total balance 9197.704955,\n",
|
||||
"day 128, sell 1 unit at price 932.169983, investment 0.543611 %, total balance 10129.874938,\n",
|
||||
"day 132: buy 1 unit at price 937.080017, total balance 9192.794921\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 0.631748 %, total balance 10135.794921,\n",
|
||||
"day 135: buy 1 unit at price 930.239990, total balance 9205.554931\n",
|
||||
"day 138, sell 1 unit at price 948.820007, investment 1.997336 %, total balance 10154.374938,\n",
|
||||
"day 139: buy 1 unit at price 954.960022, total balance 9199.414916\n",
|
||||
"day 140, sell 1 unit at price 969.539978, investment 1.526761 %, total balance 10168.954894,\n",
|
||||
"day 141: buy 1 unit at price 971.469971, total balance 9197.484923\n",
|
||||
"day 143, sell 1 unit at price 964.859985, investment -0.680411 %, total balance 10162.344908,\n",
|
||||
"day 153: buy 1 unit at price 950.760010, total balance 9211.584898\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment -0.888764 %, total balance 10153.894896,\n",
|
||||
"day 157: buy 1 unit at price 950.630005, total balance 9203.264891\n",
|
||||
"day 158, sell 1 unit at price 959.450012, investment 0.927807 %, total balance 10162.714903,\n",
|
||||
"day 161: buy 1 unit at price 952.270020, total balance 9210.444883\n",
|
||||
"day 162: buy 1 unit at price 927.330017, total balance 8283.114866\n",
|
||||
"day 163, sell 1 unit at price 940.489990, investment -1.237047 %, total balance 9223.604856,\n",
|
||||
"day 164, sell 1 unit at price 917.789978, investment -1.028764 %, total balance 10141.394834,\n",
|
||||
"day 171: buy 1 unit at price 930.090027, total balance 9211.304807\n",
|
||||
"day 172, sell 1 unit at price 943.830017, investment 1.477275 %, total balance 10155.134824,\n",
|
||||
"day 178: buy 1 unit at price 968.150024, total balance 9186.984800\n",
|
||||
"day 179, sell 1 unit at price 972.919983, investment 0.492688 %, total balance 10159.904783,\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 9179.564756\n",
|
||||
"day 181: buy 1 unit at price 950.700012, total balance 8228.864744\n",
|
||||
"day 182: buy 1 unit at price 947.799988, total balance 7281.064756\n",
|
||||
"day 183: buy 1 unit at price 934.090027, total balance 6346.974729\n",
|
||||
"day 185: buy 1 unit at price 930.500000, total balance 5416.474729\n",
|
||||
"day 186, sell 1 unit at price 930.830017, investment -5.050290 %, total balance 6347.304746,\n",
|
||||
"day 188: buy 1 unit at price 923.650024, total balance 5423.654722\n",
|
||||
"day 189: buy 1 unit at price 927.960022, total balance 4495.694700\n",
|
||||
"day 190, sell 1 unit at price 929.359985, investment -2.244665 %, total balance 5425.054685,\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -4.279384 %, total balance 6332.294675,\n",
|
||||
"day 195, sell 1 unit at price 922.669983, investment -1.222585 %, total balance 7254.964658,\n",
|
||||
"day 196, sell 1 unit at price 922.219971, investment -0.889847 %, total balance 8177.184629,\n",
|
||||
"day 197, sell 1 unit at price 926.960022, investment 0.358361 %, total balance 9104.144651,\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.829825 %, total balance 10015.124631,\n",
|
||||
"day 202: buy 1 unit at price 927.000000, total balance 9088.124631\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 8174.314633\n",
|
||||
"day 207, sell 1 unit at price 929.570007, investment 0.277239 %, total balance 9103.884640,\n",
|
||||
"day 208, sell 1 unit at price 939.330017, investment 2.792705 %, total balance 10043.214657,\n",
|
||||
"day 215: buy 1 unit at price 932.070007, total balance 9111.144650\n",
|
||||
"day 217: buy 1 unit at price 925.109985, total balance 8186.034665\n",
|
||||
"day 218: buy 1 unit at price 920.289978, total balance 7265.744687\n",
|
||||
"day 219: buy 1 unit at price 915.000000, total balance 6350.744687\n",
|
||||
"day 220: buy 1 unit at price 921.809998, total balance 5428.934689\n",
|
||||
"day 221, sell 1 unit at price 931.580017, investment -0.052570 %, total balance 6360.514706,\n",
|
||||
"day 222: buy 1 unit at price 932.450012, total balance 5428.064694\n",
|
||||
"day 223: buy 1 unit at price 928.530029, total balance 4499.534665\n",
|
||||
"day 224, sell 1 unit at price 920.969971, investment -0.447516 %, total balance 5420.504636,\n",
|
||||
"day 225: buy 1 unit at price 924.859985, total balance 4495.644651\n",
|
||||
"day 226: buy 1 unit at price 944.489990, total balance 3551.154661\n",
|
||||
"day 228, sell 1 unit at price 959.109985, investment 4.218236 %, total balance 4510.264646,\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 4.182516 %, total balance 5463.534666,\n",
|
||||
"day 230, sell 1 unit at price 957.789978, investment 3.903188 %, total balance 6421.324644,\n",
|
||||
"day 231, sell 1 unit at price 951.679993, investment 2.062307 %, total balance 7373.004637,\n",
|
||||
"day 232, sell 1 unit at price 969.960022, investment 4.461890 %, total balance 8342.964659,\n",
|
||||
"day 235: buy 1 unit at price 972.599976, total balance 7370.364683\n",
|
||||
"day 236, sell 1 unit at price 989.250000, investment 6.962137 %, total balance 8359.614683,\n",
|
||||
"day 238: buy 1 unit at price 989.679993, total balance 7369.934690\n",
|
||||
"day 241: buy 1 unit at price 992.809998, total balance 6377.124692\n",
|
||||
"day 242, sell 1 unit at price 984.450012, investment 4.230857 %, total balance 7361.574704,\n",
|
||||
"day 243: buy 1 unit at price 988.200012, total balance 6373.374692\n",
|
||||
"day 244: buy 1 unit at price 968.450012, total balance 5404.924680\n",
|
||||
"day 245, sell 1 unit at price 970.539978, investment -0.211803 %, total balance 6375.464658,\n",
|
||||
"day 246: buy 1 unit at price 973.330017, total balance 5402.134641\n",
|
||||
"day 247, sell 1 unit at price 972.559998, investment -1.729852 %, total balance 6374.694639,\n",
|
||||
"day 248: buy 1 unit at price 1019.270020, total balance 5355.424619\n",
|
||||
"day 249, sell 1 unit at price 1017.109985, investment 2.447597 %, total balance 6372.534604,\n",
|
||||
"day 250: buy 1 unit at price 1016.640015, total balance 5355.894589\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+458
@@ -0,0 +1,458 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, self.OUTPUT_SIZE))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * self.LAYER_SIZE))\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" self.logits = tf.layers.dense(self.rnn[:,-1], self.OUTPUT_SIZE)\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = self.LEARNING_RATE).minimize(self.cost)\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" \n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.logits, feed_dict={self.X:states, self.hidden_layer:init_values})\n",
|
||||
" Q_new = self.sess.run(self.logits, feed_dict={self.X:new_states, self.hidden_layer:init_values})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, 4, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not dead_r:\n",
|
||||
" target[action_r] += self.GAMMA * np.amax(Q_new[i])\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" INIT_VAL[i] = rnn_memory\n",
|
||||
" return X, Y, INIT_VAL\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action, last_state = self.sess.run([self.logits,self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.logits,\n",
|
||||
" self.last_state],\n",
|
||||
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" X, Y, INIT_VAL = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.cost, self.optimizer], \n",
|
||||
" feed_dict={self.X: X, self.Y:Y,\n",
|
||||
" self.hidden_layer: INIT_VAL})\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" \n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7fef003b2d30>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 449.400388.3, cost: 0.117951, total money: 7420.680355\n",
|
||||
"epoch: 20, total rewards: 513.109983.3, cost: 0.187314, total money: 7552.130003\n",
|
||||
"epoch: 30, total rewards: 1755.114813.3, cost: 0.337607, total money: 6759.834784\n",
|
||||
"epoch: 40, total rewards: 545.719909.3, cost: 0.555657, total money: 9529.079894\n",
|
||||
"epoch: 50, total rewards: 593.435182.3, cost: 0.399239, total money: 6611.165162\n",
|
||||
"epoch: 60, total rewards: 285.174678.3, cost: 0.071772, total money: 6314.564631\n",
|
||||
"epoch: 70, total rewards: 169.200014.3, cost: 0.796504, total money: 4264.030030\n",
|
||||
"epoch: 80, total rewards: 520.019840.3, cost: 0.567794, total money: 6501.959842\n",
|
||||
"epoch: 90, total rewards: 498.320189.3, cost: 0.245750, total money: 9481.210204\n",
|
||||
"epoch: 100, total rewards: 1572.605044.3, cost: 1.142984, total money: 11572.605044\n",
|
||||
"epoch: 110, total rewards: 297.584960.3, cost: 0.973414, total money: 10297.584960\n",
|
||||
"epoch: 120, total rewards: 912.394901.3, cost: 2.032860, total money: 6987.034854\n",
|
||||
"epoch: 130, total rewards: 22.109988.3, cost: 0.097879, total money: 10022.109988\n",
|
||||
"epoch: 140, total rewards: 471.779909.3, cost: 0.532008, total money: 10471.779909\n",
|
||||
"epoch: 150, total rewards: 215.255126.3, cost: 0.236825, total money: 10215.255126\n",
|
||||
"epoch: 160, total rewards: 147.780093.3, cost: 0.432537, total money: 9174.450076\n",
|
||||
"epoch: 170, total rewards: 203.309817.3, cost: 0.413111, total money: 10203.309817\n",
|
||||
"epoch: 180, total rewards: 76.350403.3, cost: 0.132205, total money: 8084.520385\n",
|
||||
"epoch: 190, total rewards: 173.749880.3, cost: 1.325852, total money: 10173.749880\n",
|
||||
"epoch: 200, total rewards: 4.325196.3, cost: 0.500293, total money: 8987.685181\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 13: buy 1 unit at price 769.200012, total balance 9230.799988\n",
|
||||
"day 14: buy 1 unit at price 768.270020, total balance 8462.529968\n",
|
||||
"day 15, sell 1 unit at price 760.989990, investment -1.067346 %, total balance 9223.519958,\n",
|
||||
"day 17: buy 1 unit at price 768.239990, total balance 8455.279968\n",
|
||||
"day 18, sell 1 unit at price 770.840027, investment 0.334519 %, total balance 9226.119995,\n",
|
||||
"day 19, sell 1 unit at price 758.039978, investment -1.327712 %, total balance 9984.159973,\n",
|
||||
"day 29: buy 1 unit at price 797.070007, total balance 9187.089966\n",
|
||||
"day 30: buy 1 unit at price 797.849976, total balance 8389.239990\n",
|
||||
"day 33, sell 1 unit at price 796.419983, investment -0.081552 %, total balance 9185.659973,\n",
|
||||
"day 34: buy 1 unit at price 794.559998, total balance 8391.099975\n",
|
||||
"day 36, sell 1 unit at price 789.909973, investment -0.995175 %, total balance 9181.009948,\n",
|
||||
"day 37, sell 1 unit at price 791.549988, investment -0.378827 %, total balance 9972.559936,\n",
|
||||
"day 39: buy 1 unit at price 782.789978, total balance 9189.769958\n",
|
||||
"day 40, sell 1 unit at price 771.820007, investment -1.401394 %, total balance 9961.589965,\n",
|
||||
"day 46: buy 1 unit at price 804.789978, total balance 9156.799987\n",
|
||||
"day 47: buy 1 unit at price 807.909973, total balance 8348.890014\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment 0.383954 %, total balance 9156.770019,\n",
|
||||
"day 50, sell 1 unit at price 804.609985, investment -0.408460 %, total balance 9961.380004,\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 9155.309997\n",
|
||||
"day 54, sell 1 unit at price 819.309998, investment 1.642536 %, total balance 9974.619995,\n",
|
||||
"day 110: buy 1 unit at price 824.320007, total balance 9150.299988\n",
|
||||
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 9973.859986,\n",
|
||||
"day 128: buy 1 unit at price 932.169983, total balance 9041.690003\n",
|
||||
"day 129: buy 1 unit at price 928.780029, total balance 8112.909974\n",
|
||||
"day 130, sell 1 unit at price 930.599976, investment -0.168425 %, total balance 9043.509950,\n",
|
||||
"day 131, sell 1 unit at price 932.219971, investment 0.370372 %, total balance 9975.729921,\n",
|
||||
"day 173: buy 1 unit at price 947.159973, total balance 9028.569948\n",
|
||||
"day 175, sell 1 unit at price 953.419983, investment 0.660924 %, total balance 9981.989931,\n",
|
||||
"day 182: buy 1 unit at price 947.799988, total balance 9034.189943\n",
|
||||
"day 183, sell 1 unit at price 934.090027, investment -1.446504 %, total balance 9968.279970,\n",
|
||||
"day 197: buy 1 unit at price 926.960022, total balance 9041.319948\n",
|
||||
"day 198, sell 1 unit at price 910.979980, investment -1.723919 %, total balance 9952.299928,\n",
|
||||
"day 204: buy 1 unit at price 915.890015, total balance 9036.409913\n",
|
||||
"day 205, sell 1 unit at price 913.809998, investment -0.227103 %, total balance 9950.219911,\n",
|
||||
"day 207: buy 1 unit at price 929.570007, total balance 9020.649904\n",
|
||||
"day 209, sell 1 unit at price 937.340027, investment 0.835872 %, total balance 9957.989931,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+598
@@ -0,0 +1,598 @@
|
||||
{
|
||||
"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": [
|
||||
"from collections import deque\n",
|
||||
"import random\n",
|
||||
"\n",
|
||||
"class Model:\n",
|
||||
" def __init__(self, input_size, output_size, layer_size, learning_rate, name):\n",
|
||||
" with tf.variable_scope(name):\n",
|
||||
" self.X = tf.placeholder(tf.float32, (None, None, input_size))\n",
|
||||
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
||||
" cell = tf.nn.rnn_cell.LSTMCell(layer_size, state_is_tuple = False)\n",
|
||||
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * layer_size))\n",
|
||||
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
|
||||
" dtype=tf.float32,\n",
|
||||
" initial_state=self.hidden_layer)\n",
|
||||
" self.logits = tf.layers.dense(self.rnn[:,-1], output_size)\n",
|
||||
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
|
||||
" self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
|
||||
" \n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" LEARNING_RATE = 0.003\n",
|
||||
" BATCH_SIZE = 32\n",
|
||||
" LAYER_SIZE = 256\n",
|
||||
" OUTPUT_SIZE = 3\n",
|
||||
" EPSILON = 0.5\n",
|
||||
" DECAY_RATE = 0.005\n",
|
||||
" MIN_EPSILON = 0.1\n",
|
||||
" GAMMA = 0.99\n",
|
||||
" MEMORIES = deque()\n",
|
||||
" COPY = 1000\n",
|
||||
" T_COPY = 0\n",
|
||||
" MEMORY_SIZE = 300\n",
|
||||
" \n",
|
||||
" def __init__(self, state_size, window_size, trend, skip):\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",
|
||||
" tf.reset_default_graph()\n",
|
||||
" self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
|
||||
" self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n",
|
||||
" 'real_model')\n",
|
||||
" self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n",
|
||||
" 'negative_model')\n",
|
||||
" self.sess = tf.InteractiveSession()\n",
|
||||
" self.sess.run(tf.global_variables_initializer())\n",
|
||||
" self.trainable = tf.trainable_variables()\n",
|
||||
" \n",
|
||||
" def _assign(self, from_name, to_name):\n",
|
||||
" from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n",
|
||||
" to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n",
|
||||
" for i in range(len(from_w)):\n",
|
||||
" assign_op = to_w[i].assign(from_w[i])\n",
|
||||
" self.sess.run(assign_op)\n",
|
||||
"\n",
|
||||
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
|
||||
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
|
||||
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
|
||||
" self.MEMORIES.popleft()\n",
|
||||
"\n",
|
||||
" def _select_action(self, state):\n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action = self.get_predicted_action([state])\n",
|
||||
" return action\n",
|
||||
"\n",
|
||||
" def _construct_memories(self, replay):\n",
|
||||
" states = np.array([a[0] for a in replay])\n",
|
||||
" new_states = np.array([a[3] for a in replay])\n",
|
||||
" init_values = np.array([a[-1] for a in replay])\n",
|
||||
" Q = self.sess.run(self.model.logits, feed_dict={self.model.X:states, \n",
|
||||
" self.model.hidden_layer:init_values})\n",
|
||||
" Q_new = self.sess.run(self.model.logits, feed_dict={self.model.X:new_states, \n",
|
||||
" self.model.hidden_layer:init_values})\n",
|
||||
" Q_new_negative = self.sess.run(self.model_negative.logits, \n",
|
||||
" feed_dict={self.model_negative.X:new_states, \n",
|
||||
" self.model_negative.hidden_layer:init_values})\n",
|
||||
" replay_size = len(replay)\n",
|
||||
" X = np.empty((replay_size, 4, self.state_size))\n",
|
||||
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
|
||||
" INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n",
|
||||
" for i in range(replay_size):\n",
|
||||
" state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n",
|
||||
" target = Q[i]\n",
|
||||
" target[action_r] = reward_r\n",
|
||||
" if not dead_r:\n",
|
||||
" target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n",
|
||||
" X[i] = state_r\n",
|
||||
" Y[i] = target\n",
|
||||
" INIT_VAL[i] = rnn_memory\n",
|
||||
" return X, Y, INIT_VAL\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 buy(self, initial_money):\n",
|
||||
" starting_money = initial_money\n",
|
||||
" states_sell = []\n",
|
||||
" states_buy = []\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" action, last_state = self.sess.run([self.model.logits,self.model.last_state],\n",
|
||||
" feed_dict={self.model.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.model.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_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",
|
||||
" \n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" self.INITIAL_FEATURES = new_state\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",
|
||||
" \n",
|
||||
" def train(self, iterations, checkpoint, initial_money):\n",
|
||||
" for i in range(iterations):\n",
|
||||
" total_profit = 0\n",
|
||||
" inventory = []\n",
|
||||
" state = self.get_state(0)\n",
|
||||
" starting_money = initial_money\n",
|
||||
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
|
||||
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
|
||||
" self.INITIAL_FEATURES[k,:] = state\n",
|
||||
" for t in range(0, len(self.trend) - 1, self.skip):\n",
|
||||
" if (self.T_COPY + 1) % self.COPY == 0:\n",
|
||||
" self._assign('real_model', 'negative_model')\n",
|
||||
" \n",
|
||||
" if np.random.rand() < self.EPSILON:\n",
|
||||
" action = np.random.randint(self.OUTPUT_SIZE)\n",
|
||||
" else:\n",
|
||||
" action, last_state = self.sess.run([self.model.logits,\n",
|
||||
" self.model.last_state],\n",
|
||||
" feed_dict={self.model.X:[self.INITIAL_FEATURES],\n",
|
||||
" self.model.hidden_layer:init_value})\n",
|
||||
" action, init_value = np.argmax(action[0]), last_state\n",
|
||||
" \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) > 0:\n",
|
||||
" bought_price = inventory.pop(0)\n",
|
||||
" total_profit += self.trend[t] - bought_price\n",
|
||||
" starting_money += self.trend[t]\n",
|
||||
" \n",
|
||||
" invest = ((starting_money - initial_money) / initial_money)\n",
|
||||
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
|
||||
" \n",
|
||||
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
|
||||
" starting_money < initial_money, init_value[0])\n",
|
||||
" self.INITIAL_FEATURES = new_state\n",
|
||||
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
|
||||
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
||||
" X, Y, INIT_VAL = self._construct_memories(replay)\n",
|
||||
" \n",
|
||||
" cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n",
|
||||
" feed_dict={self.model.X: X, self.model.Y:Y,\n",
|
||||
" self.model.hidden_layer: INIT_VAL})\n",
|
||||
" self.T_COPY += 1\n",
|
||||
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
|
||||
" if (i+1) % checkpoint == 0:\n",
|
||||
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
|
||||
" starting_money))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7fb85fd10940>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7fb85f9de7b8>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
|
||||
"epoch: 10, total rewards: 1305.274912.3, cost: 0.402263, total money: 777.284860\n",
|
||||
"epoch: 20, total rewards: 582.070375.3, cost: 0.782595, total money: 804.650331\n",
|
||||
"epoch: 30, total rewards: 420.380369.3, cost: 1.481925, total money: 80.210326\n",
|
||||
"epoch: 40, total rewards: 1502.554748.3, cost: 0.343374, total money: 2823.564757\n",
|
||||
"epoch: 50, total rewards: 589.170222.3, cost: 0.370314, total money: 6597.640193\n",
|
||||
"epoch: 60, total rewards: 1069.864985.3, cost: 0.733583, total money: 10052.755000\n",
|
||||
"epoch: 70, total rewards: 900.360168.3, cost: 0.154633, total money: 8866.610168\n",
|
||||
"epoch: 80, total rewards: 625.559509.3, cost: 0.573019, total money: 9652.999511\n",
|
||||
"epoch: 90, total rewards: 966.905028.3, cost: 0.080430, total money: 6971.785033\n",
|
||||
"epoch: 100, total rewards: 784.169802.3, cost: 0.568819, total money: 10784.169802\n",
|
||||
"epoch: 110, total rewards: 658.149963.3, cost: 0.052230, total money: 9641.509948\n",
|
||||
"epoch: 120, total rewards: 615.210201.3, cost: 0.802322, total money: 9595.940181\n",
|
||||
"epoch: 130, total rewards: 623.289978.3, cost: 0.278659, total money: 10623.289978\n",
|
||||
"epoch: 140, total rewards: 595.960078.3, cost: 0.094435, total money: 10595.960078\n",
|
||||
"epoch: 150, total rewards: 594.979550.3, cost: 0.360762, total money: 1819.289547\n",
|
||||
"epoch: 160, total rewards: 794.614687.3, cost: 1.058314, total money: 3118.034730\n",
|
||||
"epoch: 170, total rewards: 1225.854981.3, cost: 0.226553, total money: 5322.584961\n",
|
||||
"epoch: 180, total rewards: 1099.610169.3, cost: 0.275357, total money: 6189.200135\n",
|
||||
"epoch: 190, total rewards: 857.554813.3, cost: 0.417154, total money: 7946.004825\n",
|
||||
"epoch: 200, total rewards: 1049.100096.3, cost: 0.839669, total money: 3317.970090\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = df.Close.values.tolist()\n",
|
||||
"initial_money = 10000\n",
|
||||
"window_size = 30\n",
|
||||
"skip = 1\n",
|
||||
"batch_size = 32\n",
|
||||
"agent = Agent(state_size = window_size, \n",
|
||||
" window_size = window_size, \n",
|
||||
" trend = close, \n",
|
||||
" skip = skip)\n",
|
||||
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
||||
"day 1, sell 1 unit at price 762.130005, investment -0.854691 %, total balance 9993.429993,\n",
|
||||
"day 3: buy 1 unit at price 782.520020, total balance 9210.909973\n",
|
||||
"day 4, sell 1 unit at price 790.510010, investment 1.021059 %, total balance 10001.419983,\n",
|
||||
"day 5: buy 1 unit at price 785.309998, total balance 9216.109985\n",
|
||||
"day 6, sell 1 unit at price 762.559998, investment -2.896945 %, total balance 9978.669983,\n",
|
||||
"day 7: buy 1 unit at price 754.020020, total balance 9224.649963\n",
|
||||
"day 8, sell 1 unit at price 736.080017, investment -2.379248 %, total balance 9960.729980,\n",
|
||||
"day 13: buy 1 unit at price 769.200012, total balance 9191.529968\n",
|
||||
"day 16, sell 1 unit at price 761.679993, investment -0.977642 %, total balance 9953.209961,\n",
|
||||
"day 19: buy 1 unit at price 758.039978, total balance 9195.169983\n",
|
||||
"day 20, sell 1 unit at price 747.919983, investment -1.335021 %, total balance 9943.089966,\n",
|
||||
"day 24: buy 1 unit at price 771.190002, total balance 9171.899964\n",
|
||||
"day 28: buy 1 unit at price 796.099976, total balance 8375.799988\n",
|
||||
"day 29: buy 1 unit at price 797.070007, total balance 7578.729981\n",
|
||||
"day 31: buy 1 unit at price 790.799988, total balance 6787.929993\n",
|
||||
"day 32, sell 1 unit at price 794.200012, investment 2.983702 %, total balance 7582.130005,\n",
|
||||
"day 33, sell 1 unit at price 796.419983, investment 0.040197 %, total balance 8378.549988,\n",
|
||||
"day 35, sell 1 unit at price 791.260010, investment -0.728919 %, total balance 9169.809998,\n",
|
||||
"day 36, sell 1 unit at price 789.909973, investment -0.112546 %, total balance 9959.719971,\n",
|
||||
"day 38: buy 1 unit at price 785.049988, total balance 9174.669983\n",
|
||||
"day 41: buy 1 unit at price 786.140015, total balance 8388.529968\n",
|
||||
"day 42, sell 1 unit at price 786.900024, investment 0.235658 %, total balance 9175.429992,\n",
|
||||
"day 43, sell 1 unit at price 794.020020, investment 1.002367 %, total balance 9969.450012,\n",
|
||||
"day 44: buy 1 unit at price 806.150024, total balance 9163.299988\n",
|
||||
"day 46, sell 1 unit at price 804.789978, investment -0.168709 %, total balance 9968.089966,\n",
|
||||
"day 47: buy 1 unit at price 807.909973, total balance 9160.179993\n",
|
||||
"day 49, sell 1 unit at price 807.880005, investment -0.003709 %, total balance 9968.059998,\n",
|
||||
"day 51: buy 1 unit at price 806.070007, total balance 9161.989991\n",
|
||||
"day 52: buy 1 unit at price 802.174988, total balance 8359.815003\n",
|
||||
"day 54: buy 1 unit at price 819.309998, total balance 7540.505005\n",
|
||||
"day 55, sell 1 unit at price 823.869995, investment 2.208243 %, total balance 8364.375000,\n",
|
||||
"day 56: buy 1 unit at price 835.669983, total balance 7528.705017\n",
|
||||
"day 57: buy 1 unit at price 832.150024, total balance 6696.554993\n",
|
||||
"day 58, sell 1 unit at price 823.309998, investment 2.634713 %, total balance 7519.864991,\n",
|
||||
"day 59, sell 1 unit at price 802.320007, investment -2.073695 %, total balance 8322.184998,\n",
|
||||
"day 61, sell 1 unit at price 795.695007, investment -4.783584 %, total balance 9117.880005,\n",
|
||||
"day 62, sell 1 unit at price 798.530029, investment -4.040136 %, total balance 9916.410034,\n",
|
||||
"day 68: buy 1 unit at price 813.669983, total balance 9102.740051\n",
|
||||
"day 69, sell 1 unit at price 819.239990, investment 0.684554 %, total balance 9921.980041,\n",
|
||||
"day 76: buy 1 unit at price 831.330017, total balance 9090.650024\n",
|
||||
"day 77: buy 1 unit at price 828.640015, total balance 8262.010009\n",
|
||||
"day 79, sell 1 unit at price 823.210022, investment -0.976747 %, total balance 9085.220031,\n",
|
||||
"day 81, sell 1 unit at price 830.630005, investment 0.240151 %, total balance 9915.850036,\n",
|
||||
"day 86: buy 1 unit at price 838.679993, total balance 9077.170043\n",
|
||||
"day 88: buy 1 unit at price 845.539978, total balance 8231.630065\n",
|
||||
"day 89, sell 1 unit at price 845.619995, investment 0.827491 %, total balance 9077.250060,\n",
|
||||
"day 91, sell 1 unit at price 848.780029, investment 0.383193 %, total balance 9926.030089,\n",
|
||||
"day 95: buy 1 unit at price 829.590027, total balance 9096.440062\n",
|
||||
"day 96, sell 1 unit at price 817.580017, investment -1.447704 %, total balance 9914.020079,\n",
|
||||
"day 97: buy 1 unit at price 814.429993, total balance 9099.590086\n",
|
||||
"day 101: buy 1 unit at price 831.500000, total balance 8268.090086\n",
|
||||
"day 102: buy 1 unit at price 829.559998, total balance 7438.530088\n",
|
||||
"day 104, sell 1 unit at price 834.570007, investment 2.472897 %, total balance 8273.100095,\n",
|
||||
"day 105, sell 1 unit at price 831.409973, investment -0.010827 %, total balance 9104.510068,\n",
|
||||
"day 106, sell 1 unit at price 827.880005, investment -0.202516 %, total balance 9932.390073,\n",
|
||||
"day 108: buy 1 unit at price 824.729980, total balance 9107.660093\n",
|
||||
"day 109, sell 1 unit at price 823.349976, investment -0.167328 %, total balance 9931.010069,\n",
|
||||
"day 114: buy 1 unit at price 838.210022, total balance 9092.800047\n",
|
||||
"day 117, sell 1 unit at price 862.760010, investment 2.928859 %, total balance 9955.560057,\n",
|
||||
"day 121: buy 1 unit at price 905.960022, total balance 9049.600035\n",
|
||||
"day 122: buy 1 unit at price 912.570007, total balance 8137.030028\n",
|
||||
"day 124: buy 1 unit at price 927.039978, total balance 7209.990050\n",
|
||||
"day 125: buy 1 unit at price 931.659973, total balance 6278.330077\n",
|
||||
"day 130, sell 1 unit at price 930.599976, investment 2.719762 %, total balance 7208.930053,\n",
|
||||
"day 131, sell 1 unit at price 932.219971, investment 2.153256 %, total balance 8141.150024,\n",
|
||||
"day 132, sell 1 unit at price 937.080017, investment 1.083021 %, total balance 9078.230041,\n",
|
||||
"day 133, sell 1 unit at price 943.000000, investment 1.217185 %, total balance 10021.230041,\n",
|
||||
"day 137: buy 1 unit at price 941.859985, total balance 9079.370056\n",
|
||||
"day 138, sell 1 unit at price 948.820007, investment 0.738966 %, total balance 10028.190063,\n",
|
||||
"day 142: buy 1 unit at price 975.880005, total balance 9052.310058\n",
|
||||
"day 143: buy 1 unit at price 964.859985, total balance 8087.450073\n",
|
||||
"day 144: buy 1 unit at price 966.950012, total balance 7120.500061\n",
|
||||
"day 145, sell 1 unit at price 975.599976, investment -0.028695 %, total balance 8096.100037,\n",
|
||||
"day 146, sell 1 unit at price 983.679993, investment 1.950543 %, total balance 9079.780030,\n",
|
||||
"day 147: buy 1 unit at price 976.570007, total balance 8103.210023\n",
|
||||
"day 148: buy 1 unit at price 980.940002, total balance 7122.270021\n",
|
||||
"day 150, sell 1 unit at price 949.830017, investment -1.770515 %, total balance 8072.100038,\n",
|
||||
"day 151: buy 1 unit at price 942.900024, total balance 7129.200014\n",
|
||||
"day 152, sell 1 unit at price 953.400024, investment -2.372588 %, total balance 8082.600038,\n",
|
||||
"day 153: buy 1 unit at price 950.760010, total balance 7131.840028\n",
|
||||
"day 154, sell 1 unit at price 942.309998, investment -3.938060 %, total balance 8074.150026,\n",
|
||||
"day 155, sell 1 unit at price 939.780029, investment -0.330894 %, total balance 9013.930055,\n",
|
||||
"day 156, sell 1 unit at price 957.369995, investment 0.695232 %, total balance 9971.300050,\n",
|
||||
"day 159: buy 1 unit at price 957.090027, total balance 9014.210023\n",
|
||||
"day 160: buy 1 unit at price 965.590027, total balance 8048.619996\n",
|
||||
"day 161, sell 1 unit at price 952.270020, investment -0.503611 %, total balance 9000.890016,\n",
|
||||
"day 162: buy 1 unit at price 927.330017, total balance 8073.559999\n",
|
||||
"day 163: buy 1 unit at price 940.489990, total balance 7133.070009\n",
|
||||
"day 165: buy 1 unit at price 908.729980, total balance 6224.340029\n",
|
||||
"day 167: buy 1 unit at price 911.710022, total balance 5312.630007\n",
|
||||
"day 169, sell 1 unit at price 918.590027, investment -4.867490 %, total balance 6231.220034,\n",
|
||||
"day 170, sell 1 unit at price 928.799988, investment 0.158516 %, total balance 7160.020022,\n",
|
||||
"day 173, sell 1 unit at price 947.159973, investment 0.709203 %, total balance 8107.179995,\n",
|
||||
"day 174: buy 1 unit at price 955.989990, total balance 7151.190005\n",
|
||||
"day 175: buy 1 unit at price 953.419983, total balance 6197.770022\n",
|
||||
"day 176: buy 1 unit at price 965.400024, total balance 5232.369998\n",
|
||||
"day 177, sell 1 unit at price 970.890015, investment 6.840320 %, total balance 6203.260013,\n",
|
||||
"day 178: buy 1 unit at price 968.150024, total balance 5235.109989\n",
|
||||
"day 179: buy 1 unit at price 972.919983, total balance 4262.190006\n",
|
||||
"day 180: buy 1 unit at price 980.340027, total balance 3281.849979\n",
|
||||
"day 181, sell 1 unit at price 950.700012, investment 4.276578 %, total balance 4232.549991,\n",
|
||||
"day 182, sell 1 unit at price 947.799988, investment -0.856704 %, total balance 5180.349979,\n",
|
||||
"day 184, sell 1 unit at price 941.530029, investment -1.247085 %, total balance 6121.880008,\n",
|
||||
"day 185, sell 1 unit at price 930.500000, investment -3.615084 %, total balance 7052.380008,\n",
|
||||
"day 186: buy 1 unit at price 930.830017, total balance 6121.549991\n",
|
||||
"day 190: buy 1 unit at price 929.359985, total balance 5192.190006\n",
|
||||
"day 191, sell 1 unit at price 926.789978, investment -4.272070 %, total balance 6118.979984,\n",
|
||||
"day 192, sell 1 unit at price 922.900024, investment -5.141220 %, total balance 7041.880008,\n",
|
||||
"day 193, sell 1 unit at price 907.239990, investment -7.456600 %, total balance 7949.119998,\n",
|
||||
"day 196: buy 1 unit at price 922.219971, total balance 7026.900027\n",
|
||||
"day 198: buy 1 unit at price 910.979980, total balance 6115.920047\n",
|
||||
"day 199, sell 1 unit at price 910.669983, investment -2.165813 %, total balance 7026.590030,\n",
|
||||
"day 200, sell 1 unit at price 906.659973, investment -2.442542 %, total balance 7933.250003,\n",
|
||||
"day 201, sell 1 unit at price 924.690002, investment 0.267835 %, total balance 8857.940005,\n",
|
||||
"day 204, sell 1 unit at price 915.890015, investment 0.538984 %, total balance 9773.830020,\n",
|
||||
"day 205: buy 1 unit at price 913.809998, total balance 8860.020022\n",
|
||||
"day 206, sell 1 unit at price 921.289978, investment 0.818549 %, total balance 9781.310000,\n",
|
||||
"day 209: buy 1 unit at price 937.340027, total balance 8843.969973\n",
|
||||
"day 210: buy 1 unit at price 928.450012, total balance 7915.519961\n",
|
||||
"day 211, sell 1 unit at price 927.809998, investment -1.016710 %, total balance 8843.329959,\n",
|
||||
"day 212: buy 1 unit at price 935.950012, total balance 7907.379947\n",
|
||||
"day 214, sell 1 unit at price 929.080017, investment 0.067856 %, total balance 8836.459964,\n",
|
||||
"day 216, sell 1 unit at price 935.090027, investment -0.091884 %, total balance 9771.549991,\n",
|
||||
"day 217: buy 1 unit at price 925.109985, total balance 8846.440006\n",
|
||||
"day 219, sell 1 unit at price 915.000000, investment -1.092841 %, total balance 9761.440006,\n",
|
||||
"day 220: buy 1 unit at price 921.809998, total balance 8839.630008\n",
|
||||
"day 221: buy 1 unit at price 931.580017, total balance 7908.049991\n",
|
||||
"day 222: buy 1 unit at price 932.450012, total balance 6975.599979\n",
|
||||
"day 226, sell 1 unit at price 944.489990, investment 2.460376 %, total balance 7920.089969,\n",
|
||||
"day 227: buy 1 unit at price 949.500000, total balance 6970.589969\n",
|
||||
"day 229, sell 1 unit at price 953.270020, investment 2.328303 %, total balance 7923.859989,\n",
|
||||
"day 230: buy 1 unit at price 957.789978, total balance 6966.070011\n",
|
||||
"day 231: buy 1 unit at price 951.679993, total balance 6014.390018\n",
|
||||
"day 232: buy 1 unit at price 969.960022, total balance 5044.429996\n",
|
||||
"day 233, sell 1 unit at price 978.890015, investment 4.980428 %, total balance 6023.320011,\n",
|
||||
"day 234: buy 1 unit at price 977.000000, total balance 5046.320011\n",
|
||||
"day 237, sell 1 unit at price 987.830017, investment 4.036863 %, total balance 6034.150028,\n",
|
||||
"day 239, sell 1 unit at price 992.000000, investment 3.571767 %, total balance 7026.150028,\n",
|
||||
"day 240, sell 1 unit at price 992.179993, investment 4.255632 %, total balance 8018.330021,\n",
|
||||
"day 243, sell 1 unit at price 988.200012, investment 1.880489 %, total balance 9006.530033,\n",
|
||||
"day 244, sell 1 unit at price 968.450012, investment -0.875127 %, total balance 9974.980045,\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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
|
||||
}
|
||||
+940
@@ -0,0 +1,940 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import seaborn as sns\n",
|
||||
"sns.set()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.figure(figsize = (10, 5))\n",
|
||||
"bins = np.linspace(-10, 10, 100)\n",
|
||||
"\n",
|
||||
"solution = np.random.randn(100)\n",
|
||||
"w = np.random.randn(100)\n",
|
||||
"\n",
|
||||
"plt.hist(solution, bins, alpha = 0.5, label = 'solution', color = 'r')\n",
|
||||
"plt.hist(w, bins, alpha = 0.5, label = 'random', color = 'y')\n",
|
||||
"plt.legend()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"iter 1000. w: 0.0952791586701015, solution: 0.5720518054873052, reward: -20.148099\n",
|
||||
"iter 2000. w: 0.5750455468679501, solution: 0.5720518054873052, reward: -0.008058\n",
|
||||
"iter 3000. w: 0.5751585748688035, solution: 0.5720518054873052, reward: -0.008793\n",
|
||||
"iter 4000. w: 0.5665604300033952, solution: 0.5720518054873052, reward: -0.007711\n",
|
||||
"iter 5000. w: 0.5619489293298067, solution: 0.5720518054873052, reward: -0.005604\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def f(w):\n",
|
||||
" return -np.sum(np.square(solution - w))\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"npop = 50\n",
|
||||
"sigma = 0.1\n",
|
||||
"alpha = 0.001\n",
|
||||
"\n",
|
||||
"for i in range(5000):\n",
|
||||
"\n",
|
||||
" if (i + 1) % 1000 == 0:\n",
|
||||
" print(\n",
|
||||
" 'iter %d. w: %s, solution: %s, reward: %f'\n",
|
||||
" % (i + 1, str(w[-1]), str(solution[-1]), f(w))\n",
|
||||
" )\n",
|
||||
" N = np.random.randn(npop, 100)\n",
|
||||
" R = np.zeros(npop)\n",
|
||||
" for j in range(npop):\n",
|
||||
" w_try = w + sigma * N[j]\n",
|
||||
" R[j] = f(w_try)\n",
|
||||
"\n",
|
||||
" A = (R - np.mean(R)) / np.std(R)\n",
|
||||
" w = w + alpha / (npop * sigma) * np.dot(N.T, A)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAE3CAYAAAB2LD/OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzt3XmcXFWd9/FPLd2dpBNClnYSHTDgcjAsyr4YwTExAwjqjCgPOiKyKQIjImpmlBlGH9TRGZlHUZZIREVBBxBBIoJBEFRUICAKnFEhwEiUGANJOumtqp4/qhJSvaQr1afX+rxfL150/+65955f3erOt++9VZUplUpIkiQpnexoT0CSJGmiMWBJkiQlZsCSJElKzIAlSZKUmAFLkiQpMQOWJElSYgYsSZKkxAxYkiRJiRmwJEmSEjNgSZIkJWbAkiRJSiw/CvtsAQ4EVgOFUdi/JElSrXLAXOCXQGetK41GwDoQuGsU9itJklSv1wB31zp4NALWaoB169opFkvDtpNZs6aydu3GYdv+WNfI/Tdy79DY/dt7Y/YOjd1/I/cOw99/NpthxoxWqOSXWo1GwCoAFIulYQ1YW/bRyBq5/0buHRq7f3tvXI3cfyP3DiPW/w7d1uRN7pIkSYkZsCRJkhIbjUuEkiRpOwqFHtatW0NPT9egY595JkuxWByBWY1NqfrP55uZMaONXC5NNDJgSZI0xqxbt4ZJk6bQ2jqHTCaz3bH5fJaensYNWCn6L5VKtLevZ926NcyePTfJvLxEKEnSGNPT00Vr606DhiulkclkaG3dqaYzhrUyYEmSNAYZrkZW6sfbgCVJkpSY92BJkjTGNRc6KXX2/ykt2WyGTJ3vA5VpaaEr1zKUqWkABixJksa4Umcnq29b0e+ybDZT9xttzn39QphiwBoOXiKU1NCaC500bVpf9V9zoebPc5UmvBNPPJ5Vqx4H4N/+7WP8x398CoBf//ohzjvvH0dzamOaZ7AkNbT+zgz4V730vEMPXcB99/2CefN24/e//+3W+s9//lMOO+w1ozizsc0zWJIkaUCHHbaAe+/9JY8//hi77bY72WyOdev+wj33/MSAtR2ewZIkSQPaa699+N3v/pV77/0F++67PzNmzOJHP1pBd3cPc+bMGe3pjVmewZIkSQPK5XLMn78n1157DfvuewD7738AX/vaMg499NWjPbUxzTNYkiSNcZmWlvK9gf0YyqsIMy213Wt46KELeOCB+3nxi+cxc+Ys1q37C4cdtqCufTYKA5YkSWNcV65lwBdejMRnER555Bs48sg3ADBt2jTuvPPnw7q/icBLhJIkSYkZsCRJkhIzYEmSJCVmwJIkSUrMgCVJkpSYAUuSJCkx36ZBkqQxrgB0dvf/VgzZniJ1vg0WLU1ZcvVPS9thwJIkaYzr7C5y6z2r+l02lDcaXXzIPKY0bf9i1qOPPswNN1zHkiXn17zdBQsO4O677+WGG64F4M1vPq7fcQMtX778JlauvI+PfvSCmve5xYUXXsC+++7P0Ucf22dZT08PH/zg2bzrXaew334H7PC2d4QBS5IkDWiPPeazZMn8utYdKFjVujylJ59cxac+9XFijCOyPwOWJEka0P3338uyZZdz8cWXc9ZZpzN//p48+OADPPvsOs4550MceuirWb36aT7+8fPZvHkze+6519Z1r7jiMgB22mk6Tz31BOee+xEALr74v5g9ezbt7e0AnHLKe7jllpv56levoLV1KnPmzGHy5CkAHHfcsXzhC5cxd+4Lq+aycuV9XH75l+js7GTDhvWcccY/8rrXLRqwj+9977uccMKJfPvb3xyuh6pKTTe5hxB2CiH8OoQwr/L96ZXvHwohfCWE0Dyss5QkSWNCd3cPl132Fc4++1yWLr0EgIsu+gxHH30sV175Tfbe+5V91lm0aDF33XUnhUKBUqnEHXesYNGiI7cu//Of13DJJZ/ni19cyqWXLmPTpk2DzuO6677FkiXn87WvfZMlS87nyiuXbnf8+973fg4//LU71uwQDBqwQggHA3cDL698/3LgQ8BhwD6VbZw5jHOUJEljxMEHHwrA7ru/hA0b1gOwcuV9LFz4egAWLz6KfL76AtmMGTN52ctezv3338uDD65kl112Zfbs2VuXP/TQg+y11z7MnDmLfD7P4sVHDTqP88//BI899juWLVvKNddcxebNm1O1mEQtZ7BOoxygnq583wmcEWNcH2MsAQ8Buw7T/CRJ0hjS3Fy+aJXJZCiVttxc//yN9plMhmy2b7xYvPgobr/9NlasuK1PgMpkqm/Uz+VyVcu27KdQ6NlaP/PM03jkkd+wxx6v4MQTT95mLmPDoPdgxRhPBQghbPn+CeCJSq0NOAs4aUd3PGvW1B1dZYe1tU0b9n2MZY3cfyP3Do3d/472vu6ZHlpetX9VrTR5yrh8DMfjnFOaSP0/80yWfP75kJLtKZLNZgYcv71l25PNULWf/uRyWTKZDPl8+f+5XHluuVx5vXw+y0EHHcwPf/h9jjvueG6/fQVdXV3k89mt88rns7z2tX/DsmWXUywWOPvs91ct33ff/bjoos/yl7/8mdmzZ/OjH/2QqVOnkc9n2XnnnXnyycfZdddd+MlPfkwmk6G9fQNPPfUkl112BS0tLSxdeinFYnHrHLPZzIB9bdtD38cxm+x5VPdN7iGEFwHfB66IMd6xo+uvXbux7peV1qKtbRpr1mwYtu2PdY3cfyP3Do3dfz29d3T0cNNtv66q/f07XkDPOHsMG/m4w8Trv1gs0tPz/PteNeWzLDroxf2OzWao+32wmvLZqv30p1AoUiqV6Okp/79QKM+tUCiv19NT5JxzPsQnPvEvfOc717HHHvOZMqWVnp7i1n/ne3qK5PPN7LXXPnR1ddHcPKlq+fTpMzjnnPM4++z3MmnSZObN223rPk8++XQ+97nP8uUvX85BBx1CqVSitXUaxxzzJk444TimTp3K/Pl709HRwYYN7ZRKJYrF0oB9bdtDb8Visc/zKJvN1HVSKFPrKbUQwirgtTHGVSGEPYBbgC/EGP9zB/c5D3jcgDW8Grn/Ru4dGrv/ugLW5g6u/8btVbW/f8frmDR5UsqpDbtGPu4w8fr/4x+fYM6c/gNVb/kaQtJElrL//h73bQLWbsCqmue1ozsPIUwDbgX+OcZ41Y6uL0mSNNHVc4nwVOCvgPNCCOdVajfGGP8l3bQkSZLGr5oDVoxxXuXLiyr/SZIkqR81vdGoJEmSamfAkiRJSsyAJUmSlJgBS5KkMW5SppNJhfX9/tfc/dyAywb9L9M56L4fffRhPv3pT+zQfBcsOACAG264lhtuuHbAcQMtX778Ji688IId2ucWF154AcuX39Sn/t3vXs873/k2TjzxeD75yX+ju7u7ru3Xqu43GpUkSSOkp5PnVq7od1E2m6n7fSWn77sQci3bHbPHHvNZsmR+Xdt/85uPG9LyVJ588gmuvvrrXHHF15kypZULL7yA66//Nscf/45h26cBS5IkDej+++9l2bLLufjiyznrrNOZP39PHnzwAZ59dh3nnPMhDj301axe/TQf//j5bN68mT333GvruldccRkAO+00naeeeoJzz/0IABdf/F/Mnj2b9vZ2AE455T3ccsvNfPWrV9DaOpU5c+YwefIUAI477li+8IXLmDv3hVVzWbnyPi6//Et0dnayYcN6zjjjH3nd6xb120NzczMf/OASWlvL78i+++4v5U9/+uOwPWbgJUJJkrQDurt7uOyyr3D22eeydOklAFx00Wc4+uhjufLKb7L33q/ss86iRYu56647KRQKlEol7rhjBYsWHbl1+Z//vIZLLvk8X/ziUi69dBmbNm0adB7XXfctliw5n6997ZssWXI+V165dMCxc+bM5cADDwZg3bp1XH/9t1mw4IgdbX2HGLAkSVLNDj74UAB23/0lbNiwHoCVK+9j4cLXA7B48VHk89UXyGbMmMnLXvZy7r//Xh58cCW77LIrs2fP3rr8oYceZK+99mHmzFnk83kWLz5q0Hmcf/4neOyx37Fs2VKuueYqNm/ePOg6a9Y8wznnnMExx7yJ/fY7oOae62HAkiRJNWtubgYgk8nw/OcZP38fWCaTIZvtGy8WLz6K22+/jRUrbusToDKZ6vvIcrlc1bIt+ykUerbWzzzzNB555DfssccrOPHEkxnss5WfeGIVZ5xxCkceeQwnnXRq7Q3XyYAlSZKG5IADDuIHP1gOwJ133k5XV1efMa95zRE88MD9/OIXP+OII15XtWyffV7Fww8/xJo1z1AsFrn99tu2Lps+fWcef/wxAO66604A1q9/jqeeeoJTTnkvhx22gF/84h6KxYE/8HnTpnY+8IEzOe20MzjhhH8Ycr+18CZ3SZLGunxL+RV//RjKqwjJt0Cdq27r3HM/zCc+8S/ceOP17LHHfKZMae0zpqVlEnvv/Uq6urqYMmVK1bKZM2dxzjkf4pxz3sekSZOZN2+3rctOOeV0Lrros3zlK0s56KBDgPJN88cc82be+c63MXXqVObP35uOjo4BLxPedNMNrFv3F66++iquvvoqABYsOJxTT33v0JsfQGawU2rDYB7w+Nq1G+t/QtSgrW0aa9ZsGLbtj3WN3H8j9w6N3X89vXds7uD6b9xeVfv7d7yOSZMnpZzasGvk4w4Tr/8//vEJ5sx5cU1j8/ksPT0Dn72Z6FL239/jns1mmDVrKsBuwKpat+UlQkmSpMQMWJIkSYl5D5akETUp0wk9vT6eI99CR2n77yYtSeOJAUvSyOrnIz9q+bgOqdGUSiUymcxoT6NhpL4n3UuEkiSNMfl8M+3t65P/o6/+lUol2tvXk883J9umZ7AkSRpjZsxoY926NWzc+OygY7PZ7HbfA2qiS9V/Pt/MjBltCWZU2V6yLUmSpCRyuTyzZ8+taexEe4uKHTVW+/cSoSRJUmIGLEmSpMQMWJILine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x360 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"'''\n",
|
||||
"I want to compare my first two individuals with my real w\n",
|
||||
"'''\n",
|
||||
"plt.figure(figsize=(10,5))\n",
|
||||
"\n",
|
||||
"sigma = 0.1\n",
|
||||
"N = np.random.randn(npop, 100)\n",
|
||||
"individuals = []\n",
|
||||
"for j in range(2):\n",
|
||||
" individuals.append(w + sigma * N[j])\n",
|
||||
" \n",
|
||||
" \n",
|
||||
"plt.hist(w, bins, alpha=0.5, label='w',color='r')\n",
|
||||
"plt.hist(individuals[0], bins, alpha=0.5, label='individual 1')\n",
|
||||
"plt.hist(individuals[1], bins, alpha=0.5, label='individual 2')\n",
|
||||
"plt.legend()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"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>2017-10-16</td>\n",
|
||||
" <td>992.099976</td>\n",
|
||||
" <td>993.906982</td>\n",
|
||||
" <td>984.000000</td>\n",
|
||||
" <td>992.000000</td>\n",
|
||||
" <td>992.000000</td>\n",
|
||||
" <td>910500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>2017-10-17</td>\n",
|
||||
" <td>990.289978</td>\n",
|
||||
" <td>996.440002</td>\n",
|
||||
" <td>988.590027</td>\n",
|
||||
" <td>992.179993</td>\n",
|
||||
" <td>992.179993</td>\n",
|
||||
" <td>1290200</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>2017-10-18</td>\n",
|
||||
" <td>991.770020</td>\n",
|
||||
" <td>996.719971</td>\n",
|
||||
" <td>986.974976</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>992.809998</td>\n",
|
||||
" <td>1057600</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>2017-10-19</td>\n",
|
||||
" <td>986.000000</td>\n",
|
||||
" <td>988.880005</td>\n",
|
||||
" <td>978.390015</td>\n",
|
||||
" <td>984.450012</td>\n",
|
||||
" <td>984.450012</td>\n",
|
||||
" <td>1313600</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>2017-10-20</td>\n",
|
||||
" <td>989.440002</td>\n",
|
||||
" <td>991.000000</td>\n",
|
||||
" <td>984.580017</td>\n",
|
||||
" <td>988.200012</td>\n",
|
||||
" <td>988.200012</td>\n",
|
||||
" <td>1183200</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Date Open High Low Close Adj Close \\\n",
|
||||
"0 2017-10-16 992.099976 993.906982 984.000000 992.000000 992.000000 \n",
|
||||
"1 2017-10-17 990.289978 996.440002 988.590027 992.179993 992.179993 \n",
|
||||
"2 2017-10-18 991.770020 996.719971 986.974976 992.809998 992.809998 \n",
|
||||
"3 2017-10-19 986.000000 988.880005 978.390015 984.450012 984.450012 \n",
|
||||
"4 2017-10-20 989.440002 991.000000 984.580017 988.200012 988.200012 \n",
|
||||
"\n",
|
||||
" Volume \n",
|
||||
"0 910500 \n",
|
||||
"1 1290200 \n",
|
||||
"2 1057600 \n",
|
||||
"3 1313600 \n",
|
||||
"4 1183200 "
|
||||
]
|
||||
},
|
||||
"execution_count": 29,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"google = pd.read_csv('/Users/huseinzolkepli/Desktop/GOOG.csv')\n",
|
||||
"google.head()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 58,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"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[: 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": "code",
|
||||
"execution_count": 60,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0., 0., 0., 0., 0., 0., 0., 0., 0.]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 60,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"close = google.Close.values.tolist()\n",
|
||||
"get_state(close, 0, 10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 61,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0. , 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0. , 0.179993]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 61,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"get_state(close, 1, 10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 62,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[0. , 0. , 0. , 0. , 0. , 0. ,\n",
|
||||
" 0. , 0.179993, 0.630005]])"
|
||||
]
|
||||
},
|
||||
"execution_count": 62,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"get_state(close, 2, 10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 63,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class Deep_Evolution_Strategy:\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')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 64,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"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": 65,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"window_size = 30\n",
|
||||
"model = Model(window_size, 500, 3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 67,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"-89.2658852200001"
|
||||
]
|
||||
},
|
||||
"execution_count": 67,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"initial_money = 10000\n",
|
||||
"starting_money = initial_money\n",
|
||||
"len_close = len(close) - 1\n",
|
||||
"weight = model\n",
|
||||
"skip = 1\n",
|
||||
"\n",
|
||||
"state = get_state(close, 0, window_size + 1)\n",
|
||||
"inventory = []\n",
|
||||
"quantity = 0\n",
|
||||
"\n",
|
||||
"max_buy = 5\n",
|
||||
"max_sell = 5\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def act(model, sequence):\n",
|
||||
" decision, buy = model.predict(np.array(sequence))\n",
|
||||
" return np.argmax(decision[0]), int(buy[0])\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"for t in range(0, len_close, skip):\n",
|
||||
" action, buy = act(weight, 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 > max_buy:\n",
|
||||
" buy_units = 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 > max_sell:\n",
|
||||
" sell_units = 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",
|
||||
"((initial_money - starting_money) / starting_money) * 100"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 77,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import time\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"class Agent:\n",
|
||||
"\n",
|
||||
" POPULATION_SIZE = 15\n",
|
||||
" SIGMA = 0.1\n",
|
||||
" LEARNING_RATE = 0.03\n",
|
||||
"\n",
|
||||
" def __init__(\n",
|
||||
" self, model, money, max_buy, max_sell, close, window_size, skip\n",
|
||||
" ):\n",
|
||||
" self.window_size = window_size\n",
|
||||
" self.skip = skip\n",
|
||||
" self.close = close\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",
|
||||
" len_close = len(self.close) - 1\n",
|
||||
"\n",
|
||||
" self.model.weights = weights\n",
|
||||
" state = get_state(self.close, 0, self.window_size + 1)\n",
|
||||
" inventory = []\n",
|
||||
" quantity = 0\n",
|
||||
" for t in range(0, len_close, self.skip):\n",
|
||||
" action, buy = self.act(state)\n",
|
||||
" next_state = get_state(self.close, t + 1, self.window_size + 1)\n",
|
||||
" if action == 1 and initial_money >= self.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 * self.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 * self.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",
|
||||
" len_close = len(self.close) - 1\n",
|
||||
" state = get_state(self.close, 0, self.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, len_close, self.skip):\n",
|
||||
" action, buy = self.act(state)\n",
|
||||
" next_state = get_state(self.close, t + 1, self.window_size + 1)\n",
|
||||
" if action == 1 and initial_money >= self.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 * self.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 * self.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": 78,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"model = Model(input_size = window_size, layer_size = 500, output_size = 3)\n",
|
||||
"agent = Agent(\n",
|
||||
" model = model,\n",
|
||||
" money = 10000,\n",
|
||||
" max_buy = 5,\n",
|
||||
" max_sell = 5,\n",
|
||||
" close = close,\n",
|
||||
" window_size = window_size,\n",
|
||||
" skip = 1,\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 79,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"iter 10. reward: 36.181611\n",
|
||||
"iter 20. reward: 50.767101\n",
|
||||
"iter 30. reward: 65.467698\n",
|
||||
"iter 40. reward: 71.316103\n",
|
||||
"iter 50. reward: 82.881994\n",
|
||||
"iter 60. reward: 84.293704\n",
|
||||
"iter 70. reward: 78.501997\n",
|
||||
"iter 80. reward: 94.488579\n",
|
||||
"iter 90. reward: 86.526799\n",
|
||||
"iter 100. reward: 85.882890\n",
|
||||
"iter 110. reward: 86.063284\n",
|
||||
"iter 120. reward: 90.334301\n",
|
||||
"iter 130. reward: 85.850098\n",
|
||||
"iter 140. reward: 91.399606\n",
|
||||
"iter 150. reward: 87.862805\n",
|
||||
"iter 160. reward: 97.226486\n",
|
||||
"iter 170. reward: 86.767297\n",
|
||||
"iter 180. reward: 97.016782\n",
|
||||
"iter 190. reward: 97.843791\n",
|
||||
"iter 200. reward: 89.146606\n",
|
||||
"iter 210. reward: 96.508885\n",
|
||||
"iter 220. reward: 97.765979\n",
|
||||
"iter 230. reward: 98.256375\n",
|
||||
"iter 240. reward: 99.942482\n",
|
||||
"iter 250. reward: 94.536183\n",
|
||||
"iter 260. reward: 96.916185\n",
|
||||
"iter 270. reward: 93.193185\n",
|
||||
"iter 280. reward: 100.844085\n",
|
||||
"iter 290. reward: 100.994682\n",
|
||||
"iter 300. reward: 101.523774\n",
|
||||
"iter 310. reward: 102.090896\n",
|
||||
"iter 320. reward: 102.176091\n",
|
||||
"iter 330. reward: 92.306981\n",
|
||||
"iter 340. reward: 105.409190\n",
|
||||
"iter 350. reward: 103.159886\n",
|
||||
"iter 360. reward: 99.091287\n",
|
||||
"iter 370. reward: 108.475085\n",
|
||||
"iter 380. reward: 102.349682\n",
|
||||
"iter 390. reward: 110.289382\n",
|
||||
"iter 400. reward: 103.371389\n",
|
||||
"iter 410. reward: 110.951287\n",
|
||||
"iter 420. reward: 111.561078\n",
|
||||
"iter 430. reward: 112.275285\n",
|
||||
"iter 440. reward: 113.112587\n",
|
||||
"iter 450. reward: 110.838887\n",
|
||||
"iter 460. reward: 111.243782\n",
|
||||
"iter 470. reward: 112.924874\n",
|
||||
"iter 480. reward: 111.705677\n",
|
||||
"iter 490. reward: 110.903074\n",
|
||||
"iter 500. reward: 112.986871\n",
|
||||
"time taken to train: 60.56475520133972 seconds\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"agent.fit(iterations = 500, checkpoint = 10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 80,
|
||||
"metadata": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"day 0: buy 1 units at price 992.000000, total balance 9008.000000\n",
|
||||
"day 1: buy 1 units at price 992.179993, total balance 8015.820007\n",
|
||||
"day 2: buy 1 units at price 992.809998, total balance 7023.010009\n",
|
||||
"day 3: buy 5 units at price 4922.250060, total balance 2100.759949\n",
|
||||
"day 4, sell 5 units at price 4941.000060, investment 398.084683 %, total balance 7041.760009,\n",
|
||||
"day 5: buy 5 units at price 4842.250060, total balance 2199.509949\n",
|
||||
"day 7: buy 5 units at price 4866.650085, total balance -2667.140136\n",
|
||||
"day 9, sell 5 units at price 5096.350100, investment 413.651770 %, total balance 2429.209964,\n",
|
||||
"day 10: buy 5 units at price 5085.549925, total balance -2656.339961\n",
|
||||
"day 12, sell 5 units at price 5127.500000, investment 416.463373 %, total balance 2471.160039,\n",
|
||||
"day 13, sell 5 units at price 5127.899780, investment 4.177962 %, total balance 7599.059819,\n",
|
||||
"day 14, sell 3 units at price 3097.439940, investment -36.033045 %, total balance 10696.499759,\n",
|
||||
"day 22: buy 1 units at price 1020.909973, total balance 9675.589786\n",
|
||||
"day 24: buy 1 units at price 1019.090027, total balance 8656.499759\n",
|
||||
"day 25: buy 5 units at price 5091.900025, total balance 3564.599734\n",
|
||||
"day 27: buy 5 units at price 5179.799805, total balance -1615.200071\n",
|
||||
"day 29, sell 5 units at price 5271.049805, investment 416.308974 %, total balance 3655.849734,\n",
|
||||
"day 30, sell 5 units at price 5237.050170, investment 413.894752 %, total balance 8892.899904,\n",
|
||||
"day 33: buy 5 units at price 5050.849915, total balance 3842.049989\n",
|
||||
"day 35: buy 5 units at price 5025.750120, total balance -1183.700131\n",
|
||||
"day 42, sell 5 units at price 5245.750120, investment 3.021467 %, total balance 4062.049989,\n",
|
||||
"day 43, sell 5 units at price 5320.949705, investment 2.725007 %, total balance 9382.999694,\n",
|
||||
"day 44, sell 2 units at price 2154.280030, investment -57.348168 %, total balance 11537.279724,\n",
|
||||
"day 45: buy 1 units at price 1070.680054, total balance 10466.599670\n",
|
||||
"day 48: buy 1 units at price 1060.119995, total balance 9406.479675\n",
|
||||
"day 51: buy 5 units at price 5240.700075, total balance 4165.779600\n",
|
||||
"day 52: buy 5 units at price 5232.000120, total balance -1066.220520\n",
|
||||
"day 56, sell 5 units at price 5511.149900, investment 9.658255 %, total balance 4444.929380,\n",
|
||||
"day 57, sell 5 units at price 5534.699705, investment 416.933110 %, total balance 9979.629085,\n",
|
||||
"day 58, sell 2 units at price 2212.520020, investment 108.704678 %, total balance 12192.149105,\n",
|
||||
"day 59: buy 5 units at price 5513.049925, total balance 6679.099180\n",
|
||||
"day 60: buy 5 units at price 5527.600100, total balance 1151.499080\n",
|
||||
"day 62: buy 5 units at price 5608.800050, total balance -4457.300970\n",
|
||||
"day 69, sell 5 units at price 5851.849975, investment 11.661608 %, total balance 1394.549005,\n",
|
||||
"day 70, sell 5 units at price 5879.199830, investment 12.370025 %, total balance 7273.748835,\n",
|
||||
"day 71, sell 5 units at price 5877.899780, investment 6.617931 %, total balance 13151.648615,\n",
|
||||
"day 72: buy 5 units at price 5818.449705, total balance 7333.198910\n",
|
||||
"day 73, sell 5 units at price 5849.699705, investment 5.827115 %, total balance 13182.898615,\n",
|
||||
"day 78: buy 5 units at price 5242.899780, total balance 7939.998835\n",
|
||||
"day 79: buy 5 units at price 5007.600100, total balance 2932.398735\n",
|
||||
"day 80: buy 5 units at price 5188.900145, total balance -2256.501410\n",
|
||||
"day 87, sell 5 units at price 5556.699830, investment -0.928901 %, total balance 3300.198420,\n",
|
||||
"day 89: buy 1 units at price 1126.790039, total balance 2173.408381\n",
|
||||
"day 90, sell 5 units at price 5718.750000, investment -1.713510 %, total balance 7892.158381,\n",
|
||||
"day 93: buy 5 units at price 5347.600100, total balance 2544.558281\n",
|
||||
"day 96: buy 5 units at price 5475.300295, total balance -2930.742014\n",
|
||||
"day 98, sell 5 units at price 5630.000000, investment 7.383323 %, total balance 2699.257986,\n",
|
||||
"day 99, sell 5 units at price 5800.200195, investment 15.827943 %, total balance 8499.458181,\n",
|
||||
"day 100, sell 5 units at price 5822.500000, investment 12.210677 %, total balance 14321.958181,\n",
|
||||
"day 101: buy 1 units at price 1138.170044, total balance 13183.788137\n",
|
||||
"day 102, sell 2 units at price 2298.979980, investment 104.029136 %, total balance 15482.768117,\n",
|
||||
"day 111: buy 5 units at price 5025.499880, total balance 10457.268237\n",
|
||||
"day 113: buy 5 units at price 5158.950195, total balance 5298.318042\n",
|
||||
"day 114: buy 5 units at price 5032.349855, total balance 265.968187\n",
|
||||
"day 116, sell 5 units at price 5125.700075, investment 1.993835 %, total balance 5391.668262,\n",
|
||||
"day 118: buy 1 units at price 1007.039978, total balance 4384.628284\n",
|
||||
"day 119: buy 5 units at price 5077.250060, total balance -692.621776\n",
|
||||
"day 126, sell 5 units at price 5360.399780, investment 3.904856 %, total balance 4667.778004,\n",
|
||||
"day 128, sell 5 units at price 5364.799805, investment 6.606257 %, total balance 10032.577809,\n",
|
||||
"day 129, sell 5 units at price 5337.249755, investment 429.993831 %, total balance 15369.827564,\n",
|
||||
"day 131, sell 1 units at price 1021.179993, investment -79.887144 %, total balance 16391.007557,\n",
|
||||
"day 132: buy 1 units at price 1040.040039, total balance 15350.967518\n",
|
||||
"day 135, sell 1 units at price 1037.310059, investment -0.262488 %, total balance 16388.277577,\n",
|
||||
"day 136: buy 5 units at price 5121.900025, total balance 11266.377552\n",
|
||||
"day 137: buy 1 units at price 1023.719971, total balance 10242.657581\n",
|
||||
"day 138: buy 5 units at price 5241.049805, total balance 5001.607776\n",
|
||||
"day 139: buy 5 units at price 5273.950195, total balance -272.342419\n",
|
||||
"day 141, sell 5 units at price 5413.800050, investment 5.699057 %, total balance 5141.457631,\n",
|
||||
"day 142, sell 5 units at price 5487.849730, investment 436.069422 %, total balance 10629.307361,\n",
|
||||
"day 144: buy 1 units at price 1100.199951, total balance 9529.107410\n",
|
||||
"day 147: buy 1 units at price 1078.589966, total balance 8450.517444\n",
|
||||
"day 148: buy 5 units at price 5331.799925, total balance 3118.717519\n",
|
||||
"day 150: buy 5 units at price 5348.649900, total balance -2229.932381\n",
|
||||
"day 159, sell 5 units at price 5698.300170, investment 8.724404 %, total balance 3468.367789,\n",
|
||||
"day 161, sell 5 units at price 5619.299925, investment 6.548218 %, total balance 9087.667714,\n",
|
||||
"day 162: buy 5 units at price 5604.349975, total balance 3483.317739\n",
|
||||
"day 168: buy 1 units at price 1173.459961, total balance 2309.857778\n",
|
||||
"day 170, sell 5 units at price 5849.199830, investment 431.648799 %, total balance 8159.057608,\n",
|
||||
"day 171, sell 5 units at price 5788.300170, investment 436.654368 %, total balance 13947.357778,\n",
|
||||
"day 172, sell 4 units at price 4621.919920, investment -13.314078 %, total balance 18569.277698,\n",
|
||||
"day 173: buy 5 units at price 5624.050295, total balance 12945.227403\n",
|
||||
"day 175: buy 5 units at price 5519.899900, total balance 7425.327503\n",
|
||||
"day 176: buy 5 units at price 5571.099855, total balance 1854.227648\n",
|
||||
"day 179: buy 5 units at price 5514.450075, total balance -3660.222427\n",
|
||||
"day 184, sell 5 units at price 5769.500120, investment 7.868345 %, total balance 2109.277693,\n",
|
||||
"day 187: buy 5 units at price 5919.299925, total balance -3810.022232\n",
|
||||
"day 194, sell 5 units at price 6318.499755, investment 12.742776 %, total balance 2508.477523,\n",
|
||||
"day 195, sell 5 units at price 6341.649780, investment 440.423192 %, total balance 8850.127303,\n",
|
||||
"day 196, sell 5 units at price 6192.500000, investment 10.107479 %, total balance 15042.627303,\n",
|
||||
"day 197, sell 5 units at price 6098.699950, investment 10.485698 %, total balance 21141.327253,\n",
|
||||
"day 204: buy 5 units at price 6228.049925, total balance 14913.277328\n",
|
||||
"day 205: buy 5 units at price 6245.499880, total balance 8667.777448\n",
|
||||
"day 206: buy 5 units at price 6188.049925, total balance 2479.727523\n",
|
||||
"day 207, sell 5 units at price 6175.050050, investment -0.850987 %, total balance 8654.777573,\n",
|
||||
"day 208, sell 5 units at price 6210.499880, investment -0.560404 %, total balance 14865.277453,\n",
|
||||
"day 209: buy 5 units at price 6071.900025, total balance 8793.377428\n",
|
||||
"day 210: buy 5 units at price 6032.449950, total balance 2760.927478\n",
|
||||
"day 211: buy 5 units at price 6004.799805, total balance -3243.872327\n",
|
||||
"day 219, sell 5 units at price 6246.500245, investment 0.944568 %, total balance 3002.627918,\n",
|
||||
"day 220, sell 5 units at price 6195.599975, investment 2.037253 %, total balance 9198.227893,\n",
|
||||
"day 221, sell 5 units at price 6090.949705, investment 0.969751 %, total balance 15289.177598,\n",
|
||||
"day 227: buy 1 units at price 1177.359985, total balance 14111.817613\n",
|
||||
"day 229: buy 5 units at price 5876.649780, total balance 8235.167833\n",
|
||||
"day 230: buy 5 units at price 5862.650145, total balance 2372.517688\n",
|
||||
"day 231: buy 1 units at price 1156.050049, total balance 1216.467639\n",
|
||||
"day 232: buy 1 units at price 1161.219971, total balance 55.247668\n",
|
||||
"day 233, sell 5 units at price 5855.449830, investment -2.487177 %, total balance 5910.697498,\n",
|
||||
"day 234, sell 5 units at price 5934.349975, investment 404.038701 %, total balance 11845.047473,\n",
|
||||
"day 235: buy 5 units at price 5830.449830, total balance 6014.597643\n",
|
||||
"day 238: buy 1 units at price 1180.489990, total balance 4834.107653\n",
|
||||
"day 242, sell 5 units at price 6000.549925, investment 2.108347 %, total balance 10834.657578,\n",
|
||||
"day 243, sell 5 units at price 6014.749755, investment 2.594383 %, total balance 16849.407333,\n",
|
||||
"day 245, sell 4 units at price 4629.399904, investment 300.449782 %, total balance 21478.807237,\n",
|
||||
"\n",
|
||||
"total gained 11478.807237, total investment 114.788072 %\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJIAAAJHCAYAAADLzny5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xl8lOW9///XPVu2yTZJSEDZlXGrgqIgorSenkNrW49Cj1IrirYu9bjUYu2v59Sebnaxek61HttTN1zK97QKerBaW9tqVRAVRdxgEIGAZJ2ZJJNkMpnM3Pfvj0kCkUAmyyxJ3s/Hg0eTa+655pqQGx/z7uf6XIZlWYiIiIiIiIiIiAzElukFiIiIiIiIiIjI6KAgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkqIgSUREREREREREkuLI9AKSkAOcCtQC8QyvRURERERERERkLLADE4HXgc5knzQagqRTgZcyvQgRERERERERkTHoTODlZC8eDUFSLUBTUzumaWV6LcNWVuYmEGjL9DJEsp7uFZHk6F4RSY7uFZHk6F4RGdhYuU9sNoPS0gLozl2SNRqCpDiAaVpjIkgCxsz7EEk13SsiydG9IpIc3SsiydG9IjKwMXafDKqNkJpti4iIiIiIiIhIUhQkiYiIiIiIiIhIUkbD1jYRERERERERGSPi8RhNTY3EYtFML2VIGhpsmKaZ6WUkzWazk5fnxu0uxjCMYc+nIElERERERERE0qapqZHc3HwKCqpGJNhIN4fDRiw2OoIky7KIx2O0tjbT1NSIxzNh2HNqa5uIiIiIiIiIpE0sFqWgoGhUhkijjWEYOBxOSkrKiEYjIzKngiQRERERERERSSuFSOllGDZgZE6aU5AkIiIiIiIiIiJJUZAkIiIiIiIiIuNSW1sb3/72yrS93q23fo9nnnkqba+XCgqSRERERERERGRcam0N8cEH2zO9jFFFp7aJiIiIiIiIyLj0i1/8HL+/kW9/+yauv/4brFx5HcXFJbhcOSxe/Fk2b36Df//37wFw7bVXcvnlV3LaaafxyCOreP7554jHTebN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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": {
|
||||
"inputHidden": false,
|
||||
"outputHidden": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernel_info": {
|
||||
"name": "python3"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "0.11.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Reference in new issue
Block a user