Automated Prosper Investing with ProsperBot

Michael Lynch

用 ProsperBot 自動化 Prosper 投資

總覽

我從 2014 年開始透過一個名為 Prosper 的網站投資 peer to peer lending(P2P借貸)。我覺得 peer to peer lending 是個很不錯的點子,有機會帶來豐厚的報酬。

一開始,我都是手動挑選每一筆貸款投資,但隨著時間過去,我打造了一個名為 ProsperBot 的借貸機器人,將整個流程自動化,讓它自動幫我投資。

在這篇部落格文章中,我會簡要介紹 peer to peer lending,並逐步說明打造 ProsperBot 的過程。

什麼是 peer to peer lending?

想像一下,Alice(愛麗絲)想借 3,000 美元,分 5 年償還。按照傳統做法,愛麗絲最好的選擇是向銀行申請貸款。銀行借給她 3,000 美元,如果愛麗絲按時還款,銀行就能透過利息和手續費賺錢。如果她無法償還,銀行就必須承擔損失。

透過 peer to peer lending,愛麗絲只要前往 P2P 中介平台(例如 Lending Club 和 Prosper)。中介平台本身不出資,而是將這筆貸款提供給投資人。投資人 Bob(鮑勃)、Charlie(查理)和 Danica(丹妮卡)可以各自以 1,000 美元買下愛麗絲這筆貸款的一部分。愛麗絲每個月向借貸網站付款,借貸網站再將愛麗絲付款金額的三分之一分別分配給鮑勃、查理和丹妮卡。

背後的理論是,透過省去銀行這個中間人,借款人能取得比傳統貸款更優惠的利率,而投資人(出借人)也能比把錢存在銀行的儲蓄帳戶或定存獲得更高的利息。若想更深入了解 peer to peer lending,像 Lend Academy 這類網站是很棒的資源。

什麼是 ProsperBot

要在 Prosper 上投資 P2P 貸款,投資人可以在 Prosper 網站上手動挑選貸款,但 Prosper 也為開發者提供了公開 API,可自動進行投資。

我選擇走 API 途徑,開發了 ProsperBot,這個借貸機器人會持續搜尋 Prosper 上的新貸款,並在符合特定條件時自動投資。它還包含一個網頁儀表板,可顯示 ProsperBot 目前的狀態以及我的 Prosper 帳戶一段時間以來的活動紀錄:

ProsperBot 螢幕截圖

如圖所示,自 4 月以來,隨著 ProsperBot 收到貸款還款並將現金再投資到新貸款,我的帳戶價值穩步上升。從 10 月開始,我的帳戶總值開始下降,因為我已開始從 Prosper 帳戶提領資金。

逐步拆解

ProsperBot 由幾個不同的部分組成,我已繪製如下:

ProsperBot 架構

gofn-prosper (Go Forth ’n Prosper)

gofn-prosper 是 Prosper 公開 API 的 Go 語言綁定。它將 Prosper API 的細節從應用程式的其餘部分抽象出來,因此若要執行例如購買 Prosper 票據這類操作,應用程式只要這樣做即可:

client.PlaceBid(prosper.BidRequest{
  ListingID: 5492410,
  BidAmount: 25.0,
})

這可能是本專案中對其他人而言最有趣的部分,因為它完全獨立於 ProsperBot。任何有興趣用 Go 撰寫與 Prosper API 互動的應用程式的人,都可以在自己的應用程式中重複使用這個函式庫。

ProsperBot

ProsperBot 是建構在 gofn-prosper 之上、實際在 Prosper 上執行動作的應用程式。ProsperBot 會持續輪詢 Prosper 伺服器,以:

  • 查詢新釋出的貸款
  • 投資符合投資條件的貸款
  • 偵測 Prosper 帳戶狀態的變化(例如現金餘額變化、帳戶總值變化)
  • 偵測票據的更新(收到還款、票據狀態變更)

ProsperBot 將所有狀態儲存在 Redis 資料庫中。

這部分不如我期望的那麼完善(程式碼有些取巧、文件也不夠完整),但我主要將其公開作為 gofn-prosper 的使用範例。

ProsperBot Frontend

ProsperBot Frontend 是一個 AngularJS 網頁應用程式,用於顯示 ProsperBot 的狀態(如上方截圖所示)。它使用 nginx 來處理靜態資源的請求(例如 HTML 檔案、圖片),並使用自訂的 Go 伺服器來處理動態內容的請求。Go 伺服器使用與 ProsperBot 相同的 Redis 資料儲存來回應這些動態請求。

部署 ProsperBot

ProsperBot 包含多個不同的元件,並對主機系統有所依賴(Go、nginx 等)。為了簡化 ProsperBot 的部署流程,我撰寫了幾個 Ansible 角色:

這樣拆分後,就可以將 ProsperBot、ProsperBot Frontend 和 Redis 各自部署在不同的機器上。我個人是將所有元件都安裝在同一台伺服器上(此做法的 Ansible playbook 範例可參考 GitHub README 範例)。

對 Prosper 的看法

整體而言,ProsperBot 是個不錯的學習經驗,但我不推薦將 Prosper 作為投資策略。原因有幾個:

  • 小規模投資無利可圖:我從 Prosper 獲得約 9% 以 XIRR 為基準的投資報酬率,乍聽之下還不錯,來自 P2P 借貸的收入會被視為一般所得課稅,這會比股票這類較傳統的投資吃掉更多報酬。這也讓我的報稅變得複雜,必須聘請稅務會計師,而無法使用現成的報稅軟體,因此每年要從獲利中扣除 600 美元(約占 16,000 美元投資的 4%)。
  • 難用的 API:Prosper API 本身設計得不好。例如,它採用權杖驗證(優點),並為應用程式開發者分配客戶端 ID 和密鑰,而非使用者名稱/密碼,卻又要求所有驗證都必須提供使用者名稱和密碼,導致客戶端 ID 和密鑰形同虛設(缺點)。我也注意到 API 會提供不合理的資料,例如票據出現負數還款,這在正式的投資 API 中根本不應該發生。
  • 開發者支援不佳:2015 年,Prosper 對其 API 進行了全面改版(之前的 API 甚至更糟),卻告知開發者只有一個月的時間切換到全新的 API,否則舊系統就會關閉。要求所有 Prosper 客戶端開發者放下手邊工作、在一個月內重寫所有程式碼,是相當蠻橫的做法。更糟的是,新 API 錯誤百出,以至於 Prosper 在迫使所有客戶端匆忙趕上一個月期限後,不得不將舊版 API 的使用期限再延長三個月。
  • 對散戶投資人的興趣降低:Prosper 似乎更專注於銀行等機構投資人,而較少關注個人散戶投資人。在這方面最重大的舉措是在 2016 年 9 月,Prosper 宣布使用者將無法再在次級市場上出售貸款。這是一項重大的條款變更,因為它讓投資人無法清算其 Prosper 持倉,所以現在我在未來 5 年內都得被 Prosper 綁住(並承受相關的稅務麻煩)。

Prosper 對散戶投資人興趣的降低,讓我開始把資金撤出(這在上方的圖表中可以看到)。我聽說 Prosper 在美國唯一的 主要競爭對手 Lending Club 表現不錯,所以我打算開始把資金轉往那裡,並為該網站撰寫新的借貸機器人。

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯