import requests as r
import json
import pandas as pd
from datetime import datetime, date
url = "https://www.twse.com.tw/exchangeReport/FMTQIK?response=json&date=20200701"
r.get(url)
<Response [200]>
res = r.get(url)
res.json()
{'data': [['109/07/01', '5,812,063,202', '193,056,259,836', '1,471,747', '11,703.42', '82.18'], ['109/07/02', '6,091,006,206', '191,309,888,383', '1,487,513', '11,805.14', '101.72'], ['109/07/03', '6,484,752,215', '218,879,744,425', '1,666,680', '11,909.16', '104.02'], ['109/07/06', '7,916,423,089', '252,079,466,765', '1,951,316', '12,116.70', '207.54'], ['109/07/07', '7,651,045,729', '277,506,544,486', '1,994,922', '12,092.97', '-23.73'], ['109/07/08', '6,363,746,201', '242,676,395,267', '1,755,000', '12,170.19', '77.22'], ['109/07/09', '6,645,387,543', '252,727,573,213', '1,866,152', '12,192.69', '22.50'], ['109/07/10', '7,031,694,732', '261,020,496,174', '1,983,065', '12,073.68', '-119.01'], ['109/07/13', '6,140,389,276', '211,132,055,829', '1,586,140', '12,211.56', '137.88'], ['109/07/14', '6,197,831,696', '205,369,887,777', '1,561,071', '12,209.01', '-2.55'], ['109/07/15', '6,756,734,156', '240,427,292,308', '1,778,651', '12,202.85', '-6.16'], ['109/07/16', '5,770,300,669', '199,619,270,942', '1,466,907', '12,157.74', '-45.11'], ['109/07/17', '5,938,809,215', '200,271,062,950', '1,595,717', '12,181.56', '23.82'], ['109/07/20', '5,326,683,162', '176,439,351,236', '1,378,130', '12,174.54', '-7.02'], ['109/07/21', '6,781,208,219', '225,623,414,631', '1,684,747', '12,397.55', '223.01'], ['109/07/22', '6,475,848,930', '226,256,572,816', '1,619,267', '12,473.27', '75.72'], ['109/07/23', '6,566,842,345', '228,150,200,225', '1,573,096', '12,413.04', '-60.23'], ['109/07/24', '7,302,839,893', '268,423,485,119', '1,868,849', '12,304.04', '-109.00'], ['109/07/27', '6,497,324,062', '256,612,208,060', '1,698,001', '12,588.30', '284.26'], ['109/07/28', '7,749,667,366', '348,922,817,780', '2,066,032', '12,586.73', '-1.57'], ['109/07/29', '5,900,556,154', '221,220,518,609', '1,504,202', '12,540.97', '-45.76'], ['109/07/30', '5,882,978,873', '215,707,482,486', '1,489,304', '12,722.92', '181.95'], ['109/07/31', '5,953,761,412', '210,436,131,573', '1,422,266', '12,664.80', '-58.12']], 'date': '20200718', 'fields': ['日期', '成交股數', '成交金額', '成交筆數', '發行量加權股價指數', '漲跌點數'], 'notes': ['當日統計資訊含大盤、零股、盤後定價及鉅額交易,不含拍賣、標購。', '外幣成交值係以本公司當日下午3時30分公告匯率換算後加入成交金額。<br>公告匯率請參考本公司首頁>產品與服務>交易系統>雙幣ETF專區>代號對應及每日公告匯率。'], 'stat': 'OK', 'title': '109年07月市場成交資訊'}
stock_json = res.json()
stock_json['data']
[['109/07/01', '5,812,063,202', '193,056,259,836', '1,471,747', '11,703.42', '82.18'], ['109/07/02', '6,091,006,206', '191,309,888,383', '1,487,513', '11,805.14', '101.72'], ['109/07/03', '6,484,752,215', '218,879,744,425', '1,666,680', '11,909.16', '104.02'], ['109/07/06', '7,916,423,089', '252,079,466,765', '1,951,316', '12,116.70', '207.54'], ['109/07/07', '7,651,045,729', '277,506,544,486', '1,994,922', '12,092.97', '-23.73'], ['109/07/08', '6,363,746,201', '242,676,395,267', '1,755,000', '12,170.19', '77.22'], ['109/07/09', '6,645,387,543', '252,727,573,213', '1,866,152', '12,192.69', '22.50'], ['109/07/10', '7,031,694,732', '261,020,496,174', '1,983,065', '12,073.68', '-119.01'], ['109/07/13', '6,140,389,276', '211,132,055,829', '1,586,140', '12,211.56', '137.88'], ['109/07/14', '6,197,831,696', '205,369,887,777', '1,561,071', '12,209.01', '-2.55'], ['109/07/15', '6,756,734,156', '240,427,292,308', '1,778,651', '12,202.85', '-6.16'], ['109/07/16', '5,770,300,669', '199,619,270,942', '1,466,907', '12,157.74', '-45.11'], ['109/07/17', '5,938,809,215', '200,271,062,950', '1,595,717', '12,181.56', '23.82'], ['109/07/20', '5,326,683,162', '176,439,351,236', '1,378,130', '12,174.54', '-7.02'], ['109/07/21', '6,781,208,219', '225,623,414,631', '1,684,747', '12,397.55', '223.01'], ['109/07/22', '6,475,848,930', '226,256,572,816', '1,619,267', '12,473.27', '75.72'], ['109/07/23', '6,566,842,345', '228,150,200,225', '1,573,096', '12,413.04', '-60.23'], ['109/07/24', '7,302,839,893', '268,423,485,119', '1,868,849', '12,304.04', '-109.00'], ['109/07/27', '6,497,324,062', '256,612,208,060', '1,698,001', '12,588.30', '284.26'], ['109/07/28', '7,749,667,366', '348,922,817,780', '2,066,032', '12,586.73', '-1.57'], ['109/07/29', '5,900,556,154', '221,220,518,609', '1,504,202', '12,540.97', '-45.76'], ['109/07/30', '5,882,978,873', '215,707,482,486', '1,489,304', '12,722.92', '181.95'], ['109/07/31', '5,953,761,412', '210,436,131,573', '1,422,266', '12,664.80', '-58.12']]
pd.DataFrame.from_dict(stock_json['data'])
0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
0 | 109/07/01 | 5,812,063,202 | 193,056,259,836 | 1,471,747 | 11,703.42 | 82.18 |
1 | 109/07/02 | 6,091,006,206 | 191,309,888,383 | 1,487,513 | 11,805.14 | 101.72 |
2 | 109/07/03 | 6,484,752,215 | 218,879,744,425 | 1,666,680 | 11,909.16 | 104.02 |
3 | 109/07/06 | 7,916,423,089 | 252,079,466,765 | 1,951,316 | 12,116.70 | 207.54 |
4 | 109/07/07 | 7,651,045,729 | 277,506,544,486 | 1,994,922 | 12,092.97 | -23.73 |
5 | 109/07/08 | 6,363,746,201 | 242,676,395,267 | 1,755,000 | 12,170.19 | 77.22 |
6 | 109/07/09 | 6,645,387,543 | 252,727,573,213 | 1,866,152 | 12,192.69 | 22.50 |
7 | 109/07/10 | 7,031,694,732 | 261,020,496,174 | 1,983,065 | 12,073.68 | -119.01 |
8 | 109/07/13 | 6,140,389,276 | 211,132,055,829 | 1,586,140 | 12,211.56 | 137.88 |
9 | 109/07/14 | 6,197,831,696 | 205,369,887,777 | 1,561,071 | 12,209.01 | -2.55 |
10 | 109/07/15 | 6,756,734,156 | 240,427,292,308 | 1,778,651 | 12,202.85 | -6.16 |
11 | 109/07/16 | 5,770,300,669 | 199,619,270,942 | 1,466,907 | 12,157.74 | -45.11 |
12 | 109/07/17 | 5,938,809,215 | 200,271,062,950 | 1,595,717 | 12,181.56 | 23.82 |
13 | 109/07/20 | 5,326,683,162 | 176,439,351,236 | 1,378,130 | 12,174.54 | -7.02 |
14 | 109/07/21 | 6,781,208,219 | 225,623,414,631 | 1,684,747 | 12,397.55 | 223.01 |
15 | 109/07/22 | 6,475,848,930 | 226,256,572,816 | 1,619,267 | 12,473.27 | 75.72 |
16 | 109/07/23 | 6,566,842,345 | 228,150,200,225 | 1,573,096 | 12,413.04 | -60.23 |
17 | 109/07/24 | 7,302,839,893 | 268,423,485,119 | 1,868,849 | 12,304.04 | -109.00 |
18 | 109/07/27 | 6,497,324,062 | 256,612,208,060 | 1,698,001 | 12,588.30 | 284.26 |
19 | 109/07/28 | 7,749,667,366 | 348,922,817,780 | 2,066,032 | 12,586.73 | -1.57 |
20 | 109/07/29 | 5,900,556,154 | 221,220,518,609 | 1,504,202 | 12,540.97 | -45.76 |
21 | 109/07/30 | 5,882,978,873 | 215,707,482,486 | 1,489,304 | 12,722.92 | 181.95 |
22 | 109/07/31 | 5,953,761,412 | 210,436,131,573 | 1,422,266 | 12,664.80 | -58.12 |
stock_df = pd.DataFrame.from_dict(stock_json['data'])
stock_df.head()
0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
0 | 109/07/01 | 5,812,063,202 | 193,056,259,836 | 1,471,747 | 11,703.42 | 82.18 |
1 | 109/07/02 | 6,091,006,206 | 191,309,888,383 | 1,487,513 | 11,805.14 | 101.72 |
2 | 109/07/03 | 6,484,752,215 | 218,879,744,425 | 1,666,680 | 11,909.16 | 104.02 |
3 | 109/07/06 | 7,916,423,089 | 252,079,466,765 | 1,951,316 | 12,116.70 | 207.54 |
4 | 109/07/07 | 7,651,045,729 | 277,506,544,486 | 1,994,922 | 12,092.97 | -23.73 |
stock_json['fields']
['日期', '成交股數', '成交金額', '成交筆數', '發行量加權股價指數', '漲跌點數']
stock_df.columns = stock_json['fields']
stock_df.head()
日期 | 成交股數 | 成交金額 | 成交筆數 | 發行量加權股價指數 | 漲跌點數 | |
---|---|---|---|---|---|---|
0 | 109/07/01 | 5,812,063,202 | 193,056,259,836 | 1,471,747 | 11,703.42 | 82.18 |
1 | 109/07/02 | 6,091,006,206 | 191,309,888,383 | 1,487,513 | 11,805.14 | 101.72 |
2 | 109/07/03 | 6,484,752,215 | 218,879,744,425 | 1,666,680 | 11,909.16 | 104.02 |
3 | 109/07/06 | 7,916,423,089 | 252,079,466,765 | 1,951,316 | 12,116.70 | 207.54 |
4 | 109/07/07 | 7,651,045,729 | 277,506,544,486 | 1,994,922 | 12,092.97 | -23.73 |
url = "https://www.twse.com.tw/exchangeReport/FMTQIK?response=json&date=20200701"
month_list = pd.date_range('2020-06-01','2020-08-01', freq='MS').strftime("%Y%m%d").tolist()
for month in month_list:
print(month)
20200601 20200701 20200801
df = pd.DataFrame()
df
for month in month_list:
url = "https://www.twse.com.tw/exchangeReport/FMTQIK?response=json&date=" + month
res = r.get(url)
stock_json = res.json()
stock_df = pd.DataFrame.from_dict(stock_json['data'])
df = df.append(stock_df, ignore_index = True)
df.columns = ['日期', '成交股數', '成交金額', '成交筆數', '發行量加權股價指數', '漲跌點數']
df.head()
日期 | 成交股數 | 成交金額 | 成交筆數 | 發行量加權股價指數 | 漲跌點數 | |
---|---|---|---|---|---|---|
0 | 109/06/01 | 4,975,164,301 | 169,563,746,947 | 1,350,613 | 11,079.02 | 136.86 |
1 | 109/06/02 | 4,974,734,421 | 182,409,278,902 | 1,399,684 | 11,127.93 | 48.91 |
2 | 109/06/03 | 6,431,206,610 | 214,594,995,112 | 1,670,723 | 11,320.16 | 192.23 |
3 | 109/06/04 | 5,944,102,520 | 203,655,766,408 | 1,550,402 | 11,393.23 | 73.07 |
4 | 109/06/05 | 5,782,637,500 | 181,156,372,573 | 1,522,634 | 11,479.40 | 86.17 |
def get_stock_data(start_year, start_month, end_year, end_month):
start_date = str(date(start_year, start_month, 1))
end_date = str(date(end_year, end_month, 1))
month_list = pd.date_range(start_date, end_date, freq='MS').strftime("%Y%m%d").tolist()
df = pd.DataFrame()
for month in month_list:
url = "https://www.twse.com.tw/exchangeReport/FMTQIK?response=json&date=" + month
res = r.get(url)
stock_json = res.json()
stock_df = pd.DataFrame.from_dict(stock_json['data'])
df = df.append(stock_df, ignore_index = True)
df.columns = ['日期', '成交股數', '成交金額', '成交筆數', '發行量加權股價指數', '漲跌點數']
return df
get_stock_data(start_year = 2019, start_month = 7, end_year = 2019, end_month = 9)
日期 | 成交股數 | 成交金額 | 成交筆數 | 發行量加權股價指數 | 漲跌點數 | |
---|---|---|---|---|---|---|
0 | 108/07/01 | 4,985,631,880 | 145,664,096,932 | 1,089,572 | 10,895.46 | 164.63 |
1 | 108/07/02 | 4,295,548,703 | 120,716,164,596 | 991,072 | 10,865.12 | -30.34 |
2 | 108/07/03 | 4,246,162,907 | 112,714,237,324 | 938,659 | 10,743.77 | -121.35 |
3 | 108/07/04 | 3,797,646,624 | 98,158,438,333 | 828,014 | 10,775.90 | 32.13 |
4 | 108/07/05 | 3,400,302,424 | 86,511,212,135 | 752,681 | 10,785.73 | 9.83 |
5 | 108/07/08 | 3,738,945,153 | 97,082,027,949 | 815,372 | 10,751.22 | -34.51 |
6 | 108/07/09 | 3,474,464,386 | 94,204,036,152 | 836,475 | 10,702.78 | -48.44 |
7 | 108/07/10 | 4,044,852,809 | 104,197,474,125 | 932,562 | 10,798.48 | 95.70 |
8 | 108/07/11 | 4,997,530,807 | 132,057,394,072 | 1,071,497 | 10,843.42 | 44.94 |
9 | 108/07/12 | 4,559,013,456 | 122,217,270,421 | 1,031,495 | 10,824.35 | -19.07 |
10 | 108/07/15 | 4,625,135,650 | 120,541,529,871 | 1,005,175 | 10,876.43 | 52.08 |
11 | 108/07/16 | 4,451,418,488 | 119,695,164,249 | 1,037,335 | 10,886.05 | 9.62 |
12 | 108/07/17 | 4,588,257,766 | 116,341,167,900 | 1,048,002 | 10,828.48 | -57.57 |
13 | 108/07/18 | 4,212,328,479 | 106,205,765,697 | 961,380 | 10,799.28 | -29.20 |
14 | 108/07/19 | 4,502,161,924 | 123,566,684,603 | 982,410 | 10,873.19 | 73.91 |
15 | 108/07/22 | 4,435,604,953 | 118,654,132,818 | 977,980 | 10,944.53 | 71.34 |
16 | 108/07/23 | 4,564,947,566 | 127,879,150,427 | 1,077,697 | 10,947.26 | 2.73 |
17 | 108/07/24 | 4,789,346,753 | 133,129,096,409 | 1,132,545 | 10,935.76 | -11.50 |
18 | 108/07/25 | 5,034,848,310 | 133,885,703,398 | 1,131,686 | 10,941.41 | 5.65 |
19 | 108/07/26 | 4,227,775,498 | 111,794,836,905 | 1,002,794 | 10,891.98 | -49.43 |
20 | 108/07/29 | 3,873,144,739 | 105,524,746,606 | 945,531 | 10,885.73 | -6.25 |
21 | 108/07/30 | 4,493,608,915 | 131,409,613,891 | 1,099,181 | 10,830.90 | -54.83 |
22 | 108/07/31 | 4,476,398,294 | 131,643,019,317 | 1,046,160 | 10,823.81 | -7.09 |
23 | 108/08/01 | 4,521,619,307 | 131,058,984,590 | 1,098,159 | 10,731.75 | -92.06 |
24 | 108/08/02 | 5,675,601,956 | 159,939,135,883 | 1,300,394 | 10,549.04 | -182.71 |
25 | 108/08/05 | 4,911,728,030 | 129,390,816,837 | 1,107,939 | 10,423.41 | -125.63 |
26 | 108/08/06 | 6,008,242,875 | 146,038,029,501 | 1,232,634 | 10,394.75 | -28.66 |
27 | 108/08/07 | 4,468,033,535 | 121,765,614,143 | 1,059,318 | 10,386.18 | -8.57 |
28 | 108/08/08 | 4,470,132,577 | 124,081,823,011 | 998,888 | 10,494.49 | 108.31 |
29 | 108/08/12 | 4,517,408,511 | 126,685,737,957 | 1,065,930 | 10,472.36 | -22.13 |
... | ... | ... | ... | ... | ... | ... |
33 | 108/08/16 | 4,700,960,825 | 120,048,343,262 | 1,133,574 | 10,420.89 | 93.76 |
34 | 108/08/19 | 4,574,050,378 | 120,476,924,084 | 1,068,019 | 10,488.75 | 67.86 |
35 | 108/08/20 | 4,542,661,753 | 121,491,792,456 | 1,070,480 | 10,522.50 | 33.75 |
36 | 108/08/21 | 3,932,448,282 | 111,080,424,760 | 1,006,299 | 10,525.80 | 3.30 |
37 | 108/08/22 | 4,396,250,909 | 123,271,367,108 | 1,072,360 | 10,529.78 | 3.98 |
38 | 108/08/23 | 3,942,656,466 | 110,007,554,049 | 947,669 | 10,538.11 | 8.33 |
39 | 108/08/26 | 4,862,207,637 | 117,049,586,345 | 1,016,154 | 10,354.57 | -183.54 |
40 | 108/08/27 | 4,120,194,542 | 123,691,150,076 | 894,549 | 10,387.23 | 32.66 |
41 | 108/08/28 | 3,597,431,879 | 102,092,710,347 | 878,572 | 10,434.29 | 47.06 |
42 | 108/08/29 | 3,866,814,680 | 104,248,701,178 | 937,813 | 10,462.43 | 28.14 |
43 | 108/08/30 | 5,323,560,006 | 148,217,313,012 | 1,199,598 | 10,618.05 | 155.62 |
44 | 108/09/02 | 4,333,278,342 | 105,848,766,031 | 981,744 | 10,634.85 | 16.80 |
45 | 108/09/03 | 4,043,809,186 | 105,576,630,318 | 949,727 | 10,558.21 | -76.64 |
46 | 108/09/04 | 4,338,123,349 | 107,093,494,944 | 972,295 | 10,657.31 | 99.10 |
47 | 108/09/05 | 6,013,120,362 | 154,662,076,294 | 1,261,814 | 10,756.93 | 99.62 |
48 | 108/09/06 | 4,827,692,321 | 131,307,111,626 | 1,107,361 | 10,780.64 | 23.71 |
49 | 108/09/09 | 4,543,925,038 | 116,733,239,498 | 1,027,773 | 10,801.14 | 20.50 |
50 | 108/09/10 | 4,475,712,468 | 121,338,149,239 | 986,052 | 10,753.58 | -47.56 |
51 | 108/09/11 | 4,310,865,154 | 119,937,917,952 | 974,736 | 10,790.35 | 36.77 |
52 | 108/09/12 | 4,330,422,356 | 120,872,609,647 | 962,901 | 10,827.55 | 37.20 |
53 | 108/09/16 | 4,390,073,832 | 119,576,475,670 | 1,005,025 | 10,898.13 | 70.58 |
54 | 108/09/17 | 4,238,580,734 | 117,546,611,937 | 1,001,017 | 10,874.50 | -23.63 |
55 | 108/09/18 | 4,380,465,735 | 130,465,246,047 | 1,113,809 | 10,929.45 | 54.95 |
56 | 108/09/19 | 4,094,709,966 | 114,671,100,910 | 922,567 | 10,894.70 | -34.75 |
57 | 108/09/20 | 4,712,806,256 | 147,979,569,707 | 1,015,743 | 10,929.69 | 34.99 |
58 | 108/09/23 | 3,976,565,745 | 106,841,123,621 | 978,964 | 10,919.02 | -10.67 |
59 | 108/09/24 | 3,872,481,764 | 109,707,784,147 | 1,013,261 | 10,918.01 | -1.01 |
60 | 108/09/25 | 3,880,868,893 | 106,259,302,170 | 954,407 | 10,873.69 | -44.32 |
61 | 108/09/26 | 3,878,756,606 | 116,018,960,126 | 945,745 | 10,871.99 | -1.70 |
62 | 108/09/27 | 4,211,145,537 | 124,771,598,230 | 1,031,089 | 10,829.68 | -42.31 |
63 rows × 6 columns
stock = get_stock_data(start_year = 2019, start_month = 7, end_year = 2019, end_month = 9)
stock.head()
日期 | 成交股數 | 成交金額 | 成交筆數 | 發行量加權股價指數 | 漲跌點數 | |
---|---|---|---|---|---|---|
0 | 108/07/01 | 4,985,631,880 | 145,664,096,932 | 1,089,572 | 10,895.46 | 164.63 |
1 | 108/07/02 | 4,295,548,703 | 120,716,164,596 | 991,072 | 10,865.12 | -30.34 |
2 | 108/07/03 | 4,246,162,907 | 112,714,237,324 | 938,659 | 10,743.77 | -121.35 |
3 | 108/07/04 | 3,797,646,624 | 98,158,438,333 | 828,014 | 10,775.90 | 32.13 |
4 | 108/07/05 | 3,400,302,424 | 86,511,212,135 | 752,681 | 10,785.73 | 9.83 |
stock.to_csv("TAIEX.csv")