北美半導體BB ratio的官方公布網站為:http://www.semi.org/en/MarketInfo/Book-to-Bill/
由於它本身也提供歷史資料PDF檔(上圖編號1號)下載,所以其實無需搜尋其它統整資料庫(FRED沒有),或從經建會網站也可以找到,因為它是台灣領先指標成份之一。
使用PDF檔第一次要手動建立,之後可以手動更新或寫VBA以達One click更新(因為我個人比較懶)。
由上圖編號2處,每次BB ratio公布時,網站會更新連結,依網址觀察以外部人而言似為亂數產生,因此無法以Web Query擷取資料。因此當我們使用VBA引用IE browser載入頁面後,必須針對網頁元素做輪巡並判斷特徵文字;特徵文字我個人採用「 Press Release」,Press之前有一個空白。使用Browser搜尋功能可以找到兩筆資料,分別是編號1與編號2,因為我們要找的是編號2,其順序在編號1之前,因此會先找到,可以在找到後中止輪巡。
其程式碼片段如下(最前面為行編號,非程式碼):
1 For Each e In ie.document.getElementsByTagName("A")
2 If e.innertext Like "* Press Release" Then
3 ie.navigate e.href
4
5 While ie.readystate <> 4 Or ie.busy
6 Wend
7 Exit For
8 End If
9 Next
內容步驟解析如下:
1.第一行輪巡網中所有為Anchor的元素(亦即含有超連結的部份)
2.第二行判斷Anchor所外顯於網頁的代表文字是內含 xxx Press Release
3.第三行若找到內含 xxx Press Release的文字,取得其隱含之超連結並使用Browser前往
4.第五行與第六行等待網頁載入完成
5.第七行為載入完成離開輪巡過程
當我們取得超連結前面該頁面,並分析其頁面內容,其中關鍵數據在該頁面唯一的表格中,因此事情較為簡單,取得表格,並依序輪巡其中各格裡的數字即可。
程式碼片斷:
1 Dim t As Variant
2 t = ie.document.getElementsByTagName("table")
3 rowCnt = Worksheets("BB data").UsedRange.Rows.Count
4 cellsCnt = t.Cells.Length
5 newDate = DateAdd("m", 1, Worksheets("BB data").Cells(rowCnt, 1).Value)
6
7 If (Worksheets("BB data").Cells(rowCnt, 4).Value <> t.Cells(cellsCnt - 1).innertext) Then
8 Worksheets("BB data").Cells(rowCnt, 3).Value = t.Cells(cellsCnt - 7).innertext
9 Worksheets("BB data").Cells(rowCnt, 2).Value = t.Cells(cellsCnt - 6).innertext
10 Worksheets("BB data").Cells(rowCnt, 4).Value = t.Cells(cellsCnt - 5).innertext
11 ' ignore t.Cells(cellsCnt - 4), because it's the date
12 Worksheets("BB data").Cells(rowCnt + 1, 1).Value = newDate
13 Worksheets("BB data").Cells(rowCnt + 1, 3).Value = t.Cells(cellsCnt - 3).innertext
15 Worksheets("BB data").Cells(rowCnt + 1, 2).Value = t.Cells(cellsCnt - 2).innertext
16 Worksheets("BB data").Cells(rowCnt + 1, 4).Value = t.Cells(cellsCnt - 1).innertext
17 End If
其步驟內容為:
1.第一行宣告一個變數t為Variant資料型態
2.第二行將網頁Table內容放入t
3.第三行取得我原本建立的Excel工作表資料的最後一筆的行數
4.第四行取得網頁表格中所有格數,以上圖為例其數字應為32格
5.第五行若此表格含有新資料,我會新增一筆較歷史資料最近一筆,其日期為增加一個月(使用DateAdd函數)
6.第七行中t.Cells(cellsCnt - 1).innertext代表0.88這一格,因為t.Cells元數編號是由0到31共32個;我會判斷0.88這一數值是否已存在我的資料裡,藉此偵測是否為新資料(若前後月相同則此程序會無法更新),不使用日期判斷純粹偷懶,有興趣的朋友可以自己試試其它方式
7.第八行至第十行就是將Bookings/Billings/Ratio修正值蓋過工作表最後一筆的資料
8.第十一行至第十六行則是新增至工作表資料最後一行
完成的結果就像下圖:
而上述資料就可拿來做研究使用,例如個人先前的文章:BB ratio與台積電的研究(http://www.wretch.cc/blog/JaguarCSIA/16219084)
P.S以上程式內容若有上過Tivo大的VBA課程應該不會太難理解,有疑問多討論。
(本文內容並非任何型式之投資建議,內容謹供個人研究心得,任何投資決策應自行衡量風險,妥善理財,本文作者及本部落格不負任何盈虧之責!)
留言列表