For my ProsperDays presentation this year I will demonstrating bidding with the Prosper API… I have built a quick and dirty bid snipping java program. (This program is not ready for primetime as bid sniping tool, but it is very close and a very effective demo. The reason I say it is not ready is that it lacks memory, meaning that it would bid on the same listing on subsequent passes.)
I think API bidding is the 1st step in a brave new world of Prosper Lending. For one, it easily allows custom models.
So what does this 126 line program do?
It queries the active AA-C credit grade listings… If a listing passes my extended credit filters (hard coded) AND the minimum Prosper calculated ROI values (generated by Prosper and the floor is passed in as a parameter) AND the minimum time remaining in the auction it will place a validation test bid or a real bid.
What are the extended credit requirements of this code? Short answer… very tight.
- 0 current DQ
- 0-1 inquires in the last 6 months
- 0 public records in last 10 years
- 0 DQ in last 7 years
- Bankcard utilization between 3% and 80%
Here is the java code (I have contributed this code to the SourceForge Prosper API project). It requires the API classes generated by the Java2WSDL and open source tool by Apache foundation.
package prosper.api;
import java.math.BigDecimal;
import java.math.MathContext;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Iterator;
import java.util.TreeMap;
import javax.xml.rpc.ServiceException;
import com.prosper.services.ProsperAPI.DefinitionResult;
import com.prosper.services.ProsperAPI.Field;
import com.prosper.services.ProsperAPI.Listing;
import com.prosper.services.ProsperAPI.ProsperAPILocator;
import com.prosper.services.ProsperAPI.ProsperAPISoap;
import com.prosper.services.ProsperAPI.ProsperObject;
import com.prosper.services.ProsperAPI.ProsperObjectResult;
public class QuickSnipe
{
private String m_Username;
private String m_Password;
private double m_MinROI;
private int m_HoursToGo;
private boolean m_PlaceBids;
private ProsperAPISoap m_APISoap;
public QuickSnipe(String username, String password, double minROI, int hoursToGo, boolean placeBids) throws ServiceException
{
m_Username = username;
m_Password = password;
m_MinROI = minROI;
m_PlaceBids = placeBids;
m_HoursToGo = hoursToGo;
m_APISoap = (new ProsperAPILocator()).getProsperAPISoap();
}
/**
* @param args
*/
public static void main(String[] args)
{
if (args.length!=5)
{
System.err.println("Usage: QuickSnipe username password minROI hoursToGo PlaceBids");
return;
}
try
{
QuickSnipe qs = new QuickSnipe(args[0], args[1], Double.parseDouble(args[2]), Integer.parseInt(args[3]), Boolean.parseBoolean(args[4]));
qs.snipe();
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
private void snipe() throws Exception
{
DefinitionResult res = m_APISoap.login(m_Username,m_Password);
String token = res.getMessage();
ProsperObjectResult por = m_APISoap.query(token, "listing", getFieldsString("listing",true), "status=2 and (creditgrade=7 or creditgrade=6 or creditgrade=5 or creditgrade=4)");
ProsperObject[] pos = por.getProsperObjects();
TreeMap<Calendar,Listing> timeLeftListings = new TreeMap<Calendar,Listing>();
for (int i=0; i<pos.length; i++)
{
Listing l = (Listing)pos[i];
Calendar end = (Calendar)l.getStartDate().clone();
end.add(Calendar.HOUR, (l.getDuration()*24));
long millisToGo = end.getTimeInMillis() - System.currentTimeMillis();
if (l.getNowDelinquent()==0 //my required extended credit and ROI
&& (millisToGo/1000/60/60)<=m_HoursToGo
&& l.getInquiriesLast6Months()<2
&& l.getPublicRecordsLast10Years()==0
&& l.getDelinquenciesLast7Years()==0
&& l.getBankcardUtilization().doubleValue()<=.8
&& l.getBankcardUtilization().doubleValue()>=.03
&& ((l.getBidMaximumRate().doubleValue()+l.getROINetDefaultRate().doubleValue()+l.getROIInterestAndFeesRate().doubleValue()+l.getROIServicingFeeRate().doubleValue())>=m_MinROI)
)
{
timeLeftListings.put(end, l);
}
}
boolean pause = false;
for (Iterator<listing> i = timeLeftListings.values().iterator(); i.hasNext(); )
{
if (pause) // you have to pause to avoid bid throttling
{try {Thread.sleep(6000);}catch (Exception ignore){}}
Listing l = i.next();
Timestamp startts = new Timestamp(l.getStartDate().getTimeInMillis());
Calendar end = (Calendar)l.getStartDate().clone();
end.add(Calendar.HOUR, (l.getDuration()*24));
Timestamp endts = new Timestamp(end.getTimeInMillis());
long hoursToGo = (end.getTimeInMillis() - System.currentTimeMillis())/1000/60/60;
System.err.println("\n"+startts+" + "+l.getDuration()+" days = "+endts+" | Hours To Go: "+hoursToGo);
System.err.println("Bid on Listing: "+l.getListingNumber()+"\nAt Rate: "+(m_MinROI-l.getROINetDefaultRate().doubleValue()-l.getROIInterestAndFeesRate().doubleValue()-l.getROIServicingFeeRate().doubleValue()));
res = m_APISoap.bid(token, l.getListingNumber(), new BigDecimal(50,new MathContext(4)), new BigDecimal(m_MinROI-l.getROINetDefaultRate().doubleValue()-l.getROIInterestAndFeesRate().doubleValue()-l.getROIServicingFeeRate().doubleValue(),new MathContext(4)), m_PlaceBids);
pause = true;
System.err.println("Bid Message: "+res.getMessage());
}
m_APISoap.logout(token);
}
private String getFieldsString(String type, boolean authenticated) throws RemoteException
{
DefinitionResult res = m_APISoap.describe(null, type);
Field[] fields = res.getDefinition().getFields();
int count = 0;
String s="";
for (int i=0; i<fields.length; i++)
{
if (authenticated || !fields[i].isAuthenticated())
{
if (count!=0)
{
s+= ",";
}
s+= fields[i].getName();
count++;
}
}
return s;
}
}
Related Posts -
RateLadder Reaches 10K Milestone Near the end of last week my Prosper account value crossed the 10K milestone. This is an important milestone as well as signaling a change in funding patterns. Why is it important? With my bid laddering strategy the most I will ever put into a single loan is $200 (4...... -
New Loan Funded — Wife wants to get back to work! Please help Re-list — $24,000 at 21.48% — B Credit — DTI 62% A new loan funded (Wife wants to get back to work! Please help Re-list â $24,000 at 21.48%). I participated via my standing order RL Overlooked. The borrower had B credit, a 62% DTI, and is a homeowner. This was a non autofunding loan. As a reminder my standing orders (and manual...... -
Now That I Have Bid You Should Too (if you want to) I finally managed to snipe $50 out from under my standing orders. I have placed a $50 bid. This is a very clean D. The public record explains the credit score. The GL had the following to say: Iâve verified income, rental amount, and car payment. DTI high in part...... -
Reconsidering Manual Bids I am unhappy with the recent changes to the auto funding loans. By warning borrowers away from them, there have been none that have match my SO criteria since the Prosper Days Changes. I won't setup SO on non auto funding loans due to the lack of a time left...... -
How to Switch to AmSher for Prosper Collections A few days ago I noticed a new default collection agency being available: New Prosper Collection Agency... I had already changed my default agency, but just realized that only affected my manual bids (I make very very manual bids), so I also changed all of my Standing Orders to use......
Related Websites -
Manufacturers: Weber Weber fine acoustic instruments are manufactured by Sound to Earth in Logan, Montana. The company has steadily grown, moving from Bozeman recently to accommodate its expansion. The 25 employees make mandolins by hand in an old Logan schoolhouse. The move was necessary because Weber plans to expand their product line...... -
Save Time, Money and Space in Over 80 Ways If you're looking for handy gadgets, tools and various items that can save you time, money or space (or all three!) this list of more than 80 top products is just what you need. Everyone's got saving money on their minds these days. Some of us are always looking to...... -
Installing Walkway Pavers Any home can look better when you add a nice walkway leading up to it. Luckily, just about anyone can do it on their own and it doesn't take much time. We recommend allowing around two to three days to complete your walkway, so it can be accomplished on a...... -
The Importance of Site Architecture in Support of SEO Services The Importance of Site Architecture in Support of SEO Services By Sara Rankin Web developers often perceive a site's architecture from a completely different perspective than search engine optimization specialists. Developers tend to see an information structure in the context of content management systems and databases. SEO professionals consider a...... -
Importance of Java / J2EE Web Application Development Many businessmen, investors and organization are more interested in Web Application Development just because of raising importance of software and Internet in the world wide economics, so method is how to play a lively and important role to communicate with the whole World Wide Web.Web Applications Development is only the......
Categories:
2 comments ↓
Cool, thanks for sharing! I’ll have to get my jdk installed again at home and give it a shot.
[...] RateLadder on Prosper Days 2008 as well as the source code for the tool demonstrated at Prosper Days: QuickSnipe [...]
Leave a Comment