ProsperBot으로 하는 Prosper 자동 투자
원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기
개요
2014년에 Prosper라는 사이트를 통해 P2P 대출 투자에 뛰어들었다. P2P 대출이라는 아이디어가 참신하다고 생각했고, 수익도 꽤 쏠쏠할 것 같았다.
처음에는 대출 투자를 일일이 직접 골랐지만, 시간이 지나면서 이 과정을 자동화했다. ProsperBot이라는 대출 봇을 만들어 자동으로 투자하도록 한 것이다.
이 글에서는 P2P 대출이 무엇인지 간략히 살펴보고, ProsperBot을 만든 과정을 단계별로 소개한다.
P2P 대출이란?
앨리스가 향후 5년에 걸쳐 갚을 조건으로 3,000달러를 빌리고 싶다고 상상해 보자. 전통적인 방식이라면 앨리스가 할 수 있는 최선은 은행에 대출을 신청하는 것이다. 은행은 앨리스에게 3,000달러를 빌려주고, 앨리스가 약정한 대로 상환하면 은행은 그 대출의 이자와 수수료로 수익을 얻는다. 만약 앨리스가 상환에 실패하면 손실은 은행이 떠안게 된다.
P2P 대출에서는 앨리스가 P2P 중개 플랫폼(예: Lending Club이나 Prosper)을 찾는다. 중개 플랫폼은 자체 자금으로 대출해 주는 대신, 해당 대출을 투자자들에게 제공한다. 투자자인 밥, 찰리, 대니카는 각각 1,000달러씩 앨리스 대출의 일부를 매입할 수 있다. 앨리스는 매달 대출 플랫폼에 상환금을 납부하고, 플랫폼은 다시 그 상환금의 1/3씩을 밥, 찰리, 대니카에게 매달 나눠 지급한다.
이론적으로는 은행이라는 중간자를 없앰으로써 차입자는 기존 금융기관보다 더 유리한 금리로 돈을 빌릴 수 있고, 투자자(대출자)는 예금이나 CD 형태로 은행에 돈을 넣어두는 것보다 더 높은 이자를 얻을 수 있다. P2P 대출에 대해 더 깊이 알고 싶다면 Lend Academy 같은 사이트가 좋은 자료가 된다.
ProsperBot이란?
Prosper에서 P2P 대출에 투자하려면 Prosper 웹사이트에서 직접 대출을 고를 수도 있지만, Prosper는 개발자가 자동으로 투자할 수 있도록 공개 API도 제공한다.
나는 API 방식을 선택해 Prosper에서 새로운 대출을 계속 탐색하고 특정 조건에 맞으면 자동으로 투자하는 대출 봇인 ProsperBot을 개발했다. 또 ProsperBot의 현재 상태와 내 Prosper 계좌 활동을 시간 경과에 따라 보여주는 웹 대시보드도 포함되어 있다:

그래프에서 볼 수 있듯이, ProsperBot이 대출 상환금을 받아 새로운 대출에 재투자함에 따라 내 계좌 가치는 4월부터 꾸준히 증가했다. 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 등 여러 의존성을 요구한다. ProsperBot 배포 과정을 단순화하기 위해 몇 가지 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에 대해서는 좋은 이야기를 들었기 때문에, 그쪽으로 자금을 옮기고 해당 사이트용 새로운 대출 봇을 만들 계획이다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기