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 계좌 활동을 시간 흐름에 따라 보여주는 웹 대시보드도 만들었습니다:

그래프에서 볼 수 있듯이 제 계좌 가치는 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과 완전히 독립적이기 때문에 다른 분들에게는 아마 가장 흥미로운 부분일 것입니다. 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 롤을 몇 개 작성했습니다:
- mtlynch.prosperbot은 핵심(헤드리스) ProsperBot 애플리케이션을 설치하는 롤입니다.
- mtlynch.prosperbot-frontend는 프론트엔드를 배포합니다.
이렇게 나누어 두면 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에 대해 좋은 이야기를 들었기 때문에, 앞으로 자금을 그쪽으로 옮기고 해당 사이트를 위한 새로운 대출 봇을 만들 계획입니다.
글을 무작위로 읽기