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

893 lines
75 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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": "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v2oH/kXsfT4f61btYPIJA1q5VQe77LK/tMh1Bg0awt13z2+RawkhhBBCCNHSPEVWRc9ICfw6DX+2z+sxAz+vx8fmn9MYO7EPEVEhjT7/a6+9wsqVX+FylXHFFVcxZcqx7Nu3l8suu4DFi78EqPL3Rx99iG7dunHuuRcCsGXLZu6++zZeffVtHnjgXgYNGsysWbN58cXn2LlzB8XFRezdu4cePXpy330PERYWRlFREX/727388cc2kpNTSEpKJj4+gb/+9doqbSsrK2P+/LvZvn0bdruD3r37cN99D/L99+v4178e58UXXwHg7bdf5803/0dUVDRHHDGRd955g8WLvwy0e8aMM1izZhVlZWXccstdjBgxErfbzU03XUt+fj4ul4shQ4Zy44234XQ6G/2eCiGEEEII0RidsaIndPKhnpWzfX7+rF9TsNlsLFz4Kg899A8efvgBcnNzat1/1qyzeP/9dwJtevvtNzj99D9hGMZB+2q9ibvvvp///vct3G43S5Z8AsB//vM80dExvPrq29x334P89NOGaq+1du1qSkqKWbToTV566TVuvPG2g/b5/fffeOWVhTzzzAJeeOFlCgurrmWSn5/PsGHD+c9/XuWSSy7n2WefAMBut3P33fN58cVXeOWV1/F4PCxe/H7db5gQQgghhBDNzFNsVvTsbIFfnRk/pdTfgVlAX+AwrfUv1usDgZeARCAbuFBr/VtjtrWkA7N9fk2Z9TvllNMA6N27LwMHKjZu/Jl+/WoeRtq37yF0796DNWu+YejQw1i1agVXX319tfsefvgEoqOjARgyZBh79uwG4Icf1nHttTcCEBMTy6RJR1d7fP/+A9i+/Q8effQhRo0aw5FHHnXQPj/8sJ4jjphIfHw8ANOnz+Dzzz8JbA8Pj2DixEkADB16GE899RgAXq+X115bxJo13+D1eigsLCQsLKzmN0oIIYQQQogW4im0Ar9ONtQzmIzfe8Bk4MA02LPAv7TWA4F/Ac81wbYWU122z68ps34HstvteL37r1teXrWYzJlnns27777F4sUfMHnyVKJq+CYiJCQ08LPNZsPj8dSrHT169GTRojcYN24869at5eKLz8HlctXrHCEh+4dumm1wA/D555/y008bePrp53n55dc5/fQzD7pPIYQQQgghWkMg42clUTqLOgM/rfXXWutdlV9TSqUAo4HX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\n",
"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
}