2014/07/30

StockCurves 使用到的 library

StockCurves App 主要有使用到的 JavaScript library 整理如下:
(大部份應該都是採用 MIT license)


  • jQuery
    • 有 JavaScript 的網站幾乎都有使用這個 library 吧
  • jQuery Mobile
    • 當初是為了 swiper side-panel 而採用 jQuery Mobile,
      後來好像只用到了 header、footer 這些東西
      CSS 有點肥
  • Dygraphs - chart library
    • 範例齊全, 可以學到很多東西
      (自以為) 有點學習門檻,別人不易模仿 
  • Swiper & scrollbar
    • 目前最耗 Memory 的 library, 還不太會使用
      網站上的 demo 在 iPad 上很順,
      但自己寫的 App 在 android + phonegap 跑起來很頓
    • 網站上 F7 framework 中的 table row swipe & delete 的功能很吸引我 


另外有採用 awesome font, Native android UI & Flat-UI 的一些 CSS code




曾經花了不少時間評估, 但最後卻放棄的 library


  • jQuery Tool
    • Scroller 內只能放圖片
  • jQuery layout & jQuery UI
    • 直接用 jQuery Mobile 取代 
    • Tab 的部份用 swiper 取代
  • amChart - chart library
    • 沒辦法將圖畫在 Y2
    • Dygraph 繪制大量數據的圖表速度很快
  • EasySelections
    • UI 第三次大改版的時候用 Swiper 的 tab 取代
    • 從 這個 jQuery plug-in 學到不少東西


因為頻寬的關係, 我把不少 MIT library 的 library 用YUI compressor 壓成一個檔案,
不知道是否有違反 MIT licence 這些 open source 的 license? 改天要來研究看看~






2014/07/26

合併資產負債表 (Consolidated Balance Sheet ~ BSc) 的整理原則

由於 IFRS 前後的財報原則有所改變, 為了分析比較不同時期的經營狀況, 多少需要去理解財報的變動。
取得財報的來源不外有二:

  • 公開資訊觀測站; (i.e.)
  • 卷商的網頁, 通常是由精誠資訊提供的資料 (e.g. )


前者的資料齊全, 可以查到超過8年前的資料; 但是網頁整理得很 爛  不直覺, 而且前後期的財報細項名稱不一致。
後者的表格可以同時比較至多8年的資料, 表格清楚。

簡單的 PK 一下合併資產負債表 (BSc) , 光是簡表就可以看出有多個項目不同:



參考 "" 這本書, 我把公開資訊觀測站上 IFRS 前、後的細項分類整理如下:



把書中建議投資人要多注意的項目整理出來, 可以得到類似下面的表格:



呼~ 前期資料搜集的工夫就不輕鬆了。希望公開資訊觀測站可以幫忙把資料整理清楚一點, 幫助投資人做出更明智的決策。

2014/07/25

財報資料來源

自從財報改制為 IFRSs 後, 要用 Excel VBA 去批次下載財報資料變得相對麻煩。
  1. 財報資料來源網址不同;
  2. IFRSs 前、後的合併報表名詞、項目不同;
  3. 有些網頁為 UTF-8 編碼, 有的為 Big5;
    • Excel 沒辦法匯入 UTF-8 編碼的外部資料
  4. IFRSs 前的合併報表資料更新頻率不一致;
    • 2006 年以前是半年更新一次;
    • 2004 年以前是 一年更新一次;
底下是我搜集資料常用到的網址模板, 希望不會再變來變去:


'''''''''''''''''''''''''''''' IFRS 前 '''''''''''''''''''''''''''''''
'資產負債表
'http://mops.twse.com.tw/mops/web/ajax_t05st31?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=89&season=01
'
'資產負債表 (合併)
'http://mops.twse.com.tw/mops/web/ajax_t05st33?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=94&season=02
'
'損益表
'http://mops.twse.com.tw/mops/web/ajax_t05st32?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=89&season=01

'損益表 (合併)
'http://mops.twse.com.tw/mops/web/ajax_t05st34?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=94&season=02
'
'現金流量表
'http://mops.twse.com.tw/mops/web/ajax_t05st36?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=89&season=01
'
'現金流量表 (合併)
'http://mops.twse.com.tw/mops/web/ajax_t05st39?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=94&season=02
'
'
''''''''''''''''''''''''''''''' IFRS 後 '''''''''''''''''''''''''''''''
'資產負債表 (合併)
'http://mops.twse.com.tw/mops/web/ajax_t164sb03?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=102&season=01
'
'損益表 (合併)
'http://mops.twse.com.tw /mops/web/ajax_t164sb04?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=102&season=01
'
'現金流量表 (合併)
'http://mops.twse.com.tw/mops/web/ajax_t164sb05?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=102&season=01






Function GetURL1(index As String, year As Integer, urlStr)
    Select Case index
        Case "BS"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st31?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "2012 IFRS 前才有 BS 資料"
                Debug.Print "Error in Case BS"
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st31?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            
            End If

            
        Case "BSc"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st33?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t164sb03?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            End If
            
            

        Case "IS"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st32?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "2012 IFRS 前才有 IS 資料"
                Debug.Print "Error in Case IS"
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st32?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            
            End If
        
        Case "ISc"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st34?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t164sb04?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            End If
                    
        Case "CF"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st36?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "2012 IFRS 前才有 CF 資料"
                Debug.Print "Error in Case BS"
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st36?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            End If
            
        Case "CFc"
            If year < 2013 Then
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t05st39?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            Else
                urlStr = "http://mops.twse.com.tw/mops/web/ajax_t164sb05?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=[STOCK_ID]&year=[YEAR]&season=[QUARTER]"
            End If
            
        Case Else
            urlStr = "index 必需為 BS/BSc/IS/ISc/CF/CFc"
            Debug.Print
            
    End Select

End Function