Mintos meets Data Science #2


This is the second part of Mintos meets Data Science series. If you haven’t read my first approach yet, I strongly recommend you to do so to get a general picture of what I’m going to talk about here.

In a nutshell, this is about applying my programming knowledge to spot the best investing opportunities at Mintos crowdlending platform. If you are not using Mintos yet, you can read my unbiased review. Sign up through my affiliate link to get a 0.75% cashback during the first three months.

In this article I’ll address each mistake I committed in Mintos meets Data Science #1 and I’ll explain how did I sort them out to create Mintos Explorer tool.

Overfitting

What I’ve found out during the months I’ve been applying my first approach is that the portfolios were too much specific, so they didn’t quite reflect the reality. In statistics this is called overfitting, meaning that the analysis corresponds too closely to the testing data, and therefore fails to predict future observations reliably.

That’s why I removed the interest rate column, and I’ve omitted the fancy colours used to group each kind of portfolio. On the other hand, I’ve added two new columns for the currency (not only EUR anymore) and buyback. These are options I personally don’t use, but maybe some of you might find interesting.

The limitations

Although Mintos provides an excellent Statistics page with a downloadable loan book, there is no easy way to check if a single loan has been paid on time in the past, there is just displayed the current payment status: late +15, grace period, etc.

In this second version, I tried to create a simple python web scraper to query each contract by its loan ID and read the values of the payments table. And it worked! The code looks like this:

def get_contract_info(row):
    
    user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
    url = 'https://www.mintos.com/en/' + row.id
    
    headers = {'User-Agent':user_agent,} 

    request = urllib.request.Request(url,None,headers)
    response = urllib.request.urlopen(request)
    html = response.read()
    time.sleep(0.1)

    pq = PyQuery(html)
    payments = []
    
    for i in pq('td.status'):
        payments.append(PyQuery(i).text().strip())
    
    payments_left = payments.count('Scheduled')
    payments_paid = (len(payments) - payments_left)

    if payments_paid > 0:
        wellpaid_pct = (payments.count('Paid') + payments.count('Paid before')) / payments_paid
    else:
        wellpaid_pct = 0
    
    closing_date = PyQuery(pq('#info-wrapper > table > tbody > tr:nth-child(13) > td.value')).text().strip()

    amortization = PyQuery(pq('#info-wrapper > table > tbody > tr:nth-child(10) > td.value')).text().strip()
    
    str_inv_available = PyQuery(pq('#invest-rightbar-list > div > div:nth-child(2)')).text().strip()
    reg = re.search('([\d+\.]+)', str_inv_available)
    if reg:
        inv_available = float(reg.group(1))
    else:
        inv_available = 0
        
    return inv_available, closing_date, amortization, payments_paid, wellpaid_pct, payments_left

However, note that it queries each contract one by one. That’s insane: there are dozens of thousands of loans available; that would entail hours of processing time. Plus, this is not a good practice as I might get kicked by the server due to an hypothetical DOS attack. So kids, don’t try this at home.

I’m going to contact with the Mintos support service to see if they can provide this kind of info because my final reports would be much accurate.

The current version of Mintos Explorer just takes into account the status of the active contracts. Perhaps in the further versions, I can add some new features of the past loans by its ending status, something like penalising those which ended prematurely due to early payments, or agreement prolongations, etc. Anyway, I need to study this in depth to find out if it can lead to any meaningful conclusion.

Originators ratings

Mintos have realised their own originator rating, and I’ve also added the outstanding tracking done by ExploreP2P blog.

Additionally, I’ve created my own rating based on different parameters, so we compare them to determine whether that originator is a good choice or not. It is called On-time rating, and it’s calculated by the mean of the on-time rank column (a weighted average indicator of the loan performance) of all active loans of a specific originator. It’s a great metric to track how well they’re performing in all the currencies, countries, loan types, interest rates, etc.

Maybe I can just condense all these three ratings in a single one. What do you think? Leave your opinion in the comment section below.

Sharing the outcome

In the first part of this series, I decided to blur the image of the final result as it was just an alpha experiment. I just wanted to test it out by myself before posting any relevant conclusion.

Now I’ve finally released the outcome so all investors can beneficiate. I’ve added some filters so you could select the features you’re interested more easily.

The bottom line

I’ll update Mintos Explorer on a monthly basis so you will be able to rebalance your portfolio accordingly. Plus, I’ve created a Mintos Explorer FAQ page, so you know the meaning of each column.

Throughout the following months, I’ll work on other investing tools I have in mind. However, I ‘ll listen to any idea you might have to release further editions of these series.

Do you miss any feature? Is there another platform for which I can create a similar tool? Post your opinions and suggestions in the comment section below.

Rate this post
[Total: 0 Average: 0]
Further reading

Leave a Reply

Your email address will not be published. Required fields are marked *