Automated Prosper Investing with ProsperBot

Michael Lynch

用 ProsperBot 实现 Prosper 自动化投资

原文由 Michael Lynch 发布,订阅该博客

概述

我在 2014 年通过一个名为 Prosper 的网站开始投资 P2P 借贷。我觉得 P2P 借贷是个很有意思的点子,有可能带来可观的收益。

刚开始时,我都是手动挑选每一笔贷款进行投资,但后来我通过开发一个名为 ProsperBot 的自动投资机器人,把整个过程自动化了。

在这篇博文中,我将简要介绍 P2P 借贷,并带你了解 ProsperBot 的构建过程。

什么是 P2P 借贷?

假设 Alice 想借 3000 美元,分 5 年还清。按照传统方式,她最好的选择是去银行申请贷款。银行把 3000 美元借给她,如果 Alice 按期还款,银行就能通过利息和费用获利;如果她违约,损失则由银行承担。

而在 P2P 借贷模式下,Alice 会去找一家 P2P 中介平台(比如 Lending Club 和 Prosper)。平台本身不出钱,而是把这笔借款开放给平台上的投资人。投资人 Bob、Charlie 和 Danica 可以每人出资 1000 美元,各自认购 Alice 这笔贷款的一部分。Alice 每月向平台还款,平台再把还款额的三分之一分别分给 Bob、Charlie 和 Danica。

其背后的理念是,去掉了银行这个中间环节,借款人能拿到比传统金融机构更优惠的利率,而投资人(出借人)也能获得比把钱存在银行储蓄账户或定期存单里更高的利息。想更深入地了解 P2P 借贷,像 Lend Academy 这样的网站是非常好的资源。

什么是 ProsperBot

在 Prosper 上投资 P2P 贷款,投资人既可以在官网上手动挑选标的,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 操作的应用。它会持续轮询 Prosper 的服务器,以完成以下任务:

  • 查询新上线的可投标的
  • 对符合投资标准的标的进行投资
  • 检测 Prosper 账户状态的变化(例如现金余额、账户总值的变动)
  • 检测债权的更新(收到还款、债权状态变更等)

ProsperBot 的所有状态都存储在 Redis 数据库中。

这一部分的代码还不够完善(有些地方是临时拼凑的,文档也不够全),我把它开源主要是作为 gofn-prosper 的一个使用示例。

ProsperBot Frontend

ProsperBot Frontend 是一个基于 AngularJS 的网页应用,用于展示 ProsperBot 的状态(如上图所示)。它使用 nginx 来处理静态资源请求(如 HTML 文件、图片等),并使用一个定制的 Go 服务来处理动态内容的请求。该 Go 服务与 ProsperBot 共用同一个 Redis 数据存储来响应这些动态请求。

部署 ProsperBot

ProsperBot 包含多个不同的组件,并且对宿主机有一些依赖(Go、nginx 等)。为了简化部署流程,我编写了两个 Ansible 角色

这样拆分后,就可以把 ProsperBot、ProsperBot Frontend 和 Redis 分别部署在不同的机器上。我个人是把所有组件都装在同一台服务器上的(相关的 Ansible playbook 示例可以在 GitHub 的 README 示例中找到)。

对 Prosper 的看法

总的来说,ProsperBot 对我而言是一次很好的学习经历,但我并不推荐把 Prosper 作为投资策略。原因有以下几点:

  • 小额投资无利可图:我在 Prosper 上基于 XIRR 的投资回报率约为 9%,乍听起来还不错, P2P 借贷的收入要按普通收入计税,比起股票这类更传统的投资,会吃掉更大比例的收益。而且这也让报税变得复杂许多,我不得不聘请税务会计,而不是使用现成的报税软件,仅此一项每年就要从收益中扣除 600 美元(相当于 16000 美元投资的近 4%)。
  • 笨拙的 API:Prosper API 本身设计得不太好。例如,它采用了基于令牌的认证(这点不错),并给应用开发者分配了 client ID 和 secret 来代替用户名/密码,但在实际认证时却又要求提供用户名和密码,使得 client ID 和 secret 形同虚设(这点很糟)。我还注意到 API 有时会返回一些荒唐的数据,比如某笔债权出现了负的还款,这在一个生产级的投资类 API 中本不该出现。
  • 糟糕的开发者支持:2015 年,Prosper 对 API 进行了彻底重构(之前的 API 甚至更糟),却通知开发者只有一个月的过渡期来切换到全新的 API,之后旧系统就会关闭。要求所有 Prosper 客户端开发者放下手头的一切,在一个月内重写所有代码,实在是有些蛮横。更糟的是,新 API 的 bug 非常多,以至于在逼着所有开发者匆忙赶完一个月期限后,Prosper 不得不又把旧 API 的寿命延长了三个月。
  • 对散户投资者的重视度下降:Prosper 似乎越来越专注于银行等机构投资者,而对个人散户投资者不再那么重视。这方面最明显的举措是 2016 年 9 月,Prosper 宣布用户将无法再在二级市场上出售债权。这是条款上的一次重大变更,因为这让投资者无法变现其在 Prosper 上的持仓,所以未来 5 年里我只能被套在 Prosper 上(还要继续承受随之而来的报税麻烦)。

Prosper 对散户投资者的兴趣减弱,让我决定开始把资金撤出(如上图所示)。我听说 Prosper 在美国唯一的主要竞争对手 Lending Club 口碑不错,所以我打算把资金转移过去,并为那个平台再写一个自动投资机器人。

本文章由 muse-spark-1.2-contributor 进行翻译

评论