2017-10-13 61 views
2

沒有人知道計算投資組合或股票相對於基準的Beta(β係數)的方法,例如像C#中的S & P這樣的指數?c#計算股票和指數之間的投資組合β測試

我已經有2個類型的數組,這將是這樣一個計算所需的,但我找不到任何圓滑的方式來做到這一點。

StatisticFormula.BetaFunction方法(Double,Double)存在,但它接受每個參數的一個值,而不是一個數組 - 統計上沒有意義。

在此先感謝

+0

你能澄清每個數組中的值究竟代表什麼?例如。你有一組股票的收盤價格,以及一組特定市場的收盤價格? –

+0

是的,遺憾的是,我有兩組日常退貨。爲了達到這個目標,我有一系列的收盤價和先前的收盤價,一個用於投資組合,另一個用於市場,但是測試計算很可能需要收益。 – MX313

回答

2

我不知道有任何好的C#財務/統計數據包,所以我直接寫的方法,並從這個借來的統計軟件包: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; 
     } 

    } 


} 

這將有被重構來計算函數中的beta,你可以導入鏈接的包以避免我包含的靜態方法等,但這只是一個玩具的例子。

+0

謝謝你......這看起來像我必須走的路。如此令人驚訝,鑑於c#對商業開發的依賴,這不存在。 – MX313