Ejemplo n.º 1
0
function portfolioOptim(x, pm, lows, highs) {
    var i, j, k, Dmat, dvec, a1, a2, a3, a3neg, b3, Amat, bvec,
        res, pw, px, ps;

    x = stats.transpose(x);

    k = x[0].length;
    Dmat = stats.cov(x);
    dvec = stats.repInt(0, k);
    a1 = stats.repInt(1, k);
    a2 = stats.colMeans(x);
    a3 = stats.identity(k, 1);
    a3neg = stats.identity(k, -1);
    b3 = stats.repInt(0, k);
    Amat = stats.rbind(a1, a2, a3, a3, a3neg);
    Amat = stats.transpose(Amat);
    if (pm === 0 || pm === undefined) {
        pm = stats.mean(x);
    }
    bvec = [1].concat(pm).concat(b3).concat(lows).concat(highs);

    for (i = 0; i < Dmat.length; i = i + 1) {
        Dmat[i] = [undefined].concat(Dmat[i]);
    }
    Dmat = [undefined].concat(Dmat);
    dvec = [undefined].concat(dvec);
    for (i = 0; i < Amat.length; i = i + 1) {
        Amat[i] = [undefined].concat(Amat[i]);
    }
    Amat = [undefined].concat(Amat);
    bvec = [undefined].concat(bvec);

    res = qp.solveQP(Dmat, dvec, Amat, bvec, 2);

    res.solution.shift();

    px = [];
    pw = res.solution;
    //~ ps = 0;
    //~ pm = 0;
    for (i = 0; i < x.length; i += 1) {
        px[i] = 0;
        for (j = 0; j < pw.length; j += 1) {
            px[i] += (pw[j] * x[i][j]);
        }
        //~ ps += (px[i] - pm) * (px[i] - pm);
        //~ pm += px[i];
    }
    //~ ps = Math.sqrt(ps / (x.length - 1));
    //~ pm = pm / x.length;
    ps = 0;
    for (i = 0; i < x.length; i += 1) {
        ps += (px[i] - pm) * (px[i] - pm);
    }
    ps = Math.sqrt(ps / (x.length - 1));

    res.pm = pm;
    res.ps = ps;

    return res;
}
Ejemplo n.º 2
0
function portfolioOptim(x, pm, lows, highs) {
    var i, j, k, Dmat, dvec, a1, a2, a3, a3neg, b3, Amat, bvec,
        res, pw, px, ps;

    function colMeans(x) {
        var i, j, sum, means, nrows, ncols;

        means = [];
        nrows = x.length;
        ncols = x[0].length;

        for (j = 0; j < ncols; j = j + 1) {
            sum = 0;
            for (i = 0; i < nrows; i = i + 1) {
                sum = sum + x[i][j];
            }
            means[j] = sum / nrows;
        }

        return means;
    }

    function mean(x) {
        var i, sum = 0, means;

        means = colMeans(x);
        for (i = 0; i < means.length; i = i + 1) {
            sum = sum + means[i];
        }

        return sum / means.length;
    }

    function cov(x) {
        var i, j, j2, nrows, ncols,
            sumX, sumX2, sumY, sumY2, sumXY,
            covmat = [];

        nrows = x.length;
        ncols = x[0].length;

        for (i = 0; i < ncols; i = i + 1) {
            covmat[i] = [];
        }

        for (j = 0; j < ncols - 1; j = j + 1) {
            for (j2 = j + 1; j2 < ncols; j2 = j2 + 1) {
                sumX = 0;
                sumY = 0;
                sumX2 = 0;
                sumY2 = 0;
                sumXY = 0;

                for (i = 0; i < nrows; i = i + 1) {
                    sumX = sumX + x[i][j];
                    sumY = sumY + x[i][j2];
                    sumX2 = sumX2 + (x[i][j] * x[i][j]);
                    sumY2 = sumY2 + (x[i][j2] * x[i][j2]);
                    sumXY = sumXY + (x[i][j] * x[i][j2]);
                }
                covmat[j][j] = (sumX2 - (sumX * sumX) / nrows) / (nrows - 1);
                covmat[j2][j2] = (sumY2 - (sumY * sumY) / nrows) / (nrows - 1);
                covmat[j][j2] = (sumXY - (sumX * sumY) / nrows) / (nrows - 1);
                covmat[j2][j] = covmat[j][j2];
            }
        }

        return covmat;
    }

    function repInt(n, k) {
        var i, ans = [];

        for (i = 0; i < k; i = i + 1) {
            ans[i] = n;
        }

        return ans;
    }

    function identity(k, n) {
        var i, j, m = [];

        n = n || 1;

        for (i = 0; i < k; i = i + 1) {
            m[i] = [];
            for (j = 0; j < k; j = j + 1) {
                if (i === j) {
                    m[i][j] = n;
                } else {
                    m[i][j] = 0;
                }
            }
        }

        return m;
    }

    function rbind() {
        var i, j, k, n, rows, cols, arg, m = [];

        for (n = 0, k = 0; n < arguments.length; n = n + 1) {
            arg = arguments[n];
            rows = arg.length;
            cols = arg[0].length;

            if (cols === undefined) {
                m[k] = [];
                for (i = 0; i < rows; i = i + 1) {
                    m[k][i] = arg[i];
                }
                k = k + 1;
            } else {
                for (i = 0; i < rows; i = i + 1) {
                    m[k] = [];
                    for (j = 0; j < cols; j = j + 1) {
                        m[k][j] = arg[i][j];
                    }
                    k = k + 1;
                }
            }
        }

        return m;
    }

    function transpose(m) {
        var i, j, rows, cols, res = [];

        rows = m.length;
        cols = m[0].length;

        for (i = 0; i < cols; i = i + 1) {
            res[i] = [];
            for (j = 0; j < rows; j = j + 1) {
                res[i][j] = m[j][i];
            }
        }

        return res;
    }

    x = transpose(x);

    k = x[0].length;
    Dmat = cov(x);
    dvec = repInt(0, k);
    a1 = repInt(1, k);
    a2 = colMeans(x);
    a3 = identity(k, 1);
    a3neg = identity(k, -1);
    b3 = repInt(0, k);
    Amat = rbind(a1, a2, a3, a3, a3neg);
    Amat = transpose(Amat);
    if (pm === 0 || pm === undefined) {
        pm = mean(x);
    }
    bvec = [1].concat(pm).concat(b3).concat(lows).concat(highs);

    for (i = 0; i < Dmat.length; i = i + 1) {
        Dmat[i] = [undefined].concat(Dmat[i]);
    }
    Dmat = [undefined].concat(Dmat);
    dvec = [undefined].concat(dvec);
    for (i = 0; i < Amat.length; i = i + 1) {
        Amat[i] = [undefined].concat(Amat[i]);
    }
    Amat = [undefined].concat(Amat);
    bvec = [undefined].concat(bvec);

    res = qp.solveQP(Dmat, dvec, Amat, bvec, 2);

    res.solution.shift();

    px = [];
    pw = res.solution;
    //~ ps = 0;
    //~ pm = 0;
    for (i = 0; i < x.length; i += 1) {
        px[i] = 0;
        for (j = 0; j < pw.length; j += 1) {
            px[i] += (pw[j] * x[i][j]);
        }
        //~ ps += (px[i] - pm) * (px[i] - pm);
        //~ pm += px[i];
    }
    //~ ps = Math.sqrt(ps / (x.length - 1));
    //~ pm = pm / x.length;
    ps = 0;
    for (i = 0; i < x.length; i += 1) {
        ps += (px[i] - pm) * (px[i] - pm);
    }
    ps = Math.sqrt(ps / (x.length - 1));

    res.pm = pm;
    res.ps = ps;

    return res;
}