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

867 lines
74 KiB
Plaintext
Raw 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>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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\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
}