Automated Prosper Investing with ProsperBot

Michael Lynch

ProsperBot으로 하는 Prosper 자동 투자

개요

2014년에 Prosper라는 사이트를 통해 P2P 대출 투자를 시작했습니다. P2P 대출이라는 아이디어가 참신하다고 생각했고 수익도 꽤 좋을 것 같았습니다.

처음에는 대출 투자를 하나하나 직접 골랐지만, 시간이 지나면서 ProsperBot이라는 대출 봇을 만들어 이 과정을 자동화했고 이제는 봇이 알아서 투자를 진행합니다.

이 글에서는 P2P 대출에 대해 간략히 소개하고 ProsperBot을 만든 과정을 살펴보겠습니다.

P2P 대출이란?

예를 들어 Alice가 앞으로 5년에 걸쳐 갚을 3,000달러를 빌리려 한다고 해보겠습니다. 전통적으로라면 Alice가 선택할 수 있는 가장 좋은 방법은 은행에 대출을 신청하는 것이었습니다. 은행은 Alice에게 3,000달러를 빌려주고, Alice가 계획대로 상환하면 이자와 수수료로 수익을 얻습니다. 만약 Alice가 상환에 실패하면 그 손실은 은행이 떠안게 됩니다.

P2P 대출에서는 Alice가 P2P 중개 플랫폼(예: Lending Club이나 Prosper)을 찾습니다. 중개 플랫폼은 자기 돈을 직접 빌려주는 대신 투자자들에게 대출을 제공합니다. 투자자인 Bob, Charlie, Danica는 각각 1,000달러씩 Alice 대출의 일부를 매입할 수 있습니다. Alice는 매달 중개 사이트에 상환금을 납부하고, 중개 사이트는 다시 Alice의 상환액 중 1/3씩을 매달 Bob, Charlie, Danica에게 나눠 줍니다.

이론적으로는 은행이라는 중간 단계를 없애면 차입자는 기존 금융기관보다 더 유리한 금리로 돈을 빌릴 수 있고, 투자자(대출자)는 은행 예·적금이나 CD에 돈을 넣어두는 것보다 더 높은 이자를 얻을 수 있습니다. P2P 대출에 대해 더 깊이 알고 싶다면 Lend Academy 같은 사이트가 좋은 자료가 됩니다.

ProsperBot이란?

Prosper에서 P2P 대출에 투자할 때 투자자는 Prosper 웹사이트에서 직접 대출을 고를 수도 있지만, Prosper는 개발자가 자동으로 투자할 수 있도록 공개 API도 제공합니다.

저는 API 방식을 택해 Prosper에서 새로 올라오는 대출을 지속적으로 탐색하고 제가 정한 조건에 맞는 대출이 있으면 자동으로 투자하는 대출 봇인 ProsperBot을 개발했습니다. 또 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과 완전히 독립적이기 때문에 다른 분들에게는 아마 가장 흥미로운 부분일 것입니다. Prosper API와 연동하는 Go 애플리케이션을 만들고 싶은 분이라면 누구나 이 라이브러리를 자신의 애플리케이션에서 재사용할 수 있습니다.

ProsperBot

ProsperBot은 gofn-prosper 위에 구축되어 실제로 Prosper에서 작업을 수행하는 애플리케이션입니다. ProsperBot은 Prosper 서버를 지속적으로 폴링하여 다음과 같은 작업을 합니다:

  • 새로 등록된 대출 조회
  • 투자 기준에 부합하는 대출에 투자
  • Prosper 계좌 상태 변화 감지(예: 현금 잔액 변화, 총 계좌 가치 변화)
  • 채권 업데이트 감지(상환금 수령, 채권 상태 변경 등)

ProsperBot은 모든 상태를 Redis 데이터베이스에 저장합니다.

이 부분은 제가 원하는 만큼 다듬어지지는 않았습니다(코드 곳곳에 임시 방편이 있고 문서화도 부족합니다). 하지만 주로 gofn-prosper의 사용 예시로 공개합니다.

ProsperBot Frontend

ProsperBot Frontend는 ProsperBot의 상태를 보여주는 AngularJS 웹 애플리케이션입니다(위 스크린샷 참조). 정적 리소스(예: HTML 파일, 이미지)에 대한 요청은 nginx가 처리하고, 동적 콘텐츠에 대한 요청은 별도의 Go 서버가 처리합니다. 이 Go 서버는 ProsperBot과 동일한 Redis 데이터 저장소를 사용해 동적 요청에 응답합니다.

ProsperBot 배포하기

ProsperBot은 여러 구성 요소로 이루어져 있고 호스트 시스템에 Go, nginx 등 여러 의존성을 요구합니다. 배포 과정을 단순화하기 위해 Ansible 롤을 몇 개 작성했습니다:

이렇게 나누어 두면 ProsperBot, ProsperBot Frontend, Redis를 각각 다른 머신에 배포할 수도 있습니다. 저는 개인적으로 모든 구성 요소를 단일 서버에 설치합니다(이 경우의 예시 Ansible 플레이북은 GitHub README 예제에서 볼 수 있습니다).

Prosper에 대한 생각

전반적으로 ProsperBot은 좋은 학습 경험이었지만, Prosper를 투자 전략으로 추천하지는 않습니다. 이유는 다음과 같습니다:

  • 소액에서는 수익성이 낮음: Prosper에서 XIRR 기준 약 9%의 수익률을 얻고 있는데, 처음 들으면 괜찮아 보이지만 P2P 대출 소득은 일반 소득으로 과세되어 주식 같은 전통적인 투자보다 수익에서 세금이 차지하는 비중이 훨씬 큽니다. 세금 신고도 복잡해져서 시중 세무 소프트웨어를 쓸 수 없고 세무사를 고용해야 하므로 매년 수익에서 600달러가 빠져나갑니다(16,000달러 투자액의 거의 4%에 해당합니다).
  • 조잡한 API: Prosper API 자체가 그다지 잘 설계되지 않았습니다. 예를 들어 토큰 기반 인증을 사용하고(좋음) 애플리케이션 개발자에게 아이디/비밀번호 대신 클라이언트 ID와 시크릿을 발급하면서도, 정작 모든 인증 과정에서 아이디와 비밀번호를 요구하므로 클라이언트 ID와 시크릿이 무의미해집니다(나쁨). 또 채권에 마이너스 상환액이 찍히는 등 말이 안 되는 데이터를 API가 반환하는 경우도 봤는데, 실제 투자용 API에서는 일어나서는 안 될 일입니다.
  • 미흡한 개발자 지원: 2015년에 Prosper는 API를 전면 개편했는데(이전 API는 더 엉망이었습니다), 개발자들에게 한 달 안에 완전히 새로운 API로 갈아타지 않으면 기존 시스템을 종료하겠다고 통보했습니다. 모든 Prosper 클라이언트 개발자가 하던 일을 멈추고 한 달 안에 코드를 전부 고쳐 쓰리라 기대한 것은 꽤 뻔뻔한 처사였습니다. 더 나쁜 것은 새 API에 버그가 너무 많아 결국 한 달이라는 촉박한 기한을 맞추느라 허둥대게 만든 뒤 기존 API의 수명을 세 달 더 연장해야 했다는 점입니다.
  • 개인 투자자에 대한 관심 감소: Prosper는 개인 투자자보다 은행 같은 기관 투자자에 더 집중하는 것으로 보입니다. 가장 큰 조치는 2016년 9월에 Prosper가 발표한 세컨더리 마켓에서의 대출 판매 중단이었습니다. 투자자가 보유 중인 Prosper 자산을 현금화할 수 없게 만든 급격한 약관 변경이었고, 그 결과 저는 앞으로 5년간 Prosper(와 그에 따른 세금 문제)에 묶이게 되었습니다.

개인 투자자에 대한 Prosper의 관심이 줄어든 것을 보고 저는 자금을 빼기 시작했습니다(위 그래프에서 확인할 수 있습니다). Prosper의 미국 내 유일한 주요 경쟁사인 Lending Club에 대해 좋은 이야기를 들었기 때문에, 앞으로 자금을 그쪽으로 옮기고 해당 사이트를 위한 새로운 대출 봇을 만들 계획입니다.

원문은 Michael Lynch님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.