2017年3月21日 星期二

閱讀筆記-區塊鏈革命

摘要筆記:
2008年,中本聰藉由一篇未在學術期刊上發表的論文,將比特幣帶到這世界上。經由2013年12月1日,比特幣每盎司價格首度超越黃金價格,比特幣為世人證明了不須中介,也能達成價格傳遞的可能性。即便比特幣價格的高波動性仍不能作為貨幣的作用,也達成了一定的貢獻,就是區塊鏈。

解釋區塊鏈的涵義,如同本書作者與Melanie Swan的定義:
比特幣與區塊鏈包含三個層次,區塊鏈底層技術、協議與加密數位貨幣。
區塊鏈技術是點對點通訊技術與加密技術的結合,本質上是一個去中心化的分散式帳本數據庫。可以在這個數據庫上發展多種應用,然而,應用都需要透過協議來達成共識機制來實現功能。最後,才能實現完全去中間化的點對點互動。

可應用的範圍如下
1.金融商品創新
各類金融商品皆是參與雙方的協議,如貨幣、債權、股權等。可以透過協議建立共識機制,來產生完全創新之金融商品,即是智慧合約。
優勢:

  • 自動執行協議功能
  • 執行成本降低
  • 執行效率提升
  • 高透明性
  • 高安全性

智慧合約的出現,將會威脅部分原本金融中介的組織。
2.金融基礎設施的變革
區塊鏈本身即數據庫,每個節點皆可驗證帳本真實性與完整性,降低系統的信任風險。
優勢:

  • 開放性
  • 可追朔性
將可運用在徵信、審計、資產確認等議題,提高金融效率。

3.智慧物聯網
可應用於物聯網之數據處理與系統維護,管理上百億個物聯網設備的身分、支付與維護。
優勢:

  • 延長產品生命週期
  • 降低物聯網成本

4.共享經濟的技術基礎
可繼續優化電子支付成本,極低金額的消費型態也能應用於電子支付中。
優勢:

  • 降低支付成本


 另一個角度思考區塊鏈

1.資料庫
公共資料庫,紀錄網路之間的交易資訊,隨時更新,讓每個用戶經由合法手段更改資料、寫入資料,卻有一套特殊機制,防範過往資料造到竄改。
2.分散式系統
不存儲在特定伺服器,而是儲存在網路上的完整節點,每一節點皆有備份。
3.網路底層協定
在協定上開發多重應用,每一時刻皆保存最長的工作量證明鏈,作為共同認可的交易紀錄,無須權威中介,直接進行點對點的交換資訊。

其他數位貨幣

比特幣為區塊鏈最早應用形式-數位貨幣,除比特幣之外,仍有數百種貨幣。以下為除比特幣之外的前三貨幣。
1.以太坊(Ethereum) 一種平台與程式語言
可由使用者透過"合約"的機制來實現自己設計的特性。
2.瑞波幣Ripple
引入閘道系統,可用法定貨幣來兌換Ripple,並將Ripple抽離網路,並擔任借貸雙方橋梁
3.萊特幣 Litecoin
更快的交易確認、發行量是比特幣的四倍、更適用GPU挖擴

金融業的商業應用

1.證券方面
為金融交易帶來高透明度、高安全性、降低欺詐風險、提升效率、減少成本。
2015/12/30 NASDAQ完成基於區塊鏈的證券交易平台
2.登記結算機構
完全可被取代
3.商業銀行應用
3.1點對點交易
基於P2P的跨境支付、貿易結算、金融商品的買賣
3.2登記
作為可靠資料庫,防治反洗錢的客戶身分資料與交易紀錄
3.3確權
資產所有權的真實性驗證與轉移
3.4智慧管理
利用智慧合約自動檢測是否具備生效的各種環境,例如:自動配息、分紅
4..會計審計應用
公司內部交易皆可集中紀錄在內部區塊鏈,因有不可逆與時間郵搓,外部審計人員可即時追蹤公司帳本

R3 CEV組成區塊鏈聯盟的目標:
建立一個全球的去中心化即時結算清算系統。
大幅降低跨境支付成本、因為即時清算,也降低對手風險

R3運作
技術供應商:以太坊、IBM、intel、Eris industries、Chain
每個技術供應商可以跟參與測試銀行進行小規模合作,每次測試後,所有R3聯盟之銀行皆能共用測試成果,即便沒參與測試之銀行。

R3目前成果
針對商業票據、大型企業所使用短期債券證券等,參與銀行可模型化金融資產、商業票據和短期債務工作,可以進行創建、購買、出售與贖回。

Hyperledger
由Linux基金會於2015年創立,為一個促進區塊鏈技術與交易驗證的開源專案。目標為發展一個跨行業的開放式標準以及原始程式碼開發庫,允許企業創建自訂的分散式帳本解決方案,促進區塊鏈技術的商業應用。

目前商業銀行的探索區塊鏈方式

  • 成立內部實驗室
  • 投資金融科技公司
  • 與新創公司合作


金融科技帶來的最大影響
滿足過去金融機構所無法實現的需求,服務了未曾被服務的客戶,降低金融門檻,使得普惠金融成了可能。

區塊鏈發展的最大威脅

  • 如何讓清算所、交易所和經紀公司同意新系統?
  • 如何對目前營利造成衝擊?
  • 監管問題如何解決?
  • 許多金融中介商如何生存?


2017年2月16日 星期四

資產配置研究-Generalized Momentum and Flexible Asset Allocation (FAA)

本文為筆者紀錄研究資產配置系列論文所做之筆記,提供各位讀者作為參考,也能互相交流關於多元資產配置上的量化策略。

Generalized Momentum and Flexible Asset Allocation (FAA)
Wouter J. Keller and Hugo S.van Putten (FlexCapital) 
December 24, 2012, draft v0.98
  • 摘要
    FAA模型是作者Keller一系列關於資產配置交易策略的第一篇研究,作為日後作者開發多者配置模型的基礎,FAA模型的基本核心理論就是以市場中常見的動能現象與趨勢交易。在原有相對動能策略下,增加其餘三個因子,絕對動能因子、波動性因子與相關性因子進入模型,以簡單線性關係式,計算出每月每種資產的綜合參數後,決定當月進場交易的資產與權重。
    本篇研究作者以七種資產來進行回測,回測期間自1998-2012年,並分成兩種樣本期間,以避免產生資料窺探偏誤。
  • 理論基礎
    1. 動能現象:
    即過去一段期間股價相對強勢或弱勢的資產,在未來期間會有續漲、續跌的現象發生,通常觀察期的期間是6個月或12個月。
    在強勢資產上,我們考慮買進,反之,弱勢資產則放空,此處可參考Faber (2007 and 2010)、Antonacci (2012)的研究。

    2.移動平均異常(moving averages anomaly):
    此處是指目前價格在過去一段觀察期的移動平均成本價格之上的資產,是相對可買進的。反之,目前價格在過去一段觀察期的移動平均成本價格之下的資產,是不建議買進的。此處觀察期通常是10個月或200個交易日。

    上述兩個現象即是Faber的TAA模型基礎,其優勢在於簡易性,直接使用月報酬價格既可計算,持有期僅一個月,每月更換投組。

    Keller 的FAA模型,則是以第一項動能現象為基礎,在線性模型中加入其餘三個因子來計算各項參數得分,每次則選擇得分前三低者均權持有。

    1.相對報酬R:
    以各項資產過去觀察期的累計報酬率,高到低排序
    2.絕對報酬A:
    若資產報酬小於0或小於無風險利率,則不納入投組之中
    3.波動性V:
    以各項資產過去觀察期的波動率,低到高排序
    4.相關性C:
    以各項資產過去觀察期的月報酬率,低到高排序


    接著,利用一個簡單線性模型,給予三項因子(R,A,C)加權分數

    加權分數 = 1*R+0.5*A+0.5*C

    此處直接給定1和0.5的權重,是為了避免參數過多而導致量化策略常發生的最佳化偏誤,所謂最佳化偏誤,就是在交易策略中若含有過多的參數,我們常常會為了找出回測歷史上最佳績效的參數組合,而過度調整參數權重,而往往在未來並不會有更好報酬,因為過去歷史最佳參數,不代表未來最佳參數。
  • 數據樣本
    1.資產種類:
    七個樣本資產來自於美股ETF,有三種股票型ETF (VTSMX, FDIVX, VEIEX)、兩種美債ETF(VFISX, VBMFX)和商品型與不動產型ETF(QRAAX, VGSIX),此處QRAAX已清算,歷史數據在yahoo finance上已無法下載。故也可以下七種ETF來回測近期績效(eg. VTI, VEA, VWO, SHY, BND, GSG, and VNQ)
    2.期間
    1997-2012 (分兩期間1997-2005、2005-2012)
    3.採用日收盤價與美元計價
  • 實際回測(以2005-2012期間比較)
    1.作者結果
    年化報酬率:14.7%
    年化波動率:9.2%
    報酬/風險比:1.6
    最大回檔率: 7.4%


    2.筆者驗證
    年化報酬率:10.1%
    年化波動率:9.7%
    報酬/風險比:1.03
    最大回檔率: 10.37%

    3.筆者驗證(1998/6-2016/6)
    年化報酬率:7.9%
    年化波動率:8.9%
    報酬/風險比:0.88
    最大回檔率: 16.68%
  • 結論
    筆者以R進行回測,在2005-2012期間走勢類似,但在近期效果漸差,回撤率擴大,風險比也不如以往,推測原因可能是來自於本技術做為Keller技術之基礎,在2012年公開,已廣為資產配置型投資人所知,策略效果漸失效。

    正所謂「沒有永遠有效的策略,只有不斷改進、修正的策略。」
    Keller後續推出的系列論文,便是在FAA的基礎上不斷改進,後續筆者陸續回測後,將持續將筆記紀錄於此。
  • 參考來源
    1.FAA
    Systematic investor's Blog
    QuantStrat TradeR
    2.TAA
    Meb Faber Reserach



2017年2月2日 星期四

R學習筆記 - package安裝出現錯誤,無法正常載入


  • 問題描述:
    有時候我們使用R package的時候,常用的package會突然出現問題,譬如說會發現常用的package突然找不到,重新安裝之後。即便已出現安裝成功的訊息,卻無法再Rstudio的右方列找到,此時require package 可能會發現出現以下錯誤訊息
    > install.packages("zoo")
     Installing package(s) into ‘C:/Users/U122337.BOSTONADVISORS/Documents/R/win-library/2.15(as ‘lib’ is unspecified)
     --- Please select a CRAN mirror for use in this session ---
     trying URL 'http://cran.cnr.Berkeley.edu/bin/windows/contrib/2.15/zoo_1.7-10.zip'
     Content type 'application/zip' length 874474 bytes (853 Kb)
     opened URL
     downloaded 853 Kb
    
     package ‘zoo’ successfully unpacked and MD5 sums checked
     Warning: cannot remove prior installation of package ‘zoo’
    
    The downloaded binary packages are in
        C:\Users\U122337.BOSTONADVISORS\AppData\Local\Temp\Rtmp404t8Y\downloaded_packages
  • 解決方案:
    1.先使用 .libPaths() 找出你安裝R package的路徑,會出現兩個路徑,確認第一個路徑中是否有你無法使用的package,將之刪除。
    2.刪除時,記得將所有R關閉。
    3.此時再重啟R,重新安裝便可解決上述問題,正常載入R package
  • 參考連結:

    R not finding package even after package installation

2017年1月15日 星期日

R學習筆記 - 資料工程篇(四) Database

#註: 本篇筆記諸多內容直接紀錄課程原文,而本文也僅整理資訊之用途。
課程連結 : R語言翻轉教室

本次課程連結

RDataEngineer-04-Database
資料庫(Database)泛指能夠儲存資料的檔案櫃。使用者可以對檔案中的資料進行:新增、擷取、更新和刪除。

本次介紹如何使用R 語言透過DBI和其系列套件為例,操作關聯式資料庫。而這裡我們以SQLite這套精巧的關聯式資料庫系統為例。

值得注意的是,如果直接用R大量的撈取線上資料庫,是有可能影響資料庫的效能的。所以如果在實務使用時,最好是先知會與請教負責資料庫系統的同仁。

目前在市面上,有許多的SQL 資料庫,但是在R 中操作起來,都是非常類似的。因為R 都是透過DBI 套件所定義的函數,讓使用者操作資料庫。

主要使用R套件 : RSQLite
它是R與SQLite資料庫之間的橋樑。專業的術語叫:「客戶端」(Client)


資料庫基本操作介紹

1.資料庫連線
1.1 dbDriver("SQLite") : 取得連接SQLite 資料庫的方式
1.2 db  = dbConnect(drv, db_path)
1.3 dbDisconnect(db) : 中斷連線
drv = 連接方式
db_path = 資料庫的檔案
db = 這個資料庫在R 的代理人,通常都要把`db`這個物件當成函數的參數之一。在DBI的文件中會把`db`這種角色的物件記載為:`connection`

2.寫入資料
2.1 dbWriteTable() :  把數據寫入SQL 資料庫之中

#範例
dbWriteTable(db, "lvr_land2", lvr_land)
db = 這個資料庫在R 的代理人
lvr_land2= SQLite資料庫的表格
lvr_land =資料框 

#查詢如何將資料框寫入資料庫的語法: 
help("dbWriteTable,SQLiteConnection,character,data.frame-method")

R 的大部分的資料庫套件,在`dbWriteTable`函數中都會提供`append`和`overwrite`兩個參數。`overwrite = TRUE` 時,R 會自動把撞名的表格刪除,並且寫入新的資料。`append = TRUE`時,R會把我們要寫入的資料,接在撞名的表格之下。


3.讀取資料

3.1 dbReadTable(db, "lvr_land2") : 讀取名為lvr_land2的資料庫表格
3.2 dbListTables(db): 可以列出目前已經以db連接方式存在於資料庫的表格。
3.3 all.equal() : 檢視兩資料框是否一致,主要用於驗證資料
型態改變這件事情,其實是可大可小的。在大部分的狀況下,例如建立統計模型、製作圖表,factor、字串(character)的互換並不會帶來太大個困擾。但是在某些很不常見的狀況下(如`strsplit`在遇到factor的時候會出錯),可能會導致程式出錯。

#進階讀取資料方式: 透過下列函數直接執行SQL語句
3.4 dbGetQuery():
會解析SQLexpression,並且依照指令進行資料庫的操作後,再把結果直接回傳給R。
3.5 dbSendQuery() :
#範例
rs <- dbSendQuery(db, "SELECT * FROM iris")

`dbSendQuery`函數則會先把結果儲存於rs物件中,再由使用者一段一段的取出。我們可以利用`fetch`方法,一次拿一點資料出來。請同學試試看:`fetch(rs, 1)`每次執行`fetch`指令時,R就會「依照順序」把結果一個又一個的回傳給使用者。如果使用者每次想多拿一些資料,則可以使用第二個參數,如:`fetch(rs, 100)`一次取出100筆資料。

#技巧
`dbSendQuery`和`fetch`的技巧在使用R 處理「大量資料」,是非常有用的。尤其是當資料量「超過記憶體」時,運用資料庫來優化在硬碟上處理資料的效能,是很有效率的方式。


3.6 dbClearResult(rs) : 不需要再使用`rs`物件時,就刪除它

5.刪除資料
5.1 dbBegin(db) : 來開啟一個Transaction
5.2 dbRemoveTable(db, "CO2") : 來刪除"CO2"表格
5.3 dbRollback(db) :
把資料庫的狀態復原至我們執行`dbBegin(db)`的時間點
5.4 dbCommit(db) : 讓dbBegin(db)後的所有變更生效。
(跟dbBegin(db)要成對出現)

運用外部資源(如資料庫、如檔案系統)處理資料時,最害怕的狀況是被意外中斷。當我們正在寫入資料庫時,意外的中斷就會帶來以下的困擾。當我們排除意外的原因,要繼續工作時,就會問:目前資料庫的狀態,是「還未寫入」、「寫到一半」還是「寫入完畢」。「還未寫入」的狀況下,我們只要重新執行程式即可。而「寫入完畢」的話就更棒了,我們只要繼續後續的工作。但若是「寫到一半」的狀態,要接著工作就會非常麻煩(可能要改程式碼)。

#觀念
Transaction就是一種保證資料庫的狀態一定是「還未寫入」或是「寫入完畢」的機制。


在R 裡面,我們可以利用`dbBegin(db)`來開啟一個Transaction。勿刪檔案時,除了中斷連線,我們也可以主動使用`dbRollback(db)`指令把資料庫的狀態復原至我們執行`dbBegin(db)`的時間點。

#技巧
當我們開始`dbBegin(db)`之後,所有的變更,都要等到我們執行`dbCommit(db)`才會生效。這招在寫入大量數據時,也是很重要的技巧。這個技巧可以保證我們的「資料正確性」。

2017年1月13日 星期五

25歲,11件我該做的


希望30歲的我回頭看這段,心裡是踏實的。
改寫自一網路文章,將21件事精簡成我自己版本的11件事,這樣的靈感只是來自於某夜徬徨的自己搜尋了,25歲

人生

  1. 列出人生中必做不可的「待辦事項」,開始一項項完成,現在開始
  2. 以追求進入業界最高評價領先的團隊為目標,學習、歷練專業技能
  3. 不害怕品嘗跌到谷底的感受
財務
  1. 問自己理想的生活方式,設定好目標後,再挑選合適的投資工具 
  2. 一切都得從「存錢」做起,存錢,從「記帳」開始
  3. 投資謹記「自律」與「耐心」 
生活
  1. 建立生活的秩序,作息、飲食、運動的紀律與均衡
  2. 專注當下,從做好每一份工作開始
  3. 每天學習,一半靠好奇心,一半靠自律
  4. 斷捨離的生活方式,不追求於冗餘的事物
  5. 盡可能讓生活豐富。將人生平分成家庭、工作、經濟、健康、智慧,讓自己在每個面向不斷延伸


2017年1月5日 星期四

R學習筆記 - 資料工程篇(三) JSON

#註: 本篇筆記諸多內容直接紀錄課程原文,而本文也僅整理資訊之用途。
課程連結 : R語言翻轉教室

RDataEngineer-03-JSON

JSON (JavaScript Object Notation) 在網際網路上已經是最廣泛使用的格式之一,尤其常見於各種傳遞資料的API之中。舉例來說,台北的Youbike的API資料、甚至是Facebook上的API資料,都是以JSON格式傳輸。

#JSON物件範例 - 臉書錯誤訊息

{
   "error": {
      "message": "An active access token must be used to query information about the current user.",
      "type": "OAuthException",
      "code": 2500,
      "fbtrace_id": "EkWgGmWkEt2"
   }

}


從畫面上,我們可以簡單看到整個訊息的前後分別有`{`和`}`,這代表整個訊息就是一個JSON物件。每個物件中則包含一對一對的「名稱」與「值」的組合。舉例來說,整個訊息的JSON物件中,只有一對名稱與值的組合:名稱是:"error",值則是另一個JSON物件。


主要使用R套件 : jsonlite
把一個JSON文件轉換成R 的list


在Vignettes的第一段很清楚的說明jsonlite的功能:R 和JSON物件之間能在不損失資訊的狀況下轉換。而作者也馬上給了一個簡單的範例:使用jsonlite提供的`toJSON`和`fromJSON`,可以完整的還原一個R的data.frame。這種方式,是驗證轉換過程中是否有遺失資訊的一種方式。


範例中所使用的`all.equal`是一種用來驗證程式碼正確性時,常常使用的工具。它會一字不漏的比對兩個R 物件,必需要一模一樣才會回傳`TRUE`,否則會回報不一致的理由。


文件的第二段描述jsonlite在把JSON物件轉換成R 物件時,會自動嘗試把JSON物件轉換成更適合的物件。舉例來說,`["Amsterdam", "Rotterdam", "Utrecht", "Den Haag"]`如果直接轉換,可能會變成一個長度為4 的list,而每個元素都是長度為1 的字串向量。


#範例: 
fromJSON( 物件 , simplifyVector = TRUE )
simplifyVector = TRUE ,JSON物件啟用自動轉換。

jsonlite的vignettes後面的段落仔細的介紹處理JSON的細節,建議是先把作者提供的vignettes讀過以後,能省掉很多找bug的 時間。



#作業:

1.list清單中呼叫其迭代之清單list,可使用連續$方式直接呼叫,如下
youbike1$result$results$sbi



#後記 :
在安裝套件過程中,不知名原因無法順利安裝jsonlite套件,這時還是只能依靠Google大神的幫助,這次十足感受到直接使用英文搜尋問題的效率。未來遇到程式問題,直接使用英文描述問題或複製貼上錯誤訊息,都能有效率在社群找到解答。 有時候會不自覺先搜尋中文訊息,但其實英語系的搜尋結果更多、社群互動更熱絡,自然很容易得到解答。


以下紀錄搜尋要訣:
1.
直接使用英文描述問題或複製貼上錯誤訊息

2.首選社群討論串、如stack overflow等討論串
3.直接觀看官方文件、套件說明文件
4.社群發問要點 : 
4.1.記錄自己的R版本
sessioninfo() 

4.2 紀錄使用套件版本
packageVersion()
4.3說明使用作業系統環境
5.查詢封包是否有長文件說明(以網頁的形式,而非pdf的形式呈現給使用者。)
vignette()