Example #1
0
        /// <summary>
        /// Считывает данные из файла по доходностям компаний
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void получитьДанныеItem_Click(object sender, EventArgs e)
        {
            openFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            openFile.Filter           = "csv files (*.csv)|*.txt|All files (*.*)|*.*";
            openFile.FilterIndex      = 2;
            openFile.RestoreDirectory = true;

            if (openFile.ShowDialog() == DialogResult.OK)
            {
                table = new TableOfPrice(openFile.FileName);
                UpdateGrid();
            }
        }
Example #2
0
        /// <summary>
        /// Генерирует оптимальный портфель по Марковицу
        /// </summary>
        /// <param name="table">Таблица с ценами акций </param>
        /// <param name="mp">Ограничение для мат. ожидания в процентах</param>
        /// <param name="Dp">Возвращает дисперсию процентах</param>
        /// <returns></returns>
        public static double[] Markowitz(TableOfPrice table, double mp, out double Dp)
        {
            mp = mp / 100;
            //Число компаний
            int n = table.CompanyCount();
            //Количество данных о каждой(объемы выборок)
            int T = table.RecordCount();

            double[] x = new double[n];

            //Генерируем матрицу доходностей
            Matrix incomes = new Matrix(T, n);

            //Заполгяем матрицу доходов
            for (int i = 1; i < incomes.CountRow; i++)
            {
                for (int j = 0; j < incomes.CountColumn; j++)
                {
                    //Доход за промежуток времени
                    incomes[i, j] = (table.Price[i, j] - table.Price[i - 1, j]) / table.Price[i - 1, j];
                }
            }
            //Запись матрицы в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/incomes.csv"))
            {
                sw.WriteLine(incomes.ToString());
            }



            //Подсчитаем теперь среднюю доходность и риск по каждой из акций
            double[] m     = new double[n];
            double[] sigma = new double[n];

            //Средний доход
            for (int i = 0; i < m.Length; i++)
            {
                for (int j = 0; j < incomes.CountRow; j++)
                {
                    m[i] += incomes[j, i];
                }
                m[i] = m[i] / incomes.CountRow;
            }

            //Считаем риск(волантильность)
            for (int i = 0; i < m.Length; i++)
            {
                for (int j = 0; j < incomes.CountRow; j++)
                {
                    sigma[i] += (incomes[j, i] - m[i]) * (incomes[j, i] - m[i]);
                }
                sigma[i] = Math.Sqrt(sigma[i] / (incomes.CountRow - 1));
            }


            //Далее считаем матрицу ковариаций
            Matrix V = new Matrix(n, n);

            for (int i = 0; i < V.CountRow; i++)
            {
                for (int j = 0; j < V.CountColumn; j++)
                {
                    //Считаем среднее попарных произведений отклонений ( то есть ковариацию)
                    for (int k = 0; k < T; k++)
                    {
                        //Суммируем
                        V[i, j] += (incomes[k, i] - m[i]) * (incomes[k, j] - m[j]);
                    }
                    //Усредняем
                    V[i, j] = V[i, j] / T;
                }
            }

            //Запись ковариационной матрицы в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/V.csv"))
            {
                sw.WriteLine(V.ToString());
            }



            //Единичный столбец (матрица из одного столбца и n строк)
            Matrix I = new Matrix(n, 1);

            for (int i = 0; i < n; i++)
            {
                I[i, 0] = 1;
            }

            //Массив m как матрица
            Matrix M = new Matrix(n, 1);

            for (int i = 0; i < n; i++)
            {
                M[i, 0] = m[i];
            }

            //Получаем обратную матрицу
            Matrix Vinv = V.Inv();

            Matrix a11 = I.Transpose() * Vinv * I;
            Matrix a12 = I.Transpose() * Vinv * M;
            Matrix a22 = M.Transpose() * Vinv * M;
            double d   = a11[0, 0] * a22[0, 0] - a12[0, 0] * a12[0, 0];

            Matrix b = (a22[0, 0] * (Vinv * I) - a12[0, 0] * (Vinv * M)) / d;
            Matrix c = (a11[0, 0] * (Vinv * M) - a12[0, 0] * (Vinv * I)) / d;



            Matrix X = b + mp * c;



            //Запись решения в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/X.csv"))
            {
                sw.WriteLine(X.ToString());
            }
            //Копируем в массив
            for (int i = 0; i < n; i++)
            {
                x[i] = X[i, 0];
            }

            //Подсчет дисперсии
            Dp = (X.Transpose() * V * X)[0, 0] * 100 * 100;

            return(x);
        }
Example #3
0
        /// <summary>
        /// Генерирует оптимальный портфель по Шарпу
        /// </summary>
        /// <param name="table">Таблица с ценами акций </param>
        /// <param name="mp">Ограничение для мат. ожидания в процентах</param>
        /// <param name="PriceI">Цена эталонного портфеля</param>
        /// <param name="Dp">Возвращает дисперсию процентах</param>
        /// <returns></returns>
        public static double[] Sharp(TableOfPrice table, double[] PriceI, double mp, out double Dp)
        {
            mp = mp / 100;
            //Число компаний
            int n = table.CompanyCount();
            //Количество данных о каждой(объемы выборок)
            int T = table.RecordCount();


            double[] x = new double[n];

            //Анализируем эталонный портфель
            double[] RI = new double[T];
            for (int i = 1; i < RI.Length; i++)
            {
                //Доход за промежуток времени
                RI[i] = (PriceI[i] - PriceI[i - 1]) / PriceI[i - 1];
            }

            //Статичтические значения для эталонного портфеля
            //М.о. дохода
            double mI = 0;

            for (int i = 0; i < RI.Length; i++)
            {
                mI += RI[i];
            }
            mI = mI / RI.Length;

            //Дисперсии оценка
            double DI = 0;

            for (int i = 0; i < RI.Length; i++)
            {
                DI += (RI[i] - mI) * (RI[i] - mI);
            }
            DI = DI / (RI.Length - 1);



            //Генерируем матрицу доходностей
            Matrix incomes = new Matrix(T, n);

            //Заполгяем матрицу доходов
            for (int i = 1; i < incomes.CountRow; i++)
            {
                for (int j = 0; j < incomes.CountColumn; j++)
                {
                    //Доход за промежуток времени
                    incomes[i, j] = (table.Price[i, j] - table.Price[i - 1, j]) / table.Price[i - 1, j];
                }
            }
            //Запись матрицы в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/incomes.csv"))
            {
                sw.WriteLine(incomes.ToString());
            }

            //Подсчитаем теперь среднюю доходность и риск по каждой из акций
            double[] m = new double[n];
            double[] D = new double[n];

            //Средний доход
            for (int i = 0; i < m.Length; i++)
            {
                for (int j = 0; j < incomes.CountRow; j++)
                {
                    m[i] += incomes[j, i];
                }
                m[i] = m[i] / incomes.CountRow;
            }

            //Считаем риск(волантильность)
            for (int i = 0; i < m.Length; i++)
            {
                for (int j = 0; j < incomes.CountRow; j++)
                {
                    D[i] += (incomes[j, i] - m[i]) * (incomes[j, i] - m[i]);
                }
                D[i] = D[i] / (incomes.CountRow - 1);
            }



            //Ковариация эталанного портфеля с остальными
            double[] VIi = new double[n];
            for (int i = 0; i < VIi.Length; i++)
            {
                for (int j = 0; j < T; j++)
                {
                    VIi[i] += (incomes[j, i] - m[i]) * (RI[j] - mI);
                }
                VIi[i] = VIi[i] / (T - 1);
            }

            //К-ты бетта
            double[] betta = new double[n];
            for (int i = 0; i < betta.Length; i++)
            {
                betta[i] = VIi[i] / DI;
            }

            //К-ты альфа
            double[] alpha = new double[n];
            for (int i = 0; i < alpha.Length; i++)
            {
                alpha[i] = m[i] - betta[i] * mI;
            }

            double[] psi = new double[n];
            for (int i = 0; i < psi.Length; i++)
            {
                for (int j = 0; j < T; j++)
                {
                    psi[i] += (incomes[j, i] - alpha[i] - betta[i] * RI[j]) * (incomes[j, i] - alpha[i] - betta[i] * RI[j]);
                }
                psi[i] = psi[i] / (T - 2);
            }



            //Далее считаем матрицу ковариаций
            Matrix V = new Matrix(n, n);

            for (int i = 0; i < V.CountRow; i++)
            {
                for (int j = 0; j < V.CountColumn; j++)
                {
                    if (i == j)
                    {
                        V[i, j] = betta[i] * betta[i] * DI + psi[i];
                    }
                    else
                    {
                        V[i, j] = betta[i] * betta[j] * DI;
                    }
                }
            }

            //Запись ковариационной матрицы в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/V.csv"))
            {
                sw.WriteLine(V.ToString());
            }



            //Единичный столбец (матрица из одного столбца и n строк)
            Matrix I = new Matrix(n, 1);

            for (int i = 0; i < n; i++)
            {
                I[i, 0] = 1;
            }

            //Массив M из регрессионной модели
            Matrix M = new Matrix(n, 1);

            for (int i = 0; i < n; i++)
            {
                M[i, 0] = alpha[i] + betta[i] * mI;
            }



            SaveArray(alpha, Environment.CurrentDirectory + "/alpha.csv");
            SaveArray(betta, Environment.CurrentDirectory + "/betta.csv");
            SaveArray(psi, Environment.CurrentDirectory + "/psi.csv");
            SaveArray(D, Environment.CurrentDirectory + "/D.csv");
            SaveArray(VIi, Environment.CurrentDirectory + "/VI.csv");
            double[] arr = new double[1];
            arr[0] = DI;
            SaveArray(arr, Environment.CurrentDirectory + "/DI.csv");


            //Получаем обратную матрицу
            Matrix Vinv = V.Inv();

            Matrix a11 = I.Transpose() * Vinv * I;
            Matrix a12 = I.Transpose() * Vinv * M;
            Matrix a22 = M.Transpose() * Vinv * M;
            double d   = a11[0, 0] * a22[0, 0] - a12[0, 0] * a12[0, 0];

            Matrix b = (a22[0, 0] * (Vinv * I) - a12[0, 0] * (Vinv * M)) / d;
            Matrix c = (a11[0, 0] * (Vinv * M) - a12[0, 0] * (Vinv * I)) / d;



            Matrix X = b + mp * c;

            //Запись в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/b.csv"))
            {
                sw.WriteLine(b.ToString());
            }
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/c.csv"))
            {
                sw.WriteLine(c.ToString());
            }


            //Запись решения в файл
            using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "/X.csv"))
            {
                sw.WriteLine(X.ToString());
            }
            //Копируем в массив
            for (int i = 0; i < n; i++)
            {
                x[i] = X[i, 0];
            }

            //Подсчет дисперсии
            Dp = (X.Transpose() * V * X)[0, 0] * 100 * 100;

            return(x);
        }