2017-10-13 7 views
2

Est-ce que quelqu'un sait comment calculer le bêta (coefficient bêta) d'un portefeuille ou d'un titre par rapport à un indice de référence, comme un indice comme S & P dans C#?C# calcul du portefeuille bêta entre stock et indice

J'ai déjà 2 tableaux de type double qui seraient nécessaires pour un tel calcul mais je ne trouve pas de façon élégante de le faire.

La méthode StatisticFormula.BetaFunction (Double, Double) existe mais elle accepte une valeur pour chaque paramètre, et non pour un tableau, ce qui n'a aucun sens sur le plan statistique.

grâce à l'avance

+0

Pouvez-vous préciser exactement ce que les valeurs de chaque tableau représentent? Par exemple. vous avez un tableau de prix de clôture pour un stock, et un tableau de prix de clôture pour un marché particulier? –

+0

Oui, désolé de laisser cela, j'ai deux tableaux de retours quotidiens. Pour y arriver, j'ai des tableaux de prix de clôture et des prix de clôture précédents, un pour un portefeuille et un pour le marché, mais le calcul bêta nécessite très probablement les rendements. – MX313

Répondre

2

Je ne suis pas au courant de bon C# Finance/Statistiques paquets, j'ai donc écrit la méthode directement et empruntés à cette stats package: https://www.codeproject.com/Articles/42492/Using-LINQ-to-Calculate-Basic-Statistics

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    static class Program 
    { 
     static void Main(string[] args) 
     { 
      double[] closingPriceStock = { 39.32, 39.45, 39.27, 38.73, 37.99, 38.38, 39.53, 40.55, 40.78, 41.3, 41.35, 41.25, 41.1, 41.26, 41.48, 41.68, 41.77, 41.92, 42.12, 41.85, 41.54 }; 
      double[] closingPriceMarket = { 1972.18, 1988.87, 1987.66, 1940.51, 1867.61, 1893.21, 1970.89, 2035.73, 2079.61, 2096.92, 2102.44, 2091.54, 2083.39, 2086.05, 2084.07, 2104.18, 2077.57, 2083.56, 2099.84, 2093.32, 2098.04 }; 

      double[] closingPriceStockDailyChange = new double[closingPriceStock.Length - 1]; 
      double[] closingPriceMarketDailyChange = new double[closingPriceMarket.Length - 1]; 

      for (int i = 0; i < closingPriceStockDailyChange.Length; i++) 
      { 
       closingPriceStockDailyChange[i] = (closingPriceStock[i + 1] - closingPriceStock[i])/(100 * closingPriceStock[i]); 
       closingPriceMarketDailyChange[i] = (closingPriceMarket[i + 1] - closingPriceMarket[i])/(100 * closingPriceMarket[i]); 
      } 

      double beta = Covariance(closingPriceStockDailyChange, closingPriceMarketDailyChange)/Variance(closingPriceMarketDailyChange); 

      Console.WriteLine(beta); 

      Console.Read(); 
     } 


     public static double Variance(this IEnumerable<double> source) 
     { 
      int n = 0; 
      double mean = 0; 
      double M2 = 0; 

      foreach (double x in source) 
      { 
       n = n + 1; 
       double delta = x - mean; 
       mean = mean + delta/n; 
       M2 += delta * (x - mean); 
      } 
      return M2/(n - 1); 
     } 

     public static double Covariance(this IEnumerable<double> source, IEnumerable<double> other) 
     { 
      int len = source.Count(); 

      double avgSource = source.Average(); 
      double avgOther = other.Average(); 
      double covariance = 0; 

      for (int i = 0; i < len; i++) 
       covariance += (source.ElementAt(i) - avgSource) * (other.ElementAt(i) - avgOther); 

      return covariance/len; 
     } 

    } 


} 

Cela devrait être refactorisé pour calculer bêta dans une fonction, vous pouvez importer le paquet lié pour éviter les méthodes statiques que j'ai inclus, etc., mais ce n'est qu'un exemple de jouet.

+0

Merci pour ça ... on dirait que je vais devoir y aller. Tellement surprenant, étant donné que C# 's penche vers les dev de l'entreprise que cela n'existe pas. – MX313