用 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 账户随时间变化的情况:

如图所示,自 4 月以来,随着 ProsperBot 收到贷款还款并将资金再投资到新的标的中,我的账户总值一直在稳步增长。到了 10 月,总值开始下降,是因为我已经开始从 Prosper 账户中提现。
逐项拆解
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 角色:
- mtlynch.prosperbot 负责安装核心的(无界面)ProsperBot 应用。
- mtlynch.prosperbot-frontend 负责部署前端。
这样拆分后,就可以把 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 口碑不错,所以我打算把资金转移过去,并为那个平台再写一个自动投资机器人。
随机一篇博客
评论
登录后参与讨论