{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 0: Import package" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests as r\n", "import json\n", "import pandas as pd\n", "from datetime import datetime, date\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 1: 下載一個月台股個股成交資料" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "url = \"https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20200801&stockNo=2330\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<Response [200]>" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r.get(url)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "res = r.get(url)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'data': [['109/08/03',\n", " '77,288,571',\n", " '32,339,719,000',\n", " '420.50',\n", " '424.00',\n", " '415.00',\n", " '416.00',\n", " '-9.50',\n", " '43,360'],\n", " ['109/08/04',\n", " '41,697,445',\n", " '17,600,499,460',\n", " '421.50',\n", " '425.50',\n", " '418.50',\n", " '425.50',\n", " '+9.50',\n", " '22,250'],\n", " ['109/08/05',\n", " '47,460,834',\n", " '20,356,413,204',\n", " '430.50',\n", " '433.50',\n", " '426.00',\n", " '429.00',\n", " '+3.50',\n", " '24,715'],\n", " ['109/08/06',\n", " '43,443,627',\n", " '18,877,761,758',\n", " '437.50',\n", " '438.00',\n", " '431.00',\n", " '435.00',\n", " '+6.00',\n", " '22,414'],\n", " ['109/08/07',\n", " '37,611,388',\n", " '16,218,241,255',\n", " '433.50',\n", " '434.00',\n", " '428.00',\n", " '433.00',\n", " '-2.00',\n", " '19,739'],\n", " ['109/08/10',\n", " '36,067,500',\n", " '15,674,843,876',\n", " '427.50',\n", " '437.50',\n", " '427.50',\n", " '435.50',\n", " '+2.50',\n", " '21,342'],\n", " ['109/08/11',\n", " '34,545,313',\n", " '14,918,017,903',\n", " '432.00',\n", " '435.00',\n", " '429.00',\n", " '429.00',\n", " '-6.50',\n", " '20,297'],\n", " ['109/08/12',\n", " '53,980,474',\n", " '22,721,731,886',\n", " '422.00',\n", " '423.50',\n", " '419.00',\n", " '419.00',\n", " '-10.00',\n", " '32,761'],\n", " ['109/08/13',\n", " '45,669,335',\n", " '19,514,322,038',\n", " '428.00',\n", " '429.00',\n", " '424.50',\n", " '429.00',\n", " '+10.00',\n", " '21,499'],\n", " ['109/08/14',\n", " '24,259,947',\n", " '10,332,447,763',\n", " '424.00',\n", " '428.00',\n", " '423.00',\n", " '427.00',\n", " '-2.00',\n", " '12,642'],\n", " ['109/08/17',\n", " '34,607,731',\n", " '14,930,831,216',\n", " '427.00',\n", " '435.00',\n", " '425.50',\n", " '435.00',\n", " '+8.00',\n", " '20,823'],\n", " ['109/08/18',\n", " '45,504,160',\n", " '19,824,413,320',\n", " '440.00',\n", " '440.50',\n", " '432.00',\n", " '433.00',\n", " '-2.00',\n", " '21,119'],\n", " ['109/08/19',\n", " '31,486,800',\n", " '13,574,970,200',\n", " '436.00',\n", " '436.50',\n", " '427.50',\n", " '427.50',\n", " '-5.50',\n", " '18,279'],\n", " ['109/08/20',\n", " '75,155,235',\n", " '31,353,886,930',\n", " '427.00',\n", " '427.50',\n", " '401.00',\n", " '415.00',\n", " '-12.50',\n", " '45,670'],\n", " ['109/08/21',\n", " '41,956,467',\n", " '17,770,610,338',\n", " '421.50',\n", " '427.00',\n", " '420.00',\n", " '424.50',\n", " '+9.50',\n", " '23,059'],\n", " ['109/08/24',\n", " '49,199,406',\n", " '21,139,093,710',\n", " '427.50',\n", " '434.50',\n", " '425.00',\n", " '428.00',\n", " '+3.50',\n", " '24,672'],\n", " ['109/08/25',\n", " '37,024,899',\n", " '16,076,146,369',\n", " '433.50',\n", " '436.00',\n", " '430.50',\n", " '434.50',\n", " '+6.50',\n", " '22,035'],\n", " ['109/08/26',\n", " '41,406,340',\n", " '18,169,230,108',\n", " '435.50',\n", " '442.00',\n", " '435.00',\n", " '442.00',\n", " '+7.50',\n", " '25,305'],\n", " ['109/08/27',\n", " '57,206,712',\n", " '25,658,355,402',\n", " '448.00',\n", " '453.50',\n", " '444.00',\n", " '444.00',\n", " '+2.00',\n", " '31,575'],\n", " ['109/08/28',\n", " '57,039,210',\n", " '24,868,453,700',\n", " '440.00',\n", " '440.50',\n", " '431.00',\n", " '435.00',\n", " '-9.00',\n", " '35,253'],\n", " ['109/08/31',\n", " '88,569,538',\n", " '38,106,113,563',\n", " '437.00',\n", " '439.50',\n", " '426.50',\n", " '426.50',\n", " '-8.50',\n", " '28,294']],\n", " 'date': '20200801',\n", " 'fields': ['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數'],\n", " 'notes': ['符號說明:+/-/X表示漲/跌/不比價',\n", " '當日統計資訊含一般、零股、盤後定價、鉅額交易,不含拍賣、標購。',\n", " 'ETF證券代號第六碼為K、M、S、C者,表示該ETF以外幣交易。'],\n", " 'stat': 'OK',\n", " 'title': '109年08月 2330 台積電 各日成交資訊'}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res.json()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "stock_json = res.json()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['109/08/03',\n", " '77,288,571',\n", " '32,339,719,000',\n", " '420.50',\n", " '424.00',\n", " '415.00',\n", " '416.00',\n", " '-9.50',\n", " '43,360'],\n", " ['109/08/04',\n", " '41,697,445',\n", " '17,600,499,460',\n", " '421.50',\n", " '425.50',\n", " '418.50',\n", " '425.50',\n", " '+9.50',\n", " '22,250'],\n", " ['109/08/05',\n", " '47,460,834',\n", " '20,356,413,204',\n", " '430.50',\n", " '433.50',\n", " '426.00',\n", " '429.00',\n", " '+3.50',\n", " '24,715'],\n", " ['109/08/06',\n", " '43,443,627',\n", " '18,877,761,758',\n", " '437.50',\n", " '438.00',\n", " '431.00',\n", " '435.00',\n", " '+6.00',\n", " '22,414'],\n", " ['109/08/07',\n", " '37,611,388',\n", " '16,218,241,255',\n", " '433.50',\n", " '434.00',\n", " '428.00',\n", " '433.00',\n", " '-2.00',\n", " '19,739'],\n", " ['109/08/10',\n", " '36,067,500',\n", " '15,674,843,876',\n", " '427.50',\n", " '437.50',\n", " '427.50',\n", " '435.50',\n", " '+2.50',\n", " '21,342'],\n", " ['109/08/11',\n", " '34,545,313',\n", " '14,918,017,903',\n", " '432.00',\n", " '435.00',\n", " '429.00',\n", " '429.00',\n", " '-6.50',\n", " '20,297'],\n", " ['109/08/12',\n", " '53,980,474',\n", " '22,721,731,886',\n", " '422.00',\n", " '423.50',\n", " '419.00',\n", " '419.00',\n", " '-10.00',\n", " '32,761'],\n", " ['109/08/13',\n", " '45,669,335',\n", " '19,514,322,038',\n", " '428.00',\n", " '429.00',\n", " '424.50',\n", " '429.00',\n", " '+10.00',\n", " '21,499'],\n", " ['109/08/14',\n", " '24,259,947',\n", " '10,332,447,763',\n", " '424.00',\n", " '428.00',\n", " '423.00',\n", " '427.00',\n", " '-2.00',\n", " '12,642'],\n", " ['109/08/17',\n", " '34,607,731',\n", " '14,930,831,216',\n", " '427.00',\n", " '435.00',\n", " '425.50',\n", " '435.00',\n", " '+8.00',\n", " '20,823'],\n", " ['109/08/18',\n", " '45,504,160',\n", " '19,824,413,320',\n", " '440.00',\n", " '440.50',\n", " '432.00',\n", " '433.00',\n", " '-2.00',\n", " '21,119'],\n", " ['109/08/19',\n", " '31,486,800',\n", " '13,574,970,200',\n", " '436.00',\n", " '436.50',\n", " '427.50',\n", " '427.50',\n", " '-5.50',\n", " '18,279'],\n", " ['109/08/20',\n", " '75,155,235',\n", " '31,353,886,930',\n", " '427.00',\n", " '427.50',\n", " '401.00',\n", " '415.00',\n", " '-12.50',\n", " '45,670'],\n", " ['109/08/21',\n", " '41,956,467',\n", " '17,770,610,338',\n", " '421.50',\n", " '427.00',\n", " '420.00',\n", " '424.50',\n", " '+9.50',\n", " '23,059'],\n", " ['109/08/24',\n", " '49,199,406',\n", " '21,139,093,710',\n", " '427.50',\n", " '434.50',\n", " '425.00',\n", " '428.00',\n", " '+3.50',\n", " '24,672'],\n", " ['109/08/25',\n", " '37,024,899',\n", " '16,076,146,369',\n", " '433.50',\n", " '436.00',\n", " '430.50',\n", " '434.50',\n", " '+6.50',\n", " '22,035'],\n", " ['109/08/26',\n", " '41,406,340',\n", " '18,169,230,108',\n", " '435.50',\n", " '442.00',\n", " '435.00',\n", " '442.00',\n", " '+7.50',\n", " '25,305'],\n", " ['109/08/27',\n", " '57,206,712',\n", " '25,658,355,402',\n", " '448.00',\n", " '453.50',\n", " '444.00',\n", " '444.00',\n", " '+2.00',\n", " '31,575'],\n", " ['109/08/28',\n", " '57,039,210',\n", " '24,868,453,700',\n", " '440.00',\n", " '440.50',\n", " '431.00',\n", " '435.00',\n", " '-9.00',\n", " '35,253'],\n", " ['109/08/31',\n", " '88,569,538',\n", " '38,106,113,563',\n", " '437.00',\n", " '439.50',\n", " '426.50',\n", " '426.50',\n", " '-8.50',\n", " '28,294']]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock_json['data']" ] }, { "cell_type": "code", "execution_count": 8, "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>0</th>\n", " <th>1</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " <th>5</th>\n", " <th>6</th>\n", " <th>7</th>\n", " <th>8</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>109/08/03</td>\n", " <td>77,288,571</td>\n", " <td>32,339,719,000</td>\n", " <td>420.50</td>\n", " <td>424.00</td>\n", " <td>415.00</td>\n", " <td>416.00</td>\n", " <td>-9.50</td>\n", " <td>43,360</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>109/08/04</td>\n", " <td>41,697,445</td>\n", " <td>17,600,499,460</td>\n", " <td>421.50</td>\n", " <td>425.50</td>\n", " <td>418.50</td>\n", " <td>425.50</td>\n", " <td>+9.50</td>\n", " <td>22,250</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>109/08/05</td>\n", " <td>47,460,834</td>\n", " <td>20,356,413,204</td>\n", " <td>430.50</td>\n", " <td>433.50</td>\n", " <td>426.00</td>\n", " <td>429.00</td>\n", " <td>+3.50</td>\n", " <td>24,715</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>109/08/06</td>\n", " <td>43,443,627</td>\n", " <td>18,877,761,758</td>\n", " <td>437.50</td>\n", " <td>438.00</td>\n", " <td>431.00</td>\n", " <td>435.00</td>\n", " <td>+6.00</td>\n", " <td>22,414</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>109/08/07</td>\n", " <td>37,611,388</td>\n", " <td>16,218,241,255</td>\n", " <td>433.50</td>\n", " <td>434.00</td>\n", " <td>428.00</td>\n", " <td>433.00</td>\n", " <td>-2.00</td>\n", " <td>19,739</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>109/08/10</td>\n", " <td>36,067,500</td>\n", " <td>15,674,843,876</td>\n", " <td>427.50</td>\n", " <td>437.50</td>\n", " <td>427.50</td>\n", " <td>435.50</td>\n", " <td>+2.50</td>\n", " <td>21,342</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>109/08/11</td>\n", " <td>34,545,313</td>\n", " <td>14,918,017,903</td>\n", " <td>432.00</td>\n", " <td>435.00</td>\n", " <td>429.00</td>\n", " <td>429.00</td>\n", " <td>-6.50</td>\n", " <td>20,297</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>109/08/12</td>\n", " <td>53,980,474</td>\n", " <td>22,721,731,886</td>\n", " <td>422.00</td>\n", " <td>423.50</td>\n", " <td>419.00</td>\n", " <td>419.00</td>\n", " <td>-10.00</td>\n", " <td>32,761</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>109/08/13</td>\n", " <td>45,669,335</td>\n", " <td>19,514,322,038</td>\n", " <td>428.00</td>\n", " <td>429.00</td>\n", " <td>424.50</td>\n", " <td>429.00</td>\n", " <td>+10.00</td>\n", " <td>21,499</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>109/08/14</td>\n", " <td>24,259,947</td>\n", " <td>10,332,447,763</td>\n", " <td>424.00</td>\n", " <td>428.00</td>\n", " <td>423.00</td>\n", " <td>427.00</td>\n", " <td>-2.00</td>\n", " <td>12,642</td>\n", " </tr>\n", " <tr>\n", " <th>10</th>\n", " <td>109/08/17</td>\n", " <td>34,607,731</td>\n", " <td>14,930,831,216</td>\n", " <td>427.00</td>\n", " <td>435.00</td>\n", " <td>425.50</td>\n", " <td>435.00</td>\n", " <td>+8.00</td>\n", " <td>20,823</td>\n", " </tr>\n", " <tr>\n", " <th>11</th>\n", " <td>109/08/18</td>\n", " <td>45,504,160</td>\n", " <td>19,824,413,320</td>\n", " <td>440.00</td>\n", " <td>440.50</td>\n", " <td>432.00</td>\n", " <td>433.00</td>\n", " <td>-2.00</td>\n", " <td>21,119</td>\n", " </tr>\n", " <tr>\n", " <th>12</th>\n", " <td>109/08/19</td>\n", " <td>31,486,800</td>\n", " <td>13,574,970,200</td>\n", " <td>436.00</td>\n", " <td>436.50</td>\n", " <td>427.50</td>\n", " <td>427.50</td>\n", " <td>-5.50</td>\n", " <td>18,279</td>\n", " </tr>\n", " <tr>\n", " <th>13</th>\n", " <td>109/08/20</td>\n", " <td>75,155,235</td>\n", " <td>31,353,886,930</td>\n", " <td>427.00</td>\n", " <td>427.50</td>\n", " <td>401.00</td>\n", " <td>415.00</td>\n", " <td>-12.50</td>\n", " <td>45,670</td>\n", " </tr>\n", " <tr>\n", " <th>14</th>\n", " <td>109/08/21</td>\n", " <td>41,956,467</td>\n", " <td>17,770,610,338</td>\n", " <td>421.50</td>\n", " <td>427.00</td>\n", " <td>420.00</td>\n", " <td>424.50</td>\n", " <td>+9.50</td>\n", " <td>23,059</td>\n", " </tr>\n", " <tr>\n", " <th>15</th>\n", " <td>109/08/24</td>\n", " <td>49,199,406</td>\n", " <td>21,139,093,710</td>\n", " <td>427.50</td>\n", " <td>434.50</td>\n", " <td>425.00</td>\n", " <td>428.00</td>\n", " <td>+3.50</td>\n", " <td>24,672</td>\n", " </tr>\n", " <tr>\n", " <th>16</th>\n", " <td>109/08/25</td>\n", " <td>37,024,899</td>\n", " <td>16,076,146,369</td>\n", " <td>433.50</td>\n", " <td>436.00</td>\n", " <td>430.50</td>\n", " <td>434.50</td>\n", " <td>+6.50</td>\n", " <td>22,035</td>\n", " </tr>\n", " <tr>\n", " <th>17</th>\n", " <td>109/08/26</td>\n", " <td>41,406,340</td>\n", " <td>18,169,230,108</td>\n", " <td>435.50</td>\n", " <td>442.00</td>\n", " <td>435.00</td>\n", " <td>442.00</td>\n", " <td>+7.50</td>\n", " <td>25,305</td>\n", " </tr>\n", " <tr>\n", " <th>18</th>\n", " <td>109/08/27</td>\n", " <td>57,206,712</td>\n", " <td>25,658,355,402</td>\n", " <td>448.00</td>\n", " <td>453.50</td>\n", " <td>444.00</td>\n", " <td>444.00</td>\n", " <td>+2.00</td>\n", " <td>31,575</td>\n", " </tr>\n", " <tr>\n", " <th>19</th>\n", " <td>109/08/28</td>\n", " <td>57,039,210</td>\n", " <td>24,868,453,700</td>\n", " <td>440.00</td>\n", " <td>440.50</td>\n", " <td>431.00</td>\n", " <td>435.00</td>\n", " <td>-9.00</td>\n", " <td>35,253</td>\n", " </tr>\n", " <tr>\n", " <th>20</th>\n", " <td>109/08/31</td>\n", " <td>88,569,538</td>\n", " <td>38,106,113,563</td>\n", " <td>437.00</td>\n", " <td>439.50</td>\n", " <td>426.50</td>\n", " <td>426.50</td>\n", " <td>-8.50</td>\n", " <td>28,294</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 109/08/03 77,288,571 32,339,719,000 420.50 424.00 415.00 416.00 \n", "1 109/08/04 41,697,445 17,600,499,460 421.50 425.50 418.50 425.50 \n", "2 109/08/05 47,460,834 20,356,413,204 430.50 433.50 426.00 429.00 \n", "3 109/08/06 43,443,627 18,877,761,758 437.50 438.00 431.00 435.00 \n", "4 109/08/07 37,611,388 16,218,241,255 433.50 434.00 428.00 433.00 \n", "5 109/08/10 36,067,500 15,674,843,876 427.50 437.50 427.50 435.50 \n", "6 109/08/11 34,545,313 14,918,017,903 432.00 435.00 429.00 429.00 \n", "7 109/08/12 53,980,474 22,721,731,886 422.00 423.50 419.00 419.00 \n", "8 109/08/13 45,669,335 19,514,322,038 428.00 429.00 424.50 429.00 \n", "9 109/08/14 24,259,947 10,332,447,763 424.00 428.00 423.00 427.00 \n", "10 109/08/17 34,607,731 14,930,831,216 427.00 435.00 425.50 435.00 \n", "11 109/08/18 45,504,160 19,824,413,320 440.00 440.50 432.00 433.00 \n", "12 109/08/19 31,486,800 13,574,970,200 436.00 436.50 427.50 427.50 \n", "13 109/08/20 75,155,235 31,353,886,930 427.00 427.50 401.00 415.00 \n", "14 109/08/21 41,956,467 17,770,610,338 421.50 427.00 420.00 424.50 \n", "15 109/08/24 49,199,406 21,139,093,710 427.50 434.50 425.00 428.00 \n", "16 109/08/25 37,024,899 16,076,146,369 433.50 436.00 430.50 434.50 \n", "17 109/08/26 41,406,340 18,169,230,108 435.50 442.00 435.00 442.00 \n", "18 109/08/27 57,206,712 25,658,355,402 448.00 453.50 444.00 444.00 \n", "19 109/08/28 57,039,210 24,868,453,700 440.00 440.50 431.00 435.00 \n", "20 109/08/31 88,569,538 38,106,113,563 437.00 439.50 426.50 426.50 \n", "\n", " 7 8 \n", "0 -9.50 43,360 \n", "1 +9.50 22,250 \n", "2 +3.50 24,715 \n", "3 +6.00 22,414 \n", "4 -2.00 19,739 \n", "5 +2.50 21,342 \n", "6 -6.50 20,297 \n", "7 -10.00 32,761 \n", "8 +10.00 21,499 \n", "9 -2.00 12,642 \n", "10 +8.00 20,823 \n", "11 -2.00 21,119 \n", "12 -5.50 18,279 \n", "13 -12.50 45,670 \n", "14 +9.50 23,059 \n", "15 +3.50 24,672 \n", "16 +6.50 22,035 \n", "17 +7.50 25,305 \n", "18 +2.00 31,575 \n", "19 -9.00 35,253 \n", "20 -8.50 28,294 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame.from_dict(stock_json['data'])" ] }, { "cell_type": "code", "execution_count": 9, "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>0</th>\n", " <th>1</th>\n", " <th>2</th>\n", " <th>3</th>\n", " <th>4</th>\n", " <th>5</th>\n", " <th>6</th>\n", " <th>7</th>\n", " <th>8</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>109/08/03</td>\n", " <td>77,288,571</td>\n", " <td>32,339,719,000</td>\n", " <td>420.50</td>\n", " <td>424.00</td>\n", " <td>415.00</td>\n", " <td>416.00</td>\n", " <td>-9.50</td>\n", " <td>43,360</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>109/08/04</td>\n", " <td>41,697,445</td>\n", " <td>17,600,499,460</td>\n", " <td>421.50</td>\n", " <td>425.50</td>\n", " <td>418.50</td>\n", " <td>425.50</td>\n", " <td>+9.50</td>\n", " <td>22,250</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>109/08/05</td>\n", " <td>47,460,834</td>\n", " <td>20,356,413,204</td>\n", " <td>430.50</td>\n", " <td>433.50</td>\n", " <td>426.00</td>\n", " <td>429.00</td>\n", " <td>+3.50</td>\n", " <td>24,715</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>109/08/06</td>\n", " <td>43,443,627</td>\n", " <td>18,877,761,758</td>\n", " <td>437.50</td>\n", " <td>438.00</td>\n", " <td>431.00</td>\n", " <td>435.00</td>\n", " <td>+6.00</td>\n", " <td>22,414</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>109/08/07</td>\n", " <td>37,611,388</td>\n", " <td>16,218,241,255</td>\n", " <td>433.50</td>\n", " <td>434.00</td>\n", " <td>428.00</td>\n", " <td>433.00</td>\n", " <td>-2.00</td>\n", " <td>19,739</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 109/08/03 77,288,571 32,339,719,000 420.50 424.00 415.00 416.00 \n", "1 109/08/04 41,697,445 17,600,499,460 421.50 425.50 418.50 425.50 \n", "2 109/08/05 47,460,834 20,356,413,204 430.50 433.50 426.00 429.00 \n", "3 109/08/06 43,443,627 18,877,761,758 437.50 438.00 431.00 435.00 \n", "4 109/08/07 37,611,388 16,218,241,255 433.50 434.00 428.00 433.00 \n", "\n", " 7 8 \n", "0 -9.50 43,360 \n", "1 +9.50 22,250 \n", "2 +3.50 24,715 \n", "3 +6.00 22,414 \n", "4 -2.00 19,739 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock_df = pd.DataFrame.from_dict(stock_json['data'])\n", "stock_df.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數']" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock_json['fields']" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "stock_df.columns = stock_json['fields']" ] }, { "cell_type": "code", "execution_count": 12, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>109/08/03</td>\n", " <td>77,288,571</td>\n", " <td>32,339,719,000</td>\n", " <td>420.50</td>\n", " <td>424.00</td>\n", " <td>415.00</td>\n", " <td>416.00</td>\n", " <td>-9.50</td>\n", " <td>43,360</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>109/08/04</td>\n", " <td>41,697,445</td>\n", " <td>17,600,499,460</td>\n", " <td>421.50</td>\n", " <td>425.50</td>\n", " <td>418.50</td>\n", " <td>425.50</td>\n", " <td>+9.50</td>\n", " <td>22,250</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>109/08/05</td>\n", " <td>47,460,834</td>\n", " <td>20,356,413,204</td>\n", " <td>430.50</td>\n", " <td>433.50</td>\n", " <td>426.00</td>\n", " <td>429.00</td>\n", " <td>+3.50</td>\n", " <td>24,715</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>109/08/06</td>\n", " <td>43,443,627</td>\n", " <td>18,877,761,758</td>\n", " <td>437.50</td>\n", " <td>438.00</td>\n", " <td>431.00</td>\n", " <td>435.00</td>\n", " <td>+6.00</td>\n", " <td>22,414</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>109/08/07</td>\n", " <td>37,611,388</td>\n", " <td>16,218,241,255</td>\n", " <td>433.50</td>\n", " <td>434.00</td>\n", " <td>428.00</td>\n", " <td>433.00</td>\n", " <td>-2.00</td>\n", " <td>19,739</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 109/08/03 77,288,571 32,339,719,000 420.50 424.00 415.00 416.00 \n", "1 109/08/04 41,697,445 17,600,499,460 421.50 425.50 418.50 425.50 \n", "2 109/08/05 47,460,834 20,356,413,204 430.50 433.50 426.00 429.00 \n", "3 109/08/06 43,443,627 18,877,761,758 437.50 438.00 431.00 435.00 \n", "4 109/08/07 37,611,388 16,218,241,255 433.50 434.00 428.00 433.00 \n", "\n", " 漲跌價差 成交筆數 \n", "0 -9.50 43,360 \n", "1 +9.50 22,250 \n", "2 +3.50 24,715 \n", "3 +6.00 22,414 \n", "4 -2.00 19,739 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 2: 下載歷年台股個股成交資料" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "url = \"https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20200801&stockNo=2330\"" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "month_list = pd.date_range('2020-06-01','2020-08-01', freq='MS').strftime(\"%Y%m%d\").tolist() " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20200601\n", "20200701\n", "20200801\n" ] } ], "source": [ "for month in month_list:\n", " print(month) " ] }, { "cell_type": "code", "execution_count": 16, "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", " </tr>\n", " </thead>\n", " <tbody>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: []" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame()\n", "df" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "for month in month_list:\n", " url = \"https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=\"+ month + \"&stockNo=2330\"\n", " res = r.get(url)\n", " stock_json = res.json()\n", " stock_df = pd.DataFrame.from_dict(stock_json['data'])\n", " df = df.append(stock_df, ignore_index = True)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "df.columns = ['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數']" ] }, { "cell_type": "code", "execution_count": 19, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>109/06/01</td>\n", " <td>37,936,214</td>\n", " <td>11,205,227,094</td>\n", " <td>294.00</td>\n", " <td>296.50</td>\n", " <td>293.50</td>\n", " <td>295.50</td>\n", " <td>+3.50</td>\n", " <td>15,502</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>109/06/02</td>\n", " <td>26,663,587</td>\n", " <td>7,908,476,089</td>\n", " <td>296.00</td>\n", " <td>297.50</td>\n", " <td>296.00</td>\n", " <td>296.50</td>\n", " <td>+1.00</td>\n", " <td>9,743</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>109/06/03</td>\n", " <td>67,894,337</td>\n", " <td>20,354,971,677</td>\n", " <td>300.00</td>\n", " <td>301.00</td>\n", " <td>298.00</td>\n", " <td>301.00</td>\n", " <td>+4.50</td>\n", " <td>33,062</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>109/06/04</td>\n", " <td>47,225,322</td>\n", " <td>14,414,983,532</td>\n", " <td>305.00</td>\n", " <td>306.00</td>\n", " <td>304.00</td>\n", " <td>306.00</td>\n", " <td>+5.00</td>\n", " <td>24,482</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>109/06/05</td>\n", " <td>44,077,262</td>\n", " <td>13,655,618,646</td>\n", " <td>308.50</td>\n", " <td>312.00</td>\n", " <td>308.00</td>\n", " <td>311.50</td>\n", " <td>+5.50</td>\n", " <td>24,096</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 109/06/01 37,936,214 11,205,227,094 294.00 296.50 293.50 295.50 \n", "1 109/06/02 26,663,587 7,908,476,089 296.00 297.50 296.00 296.50 \n", "2 109/06/03 67,894,337 20,354,971,677 300.00 301.00 298.00 301.00 \n", "3 109/06/04 47,225,322 14,414,983,532 305.00 306.00 304.00 306.00 \n", "4 109/06/05 44,077,262 13,655,618,646 308.50 312.00 308.00 311.50 \n", "\n", " 漲跌價差 成交筆數 \n", "0 +3.50 15,502 \n", "1 +1.00 9,743 \n", "2 +4.50 33,062 \n", "3 +5.00 24,482 \n", "4 +5.50 24,096 " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def get_stock_data(start_year, start_month, end_year, end_month, stock_code):\n", " start_date = str(date(start_year, start_month, 1))\n", " end_date = str(date(end_year, end_month, 1))\n", " month_list = pd.date_range(start_date, end_date, freq='MS').strftime(\"%Y%m%d\").tolist()\n", " \n", " df = pd.DataFrame()\n", " for month in month_list:\n", " url = \"https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=\"+ month + \"&stockNo=\" + str(stock_code)\n", " res = r.get(url)\n", " stock_json = res.json()\n", " stock_df = pd.DataFrame.from_dict(stock_json['data'])\n", " df = df.append(stock_df, ignore_index = True)\n", " \n", " df.columns = ['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數']\n", " return df" ] }, { "cell_type": "code", "execution_count": 21, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>108/06/03</td>\n", " <td>36,687,092</td>\n", " <td>8,651,389,851</td>\n", " <td>235.50</td>\n", " <td>238.50</td>\n", " <td>232.00</td>\n", " <td>238.00</td>\n", " <td>+2.50</td>\n", " <td>8,857</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>108/06/04</td>\n", " <td>24,443,428</td>\n", " <td>5,745,045,809</td>\n", " <td>237.50</td>\n", " <td>238.00</td>\n", " <td>233.00</td>\n", " <td>233.00</td>\n", " <td>-5.00</td>\n", " <td>11,779</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>108/06/05</td>\n", " <td>35,901,584</td>\n", " <td>8,461,930,934</td>\n", " <td>238.00</td>\n", " <td>238.00</td>\n", " <td>234.00</td>\n", " <td>235.00</td>\n", " <td>+2.00</td>\n", " <td>12,064</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>108/06/06</td>\n", " <td>34,651,731</td>\n", " <td>8,008,768,323</td>\n", " <td>231.50</td>\n", " <td>232.00</td>\n", " <td>229.50</td>\n", " <td>232.00</td>\n", " <td>-3.00</td>\n", " <td>14,723</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>108/06/10</td>\n", " <td>35,521,888</td>\n", " <td>8,442,986,620</td>\n", " <td>237.50</td>\n", " <td>240.00</td>\n", " <td>234.50</td>\n", " <td>240.00</td>\n", " <td>+8.00</td>\n", " <td>15,588</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>58</th>\n", " <td>108/08/26</td>\n", " <td>31,740,620</td>\n", " <td>7,910,873,500</td>\n", " <td>249.00</td>\n", " <td>250.50</td>\n", " <td>248.50</td>\n", " <td>248.50</td>\n", " <td>-5.50</td>\n", " <td>13,388</td>\n", " </tr>\n", " <tr>\n", " <th>59</th>\n", " <td>108/08/27</td>\n", " <td>53,664,951</td>\n", " <td>13,410,582,151</td>\n", " <td>250.50</td>\n", " <td>251.00</td>\n", " <td>248.50</td>\n", " <td>250.00</td>\n", " <td>+1.50</td>\n", " <td>8,939</td>\n", " </tr>\n", " <tr>\n", " <th>60</th>\n", " <td>108/08/28</td>\n", " <td>15,280,882</td>\n", " <td>3,852,096,070</td>\n", " <td>250.50</td>\n", " <td>253.00</td>\n", " <td>250.50</td>\n", " <td>252.00</td>\n", " <td>+2.00</td>\n", " <td>6,829</td>\n", " </tr>\n", " <tr>\n", " <th>61</th>\n", " <td>108/08/29</td>\n", " <td>20,085,767</td>\n", " <td>5,078,703,588</td>\n", " <td>253.00</td>\n", " <td>254.00</td>\n", " <td>251.00</td>\n", " <td>254.00</td>\n", " <td>+2.00</td>\n", " <td>6,596</td>\n", " </tr>\n", " <tr>\n", " <th>62</th>\n", " <td>108/08/30</td>\n", " <td>35,299,201</td>\n", " <td>9,092,482,858</td>\n", " <td>256.50</td>\n", " <td>259.00</td>\n", " <td>256.00</td>\n", " <td>259.00</td>\n", " <td>+5.00</td>\n", " <td>13,703</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>63 rows × 9 columns</p>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 108/06/03 36,687,092 8,651,389,851 235.50 238.50 232.00 238.00 \n", "1 108/06/04 24,443,428 5,745,045,809 237.50 238.00 233.00 233.00 \n", "2 108/06/05 35,901,584 8,461,930,934 238.00 238.00 234.00 235.00 \n", "3 108/06/06 34,651,731 8,008,768,323 231.50 232.00 229.50 232.00 \n", "4 108/06/10 35,521,888 8,442,986,620 237.50 240.00 234.50 240.00 \n", ".. ... ... ... ... ... ... ... \n", "58 108/08/26 31,740,620 7,910,873,500 249.00 250.50 248.50 248.50 \n", "59 108/08/27 53,664,951 13,410,582,151 250.50 251.00 248.50 250.00 \n", "60 108/08/28 15,280,882 3,852,096,070 250.50 253.00 250.50 252.00 \n", "61 108/08/29 20,085,767 5,078,703,588 253.00 254.00 251.00 254.00 \n", "62 108/08/30 35,299,201 9,092,482,858 256.50 259.00 256.00 259.00 \n", "\n", " 漲跌價差 成交筆數 \n", "0 +2.50 8,857 \n", "1 -5.00 11,779 \n", "2 +2.00 12,064 \n", "3 -3.00 14,723 \n", "4 +8.00 15,588 \n", ".. ... ... \n", "58 -5.50 13,388 \n", "59 +1.50 8,939 \n", "60 +2.00 6,829 \n", "61 +2.00 6,596 \n", "62 +5.00 13,703 \n", "\n", "[63 rows x 9 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_stock_data(start_year = 2019, start_month = 6, end_year = 2019, end_month = 8, stock_code = 2330)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 3: 將下載的個股資料從字串(string)轉型成日期(datetime)及浮點數(float)" ] }, { "cell_type": "code", "execution_count": 22, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>108/06/03</td>\n", " <td>36,687,092</td>\n", " <td>8,651,389,851</td>\n", " <td>235.50</td>\n", " <td>238.50</td>\n", " <td>232.00</td>\n", " <td>238.00</td>\n", " <td>+2.50</td>\n", " <td>8,857</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>108/06/04</td>\n", " <td>24,443,428</td>\n", " <td>5,745,045,809</td>\n", " <td>237.50</td>\n", " <td>238.00</td>\n", " <td>233.00</td>\n", " <td>233.00</td>\n", " <td>-5.00</td>\n", " <td>11,779</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>108/06/05</td>\n", " <td>35,901,584</td>\n", " <td>8,461,930,934</td>\n", " <td>238.00</td>\n", " <td>238.00</td>\n", " <td>234.00</td>\n", " <td>235.00</td>\n", " <td>+2.00</td>\n", " <td>12,064</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>108/06/06</td>\n", " <td>34,651,731</td>\n", " <td>8,008,768,323</td>\n", " <td>231.50</td>\n", " <td>232.00</td>\n", " <td>229.50</td>\n", " <td>232.00</td>\n", " <td>-3.00</td>\n", " <td>14,723</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>108/06/10</td>\n", " <td>35,521,888</td>\n", " <td>8,442,986,620</td>\n", " <td>237.50</td>\n", " <td>240.00</td>\n", " <td>234.50</td>\n", " <td>240.00</td>\n", " <td>+8.00</td>\n", " <td>15,588</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 108/06/03 36,687,092 8,651,389,851 235.50 238.50 232.00 238.00 \n", "1 108/06/04 24,443,428 5,745,045,809 237.50 238.00 233.00 233.00 \n", "2 108/06/05 35,901,584 8,461,930,934 238.00 238.00 234.00 235.00 \n", "3 108/06/06 34,651,731 8,008,768,323 231.50 232.00 229.50 232.00 \n", "4 108/06/10 35,521,888 8,442,986,620 237.50 240.00 234.50 240.00 \n", "\n", " 漲跌價差 成交筆數 \n", "0 +2.50 8,857 \n", "1 -5.00 11,779 \n", "2 +2.00 12,064 \n", "3 -3.00 14,723 \n", "4 +8.00 15,588 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock = get_stock_data(start_year = 2019, start_month = 6, end_year = 2019, end_month = 8, stock_code = 2330)\n", "stock.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 把日期從字串(string)換成時間(datetime),並將民國年換成西元年" ] }, { "cell_type": "code", "execution_count": 23, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2019-06-03 00:00:00</td>\n", " <td>36,687,092</td>\n", " <td>8,651,389,851</td>\n", " <td>235.50</td>\n", " <td>238.50</td>\n", " <td>232.00</td>\n", " <td>238.00</td>\n", " <td>+2.50</td>\n", " <td>8,857</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2019-06-04 00:00:00</td>\n", " <td>24,443,428</td>\n", " <td>5,745,045,809</td>\n", " <td>237.50</td>\n", " <td>238.00</td>\n", " <td>233.00</td>\n", " <td>233.00</td>\n", " <td>-5.00</td>\n", " <td>11,779</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2019-06-05 00:00:00</td>\n", " <td>35,901,584</td>\n", " <td>8,461,930,934</td>\n", " <td>238.00</td>\n", " <td>238.00</td>\n", " <td>234.00</td>\n", " <td>235.00</td>\n", " <td>+2.00</td>\n", " <td>12,064</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2019-06-06 00:00:00</td>\n", " <td>34,651,731</td>\n", " <td>8,008,768,323</td>\n", " <td>231.50</td>\n", " <td>232.00</td>\n", " <td>229.50</td>\n", " <td>232.00</td>\n", " <td>-3.00</td>\n", " <td>14,723</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2019-06-10 00:00:00</td>\n", " <td>35,521,888</td>\n", " <td>8,442,986,620</td>\n", " <td>237.50</td>\n", " <td>240.00</td>\n", " <td>234.50</td>\n", " <td>240.00</td>\n", " <td>+8.00</td>\n", " <td>15,588</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>2019-06-11 00:00:00</td>\n", " <td>34,691,670</td>\n", " <td>8,448,805,962</td>\n", " <td>240.00</td>\n", " <td>246.00</td>\n", " <td>239.00</td>\n", " <td>244.50</td>\n", " <td>+4.50</td>\n", " <td>13,157</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>2019-06-12 00:00:00</td>\n", " <td>30,409,556</td>\n", " <td>7,469,805,086</td>\n", " <td>244.50</td>\n", " <td>247.50</td>\n", " <td>243.00</td>\n", " <td>246.00</td>\n", " <td>+1.50</td>\n", " <td>11,457</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>2019-06-13 00:00:00</td>\n", " <td>33,731,724</td>\n", " <td>8,136,137,708</td>\n", " <td>242.50</td>\n", " <td>244.00</td>\n", " <td>240.00</td>\n", " <td>240.00</td>\n", " <td>-6.00</td>\n", " <td>13,552</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>2019-06-14 00:00:00</td>\n", " <td>35,403,556</td>\n", " <td>8,396,819,832</td>\n", " <td>238.50</td>\n", " <td>239.50</td>\n", " <td>236.00</td>\n", " <td>236.00</td>\n", " <td>-4.00</td>\n", " <td>14,911</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>2019-06-17 00:00:00</td>\n", " <td>51,692,012</td>\n", " <td>12,043,369,475</td>\n", " <td>231.50</td>\n", " <td>235.00</td>\n", " <td>230.50</td>\n", " <td>233.00</td>\n", " <td>-3.00</td>\n", " <td>20,943</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 \\\n", "0 2019-06-03 00:00:00 36,687,092 8,651,389,851 235.50 238.50 232.00 \n", "1 2019-06-04 00:00:00 24,443,428 5,745,045,809 237.50 238.00 233.00 \n", "2 2019-06-05 00:00:00 35,901,584 8,461,930,934 238.00 238.00 234.00 \n", "3 2019-06-06 00:00:00 34,651,731 8,008,768,323 231.50 232.00 229.50 \n", "4 2019-06-10 00:00:00 35,521,888 8,442,986,620 237.50 240.00 234.50 \n", "5 2019-06-11 00:00:00 34,691,670 8,448,805,962 240.00 246.00 239.00 \n", "6 2019-06-12 00:00:00 30,409,556 7,469,805,086 244.50 247.50 243.00 \n", "7 2019-06-13 00:00:00 33,731,724 8,136,137,708 242.50 244.00 240.00 \n", "8 2019-06-14 00:00:00 35,403,556 8,396,819,832 238.50 239.50 236.00 \n", "9 2019-06-17 00:00:00 51,692,012 12,043,369,475 231.50 235.00 230.50 \n", "\n", " 收盤價 漲跌價差 成交筆數 \n", "0 238.00 +2.50 8,857 \n", "1 233.00 -5.00 11,779 \n", "2 235.00 +2.00 12,064 \n", "3 232.00 -3.00 14,723 \n", "4 240.00 +8.00 15,588 \n", "5 244.50 +4.50 13,157 \n", "6 246.00 +1.50 11,457 \n", "7 240.00 -6.00 13,552 \n", "8 236.00 -4.00 14,911 \n", "9 233.00 -3.00 20,943 " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for row in range(stock.shape[0]):\n", " date2 = stock.iloc[row,0].split('/')\n", " stock.iloc[row, 0] = datetime(int(date2[0]) + 1911, int(date2[1]), int(date2[2]))\n", " \n", "stock.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 把\"成交股數\" \"成交金額\" \"開盤價\", \"最高價\", \"最低價\", \"收盤價\" \"漲跌價差\" \"成交筆數\"帶有逗號的字串(string)換成浮點數(float)" ] }, { "cell_type": "code", "execution_count": 26, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2019-06-03 00:00:00</td>\n", " <td>3.66871e+07</td>\n", " <td>8.65139e+09</td>\n", " <td>235.5</td>\n", " <td>238.5</td>\n", " <td>232</td>\n", " <td>238</td>\n", " <td>+2.50</td>\n", " <td>8857</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2019-06-04 00:00:00</td>\n", " <td>2.44434e+07</td>\n", " <td>5.74505e+09</td>\n", " <td>237.5</td>\n", " <td>238</td>\n", " <td>233</td>\n", " <td>233</td>\n", " <td>-5.00</td>\n", " <td>11779</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2019-06-05 00:00:00</td>\n", " <td>3.59016e+07</td>\n", " <td>8.46193e+09</td>\n", " <td>238</td>\n", " <td>238</td>\n", " <td>234</td>\n", " <td>235</td>\n", " <td>+2.00</td>\n", " <td>12064</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2019-06-06 00:00:00</td>\n", " <td>3.46517e+07</td>\n", " <td>8.00877e+09</td>\n", " <td>231.5</td>\n", " <td>232</td>\n", " <td>229.5</td>\n", " <td>232</td>\n", " <td>-3.00</td>\n", " <td>14723</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2019-06-10 00:00:00</td>\n", " <td>3.55219e+07</td>\n", " <td>8.44299e+09</td>\n", " <td>237.5</td>\n", " <td>240</td>\n", " <td>234.5</td>\n", " <td>240</td>\n", " <td>+8.00</td>\n", " <td>15588</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>2019-06-11 00:00:00</td>\n", " <td>3.46917e+07</td>\n", " <td>8.44881e+09</td>\n", " <td>240</td>\n", " <td>246</td>\n", " <td>239</td>\n", " <td>244.5</td>\n", " <td>+4.50</td>\n", " <td>13157</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>2019-06-12 00:00:00</td>\n", " <td>3.04096e+07</td>\n", " <td>7.46981e+09</td>\n", " <td>244.5</td>\n", " <td>247.5</td>\n", " <td>243</td>\n", " <td>246</td>\n", " <td>+1.50</td>\n", " <td>11457</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>2019-06-13 00:00:00</td>\n", " <td>3.37317e+07</td>\n", " <td>8.13614e+09</td>\n", " <td>242.5</td>\n", " <td>244</td>\n", " <td>240</td>\n", " <td>240</td>\n", " <td>-6.00</td>\n", " <td>13552</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>2019-06-14 00:00:00</td>\n", " <td>3.54036e+07</td>\n", " <td>8.39682e+09</td>\n", " <td>238.5</td>\n", " <td>239.5</td>\n", " <td>236</td>\n", " <td>236</td>\n", " <td>-4.00</td>\n", " <td>14911</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>2019-06-17 00:00:00</td>\n", " <td>5.1692e+07</td>\n", " <td>1.20434e+10</td>\n", " <td>231.5</td>\n", " <td>235</td>\n", " <td>230.5</td>\n", " <td>233</td>\n", " <td>-3.00</td>\n", " <td>20943</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 2019-06-03 00:00:00 3.66871e+07 8.65139e+09 235.5 238.5 232 238 \n", "1 2019-06-04 00:00:00 2.44434e+07 5.74505e+09 237.5 238 233 233 \n", "2 2019-06-05 00:00:00 3.59016e+07 8.46193e+09 238 238 234 235 \n", "3 2019-06-06 00:00:00 3.46517e+07 8.00877e+09 231.5 232 229.5 232 \n", "4 2019-06-10 00:00:00 3.55219e+07 8.44299e+09 237.5 240 234.5 240 \n", "5 2019-06-11 00:00:00 3.46917e+07 8.44881e+09 240 246 239 244.5 \n", "6 2019-06-12 00:00:00 3.04096e+07 7.46981e+09 244.5 247.5 243 246 \n", "7 2019-06-13 00:00:00 3.37317e+07 8.13614e+09 242.5 244 240 240 \n", "8 2019-06-14 00:00:00 3.54036e+07 8.39682e+09 238.5 239.5 236 236 \n", "9 2019-06-17 00:00:00 5.1692e+07 1.20434e+10 231.5 235 230.5 233 \n", "\n", " 漲跌價差 成交筆數 \n", "0 +2.50 8857 \n", "1 -5.00 11779 \n", "2 +2.00 12064 \n", "3 -3.00 14723 \n", "4 +8.00 15588 \n", "5 +4.50 13157 \n", "6 +1.50 11457 \n", "7 -6.00 13552 \n", "8 -4.00 14911 \n", "9 -3.00 20943 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for col in [1, 2, 3, 4, 5, 6, 8]:\n", " for row in range(stock.shape[0]):\n", " stock.iloc[row, col] = float(stock.iloc[row,col].replace(',', ''))\n", " \n", "stock.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 4: 將下載的個股資料另存成csv檔" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "stock.to_csv(\"2330.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 5: 畫出下載個股的走勢圖" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "stock2 = stock[:10]" ] }, { "cell_type": "code", "execution_count": 29, "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>日期</th>\n", " <th>成交股數</th>\n", " <th>成交金額</th>\n", " <th>開盤價</th>\n", " <th>最高價</th>\n", " <th>最低價</th>\n", " <th>收盤價</th>\n", " <th>漲跌價差</th>\n", " <th>成交筆數</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2019-06-03 00:00:00</td>\n", " <td>3.66871e+07</td>\n", " <td>8.65139e+09</td>\n", " <td>235.5</td>\n", " <td>238.5</td>\n", " <td>232</td>\n", " <td>238</td>\n", " <td>+2.50</td>\n", " <td>8857</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2019-06-04 00:00:00</td>\n", " <td>2.44434e+07</td>\n", " <td>5.74505e+09</td>\n", " <td>237.5</td>\n", " <td>238</td>\n", " <td>233</td>\n", " <td>233</td>\n", " <td>-5.00</td>\n", " <td>11779</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2019-06-05 00:00:00</td>\n", " <td>3.59016e+07</td>\n", " <td>8.46193e+09</td>\n", " <td>238</td>\n", " <td>238</td>\n", " <td>234</td>\n", " <td>235</td>\n", " <td>+2.00</td>\n", " <td>12064</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2019-06-06 00:00:00</td>\n", " <td>3.46517e+07</td>\n", " <td>8.00877e+09</td>\n", " <td>231.5</td>\n", " <td>232</td>\n", " <td>229.5</td>\n", " <td>232</td>\n", " <td>-3.00</td>\n", " <td>14723</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2019-06-10 00:00:00</td>\n", " <td>3.55219e+07</td>\n", " <td>8.44299e+09</td>\n", " <td>237.5</td>\n", " <td>240</td>\n", " <td>234.5</td>\n", " <td>240</td>\n", " <td>+8.00</td>\n", " <td>15588</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>2019-06-11 00:00:00</td>\n", " <td>3.46917e+07</td>\n", " <td>8.44881e+09</td>\n", " <td>240</td>\n", " <td>246</td>\n", " <td>239</td>\n", " <td>244.5</td>\n", " <td>+4.50</td>\n", " <td>13157</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>2019-06-12 00:00:00</td>\n", " <td>3.04096e+07</td>\n", " <td>7.46981e+09</td>\n", " <td>244.5</td>\n", " <td>247.5</td>\n", " <td>243</td>\n", " <td>246</td>\n", " <td>+1.50</td>\n", " <td>11457</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>2019-06-13 00:00:00</td>\n", " <td>3.37317e+07</td>\n", " <td>8.13614e+09</td>\n", " <td>242.5</td>\n", " <td>244</td>\n", " <td>240</td>\n", " <td>240</td>\n", " <td>-6.00</td>\n", " <td>13552</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>2019-06-14 00:00:00</td>\n", " <td>3.54036e+07</td>\n", " <td>8.39682e+09</td>\n", " <td>238.5</td>\n", " <td>239.5</td>\n", " <td>236</td>\n", " <td>236</td>\n", " <td>-4.00</td>\n", " <td>14911</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>2019-06-17 00:00:00</td>\n", " <td>5.1692e+07</td>\n", " <td>1.20434e+10</td>\n", " <td>231.5</td>\n", " <td>235</td>\n", " <td>230.5</td>\n", " <td>233</td>\n", " <td>-3.00</td>\n", " <td>20943</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " 日期 成交股數 成交金額 開盤價 最高價 最低價 收盤價 \\\n", "0 2019-06-03 00:00:00 3.66871e+07 8.65139e+09 235.5 238.5 232 238 \n", "1 2019-06-04 00:00:00 2.44434e+07 5.74505e+09 237.5 238 233 233 \n", "2 2019-06-05 00:00:00 3.59016e+07 8.46193e+09 238 238 234 235 \n", "3 2019-06-06 00:00:00 3.46517e+07 8.00877e+09 231.5 232 229.5 232 \n", "4 2019-06-10 00:00:00 3.55219e+07 8.44299e+09 237.5 240 234.5 240 \n", "5 2019-06-11 00:00:00 3.46917e+07 8.44881e+09 240 246 239 244.5 \n", "6 2019-06-12 00:00:00 3.04096e+07 7.46981e+09 244.5 247.5 243 246 \n", "7 2019-06-13 00:00:00 3.37317e+07 8.13614e+09 242.5 244 240 240 \n", "8 2019-06-14 00:00:00 3.54036e+07 8.39682e+09 238.5 239.5 236 236 \n", "9 2019-06-17 00:00:00 5.1692e+07 1.20434e+10 231.5 235 230.5 233 \n", "\n", " 漲跌價差 成交筆數 \n", "0 +2.50 8857 \n", "1 -5.00 11779 \n", "2 +2.00 12064 \n", "3 -3.00 14723 \n", "4 +8.00 15588 \n", "5 +4.50 13157 \n", "6 +1.50 11457 \n", "7 -6.00 13552 \n", "8 -4.00 14911 \n", "9 -3.00 20943 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock2 " ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hou/anaconda3/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:2062: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version. Convert to a numpy array before indexing instead.\n", " x[:, None]\n", "/Users/hou/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version. Convert to a numpy array before indexing instead.\n", " x = x[:, np.newaxis]\n", "/Users/hou/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version. Convert to a numpy array before indexing instead.\n", " y = y[:, np.newaxis]\n" ] }, { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x7feaf94c86a0>" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 720x360 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (10, 5))\n", "plt.title('2330 Stock Price')\n", "plt.plot(stock2['日期'], stock2['收盤價'])\n", "plt.plot(stock2['日期'], stock2['開盤價'])\n", "plt.legend(['Close', 'Open'])" ] }, { "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 }