コード例 #1
0
        public cOptimalPort(double[,] dWeights, int iPos, double dRisk, double dReturn, ISecurities cSecsCol, IErrorHandler cErrors, double Equity, double AdjCoeff, string CalcCurrency)
        {
            m_objErrorHandler = cErrors;
            m_iPortPos        = iPos;
            m_dPortRisk       = dRisk;
            m_dPortReturn     = dReturn;

            try
            {
                cOptimalStaticCalcs op = new cOptimalStaticCalcs();
                setSecuritiesCollection(cSecsCol, dWeights, Equity, AdjCoeff, CalcCurrency);

                m_dRateToRisk      = m_dPortReturn / m_dPortRisk;
                m_dDiversification = op.getDiversificationValue(dWeights, cSecsCol, iPos, m_dPortRisk);

                double dSecValue;
                double dCurrCash;
                m_cash = 0;
                for (var i = 0; i < m_colSecurities.Count; i++)
                {
                    dSecValue = Math.Floor(m_colSecurities[i].Quantity) * m_colSecurities[i].Price / AdjCoeff;
                    dCurrCash = (m_colSecurities[i].Quantity - Math.Floor(m_colSecurities[i].Quantity)) * m_colSecurities[i].Price / AdjCoeff;
                    // cash : sum - after making qty whole + cents/agorot of security value
                    m_cash += dCurrCash + dSecValue - Math.Floor(dSecValue);
                }
            }
            catch (Exception ex) {
                m_objErrorHandler.LogInfo(ex);
            }
        }//constructor
コード例 #2
0
        }//calculateNewEfficientFrontier

        private void runEfficientFrontierModule(ISecurities cSecsCol)
        { // Runs the efficient frontier calculation
            try
            {
                // Initialize variables
                double[,] weightsMat;
                cOptimalStaticCalcs calcs = new cOptimalStaticCalcs();
                // Constraints
                m_objConstraints.refreshConstList();
                m_objConstraints.setConstraintValues(cSecsCol);

                // Parameters
                m_arrRatesVector = getRatesArrForScilab(cSecsCol); // Create rates array
                if ((m_arrRatesVector.Length == 0) || (m_arrCovarData == null))
                {
                    m_strEngineErrors = "Missing data"; m_objErrorHandler.LogInfo(m_strEngineErrors); return;
                }

                // Calculation
                List <double> colRisks = new List <double>(), colRates = new List <double>();
                m_strEngineErrors = calcs.runOptimizationProcess(out colRisks, out colRates, out weightsMat, m_arrCovarData, m_arrRatesVector,
                                                                 m_objConstraints.DoubleUpperBound, m_objConstraints.DoubleLowerBound, m_objConstraints.DoubleEqualitySecs, m_objConstraints.DoubleEqualityValues, m_objConstraints.IntEqualityNum,
                                                                 m_objConstraints.Double_NonEqualitySecs, m_objConstraints.Double_NonEqualityValues, 0, cProperties.OptimalPorts);

                if ((m_strEngineErrors != "") || (colRisks.Count == 0) || (colRates.Count == 0))
                {
                    m_isSuccessfulCalc = false; return;
                }                                                                                                                        // Error in calculation

                // Set final variables
                m_dWeightsMatrix = weightsMat;
                setOptimalPortsCollection(cSecsCol, colRisks, colRates);
                setMainWeightsMatrix(weightsMat);

                if (m_colOptimalPorts.Count == 0)
                {
                    m_isSuccessfulCalc = false; m_strEngineErrors = "Failed to calculate EF"; return;
                }
            } catch (Exception ex) {
                m_objErrorHandler.LogInfo(ex);
            }
        }//runEfficientFrontierModule