Can I calculate an average annualised return from investments held for different lengths of time?

My question is: given a number of investments of differing amounts, held for different lengths of time, how would I calculate an approximate average annualised growth for the entire portfolio over its lifetime? (I assume an exact answer won't be possible from this data.)

In my portfolio, I've tracked the following data:

• Purchase date
• Purchase cost
• Sold date
• Sold value

From that I can calculate:

• Profit/Loss (Sold value + Dividends - Purchase cost)
• Actual growth (Profit/Loss ÷ Purchase cost)
• Number of years held (Sold date - Purchase date) ÷ 365
• Annualised growth ((Sold value + Dividends)/PurchaseCost ^ (1/Number of Years Held)) - 1

Here are some real-world values, if that helps: In the method below all the portfolio values at each time interval are calculated. Then they are aggregated in each time period and the period return is calculated. Finally the period returns are compounded and annualised.

For example, the portfolio return between periods x5 and x6 is

(a11 + a23 + a34)/(a1 + a22 + a33) - 1 = 0.903 %

where a1 is the starting value of asset 1 and a11 is the value of asset 1 after one time period. If the actual values were known this would give a better result, but given the limited information they are calculated.

Compounding the period returns is the same as taking the time-weighted return. s1 = {2017, 6, 7};
e1 = {2017, 12, 4};
s2 = {2015, 9, 2};
e2 = {2017, 11, 1};
s3 = {2015, 2, 25};
e3 = {2017, 7, 3};
s4 = {2015, 2, 20};
e4 = {2017, 6, 2};

d1 = QuantityMagnitude@DateDifference[s1, e1, "Day"];
d2 = QuantityMagnitude@DateDifference[s2, e2, "Day"];
d3 = QuantityMagnitude@DateDifference[s3, e3, "Day"];
d4 = QuantityMagnitude@DateDifference[s4, e4, "Day"];

a1 = 4606.75;
v1 = 4529 + 27.48;
a2 = 3500;
v2 = 5827 + 56;
a3 = 2900;
v3 = 3998 + 72;
a4 = 2900;
v4 = 3566;

r1 = (v1/a1)^(1/d1) - 1.0
r2 = (v2/a2)^(1/d2) - 1.0
r3 = (v3/a3)^(1/d3) - 1.0
r4 = (v4/a4)^(1/d4) - 1.0
-0.0000609549
0.000656731
0.000394644
0.000248211

The above are the daily rates of return for the four assets.

x1 = {2015, 2, 20};
x2 = {2015, 2, 25};
x3 = {2015, 9, 2};
x4 = {2017, 6, 2};
x5 = {2017, 6, 7};
x6 = {2017, 7, 3};
x7 = {2017, 11, 1};
x8 = {2017, 12, 4};

k1 = QuantityMagnitude@DateDifference[x1, x2, "Day"];
k2 = QuantityMagnitude@DateDifference[x2, x3, "Day"];
k3 = QuantityMagnitude@DateDifference[x3, x4, "Day"];
k4 = QuantityMagnitude@DateDifference[x4, x5, "Day"];
k5 = QuantityMagnitude@DateDifference[x5, x6, "Day"];
k6 = QuantityMagnitude@DateDifference[x6, x7, "Day"];
k7 = QuantityMagnitude@DateDifference[x7, x8, "Day"];

a41 = a4 (1 + r4)^k1;
a42 = a41 (1 + r4)^k2;
a43 = a42 (1 + r4)^k3
3566.

The calculated value of asset 4 after three period is the same as the final value v4 above.

a31 = a3 (1 + r3)^k2;
a32 = a31 (1 + r3)^k3;
a33 = a32 (1 + r3)^k4;
a34 = a33 (1 + r3)^k5
4070.
a21 = a2 (1 + r2)^k3;
a22 = a21 (1 + r2)^k4;
a23 = a22 (1 + r2)^k5;
a24 = a23 (1 + r2)^k6
5883.
a11 = a1 (1 + r1)^k5;
a12 = a11 (1 + r1)^k6;
a13 = a12 (1 + r1)^k7
4556.48
z1 = a41/a4;
z2 = (a31 + a42)/(a3 + a41);
z3 = (a21 + a32 + a43)/(a2 + a31 + a42);
z4 = (a22 + a33)/(a21 + a32);
z5 = (a11 + a23 + a34)/(a1 + a22 + a33);
z6 = (a12 + a24)/(a11 + a23);
z7 = a13/a12;

k = QuantityMagnitude@DateDifference[x1, x8, "Day"];

(z1*z2*z3*z4*z5*z6*z7)^(365/k) - 1
0.154885

So the portfolio return is 15.49% per annum.