絕不投資財報令人看不懂的公司。
巴菲特
開一個table來放EPS.
年,季(放1,2,3,4),公司代號,公司名稱,EPS
import sqlite3
conn = sqlite3.connect('revenue.db')
c = conn.cursor()
c.execute('''CREATE TABLE eps
(yr real, qr real, cpyid text,cpyname text, eps real
)''')
conn.commit()
把今年第一季寫入
在昨天的基礎上,加一些insert sql
import urllib.request
from bs4 import BeautifulSoup
url = 'http://mops.twse.com.tw/mops/web/ajax_t163sb04?'\
'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=102&season=01'
response = urllib.request.urlopen(url)
html = response.read()
sp = BeautifulSoup(html.decode('utf8'))
tbls=sp.find_all('table',attrs={ 'class' : "hasBorder"})
#print(tbls)
for tbl in tbls:
ths=tbl.find_all('th')
#print(ths)
i=0
j=0
for th in ths:
i=i+1
if "每股盈餘" in th.get_text():
#print(i,ths[i-1].get_text())
j=i
trs=tbl.find_all('tr',attrs={ 'class' : "even"})
for tr in trs:
tds=tr.find_all('td')
print (tds[0].get_text(),tds[1].get_text(),tds[j-1].get_text())
epslist=(102,1,tds[0].get_text(),tds[1].get_text(),float(tds[j-1].get_text()))
c.execute('INSERT INTO eps VALUES (?,?,?,?,? )', epslist)
trs=tbl.find_all('tr',attrs={ 'class' : "odd"})
#print(trs)
for tr in trs:
tds=tr.find_all('td')
print (tds[0].get_text(),tds[1].get_text(),tds[j-1].get_text())
epslist=(102,1,tds[0].get_text(),tds[1].get_text(),float(tds[j-1].get_text()))
c.execute('INSERT INTO eps VALUES (?,?,?,?,? )', epslist)
conn.commit()
測一下寫入是否正常,
將第一季的eps之王,排序出來。
for row in c.execute('SELECT * FROM eps order by 5 desc') :
print (row)
output:(節錄)
(102.0, 1.0, '5534', '長虹', 19.72)
(102.0, 1.0, '3673', 'F-TPK', 14.19)
(102.0, 1.0, '3008', '大立光', 13.79)
(102.0, 1.0, '2548', '華固建設', 11.32)
(102.0, 1.0, '2357', '華碩', 8.04)
(102.0, 1.0, '2542', '興富發', 6.45)
(102.0, 1.0, '5264', 'F-鎧勝', 5.24)
(102.0, 1.0, '2474', '可成科技', 5.22)
(102.0, 1.0, '2727', '王品', 4.69)
(102.0, 1.0, '2059', '川湖', 4.4)
(102.0, 1.0, '2227', '裕隆日產', 4.27)
(102.0, 1.0, '2207', '和泰汽車', 3.86)
和財報狗比對一下,第一季長虹真的是19.72,第二季是-0.96,所以筆者沒抓錯。
**url = 'http://mops.twse.com.tw/mops/web/ajax_t163sb04?'\
'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=102&season=01'**同理,第二季就把season改成02即可,第三季目前還沒出來,出來season再改成03。
就不佔篇幅了。
馬上來看一下累計EPS排行
for row in c.execute('SELECT * FROM eps where yr=102 and qr=2 order by 5 desc') : #order by 5 desc
print (row)
output: 節錄
(102.0, 2.0, '3008', '大立光', 28.96)
(102.0, 2.0, '3673', 'F-TPK', 23.77)
(102.0, 2.0, '5534', '長虹', 18.73)
(102.0, 2.0, '2357', '華碩', 14.37)
(102.0, 2.0, '2008', '高興昌', 13.12)
(102.0, 2.0, '2548', '華固建設', 10.93)
(102.0, 2.0, '2227', '裕隆日產', 10.2)
(102.0, 2.0, '2474', '可成科技', 10.07)
(102.0, 2.0, '5264', 'F-鎧勝', 9.02)
(102.0, 2.0, '2727', '王品', 8.07)
(102.0, 2.0, '2454', '聯發科', 7.8)
(102.0, 2.0, '2542', '興富發', 7.56)
(102.0, 2.0, '2059', '川湖', 7.55)
(102.0, 2.0, '2207', '和泰汽車', 6.91)
(102.0, 2.0, '2707', '晶華酒店', 5.85)
(102.0, 2.0, '3454', '晶睿', 5.81)
(102.0, 2.0, '1590', 'F-亞德', 5.01)
覺得看累計EPS比較符合一般的看法,一季一季拆開看反而比較不一般。
所以就不還原成單季EPS了!!這也是另一個練習題
小結:這個版本不做成for迴圈版,之後每一季過時,小改一下就可以用了。而歷史資料再用迴圈來寫。eps可以做成兩個表,一個是累計eps, 一個是季別eps, 想看單季,或看累計直接抓即可。