4
$\begingroup$

I am interested in modeling startup companies failure and success rates to describe what is the representative startup.

I have 40 companies in a dataset. Each company is represented as a list of all the investment financing rounds it has gone through. For example:

Company 1: Seed Round, Series A Round
Company 2: Seed Round, Series A Round, Series B Round
Company 3: Seed Round, Series A Round, Series B Round
Company 4: Seed Round, Series A Round, Series B Round, Series C Round
Company 5: Seed Round
Company 6: Series A Round, Series B Round
Company 6: Series A Round

And so on.

I can see that each round can be represented as a state in a Markov Chain, and transitions are only allowed from earlier stages to later stages. I can go from Seed to Series A, and from Series A to Series B, but not from Series B to Series A.

So we have N-order markov chains (production data has N <= 4).

The output I'm looking for is a binary tree chart showing each stage as a node and each node can either transition to the next node or to a final state meaning the company has failed.

This problem can also be seen as a real options model...

Any ideas on how to implement this model?

I can code in Python or Ruby (but I am no expert).

$\endgroup$
  • 1
    $\begingroup$ Does the data include the amount of funding? Are you trying to compute the probability of going to round N+1 given funding X at round N? Do you have any other info about the company (turnover, size, profit)? $\endgroup$ – Spacedman May 21 '15 at 13:22
  • $\begingroup$ I am trying to predict how many companies I will have to invest in if I raise a US$ x m fund. This depends on the likelihood of companies advancing through financing stages, and how much I will invest in a Seed, Series A, B, C... round. That way I know that I can invest in less companies if I go from investing 12% to 25% of the total amounted in each Series A a participated in rounds. The stochastic modelling im trying here is to calibrate the survival rates in the model. $\endgroup$ – blue-dino May 22 '15 at 15:00
4
$\begingroup$

If the data you show are the only data that you have, then the Markov Chain is really boring: it is a linear chain, going from Round A to Round B to Round C, and all those states are connected to a base state (which is Death, or something).

You can directly calculate the transition probabilities from the data you have, since the number of companies that reached round N are all companies that could have reached round N (there is no alternative path). The death probability at the previous stage is (1 - $P_{reaching N}$)

In [1]: raw_data = """
   ...: Company 1: Seed Round, Series A Round
   ...: Company 2: Seed Round, Series A Round, Series B Round
   ...: Company 3: Seed Round, Series A Round, Series B Round
   ...: Company 4: Seed Round, Series A Round, Series B Round, Series C Round
   ...: Company 5: Seed Round
   ...: Company 6: Series A Round, Series B Round
   ...: Company 6: Series A Round
   ...: """
In [2]: data_lines = raw_data.splitlines()[1:]
In [6]: key_vals = {}
In [12]: for line in data_lines:
             key, val = line.split(':')
             key = key.strip()
             vals = [v.strip() for v in val.split(',')]
             key_vals[key] = vals

In [13]: key_vals
Out[13]:
{'Company 1': ['Seed Round', 'Series A Round'],
 'Company 2': ['Seed Round', 'Series A Round', 'Series B Round'],
 'Company 3': ['Seed Round', 'Series A Round', 'Series B Round'],
 'Company 4': ['Seed Round',
  'Series A Round',
  'Series B Round',
  'Series C Round'],
 'Company 5': ['Seed Round'],
 'Company 6': ['Series A Round']}

In [14]: transitions = ['Seed Round', 'Series A Round', 'Series B Round', 'Series C Round']

In [19]: for transition in transitions:
    summed = 0
    for company, rounds in key_vals.iteritems():
        if transition in rounds:
            summed += 1
    prob = float(summed) / float(len(key_vals.keys()))
    death_prob = 1 - prob
    print "From previous to %s: probability %s" % (transition, prob)
    print "Death rate at %s: probability %s" % (transition, death_prob)

From previous to Seed Round: probability 0.833333333333
Death rate at Seed Round: probability 0.166666666667
From previous to Series A Round: probability 0.833333333333
Death rate at Series A Round: probability 0.166666666667
From previous to Series B Round: probability 0.5
Death rate at Series B Round: probability 0.5
From previous to Series C Round: probability 0.166666666667
Death rate at Series C Round: probability 0.833333333333

However, if you had some more features of each company, like the amount of money they received at each stage, or the profit they were making, then you could train a decision tree, e.g. with this implementation in sklearn, that told you, in simple words, "if a company arrived at round X with at least Y dollars raised and at least Z dollars of profit, then they are passing to the next round with 0.XX probability". Which is, I think, what you are aiming at.

$\endgroup$
  • $\begingroup$ Yes, that is what I am aiming at. I have data on funding volume and timing on each round. I'll look into the links you posted and I'll try running the code. Thanks a lot for your help. $\endgroup$ – blue-dino May 22 '15 at 14:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.