Initial Commit
This commit is contained in:
83
MarketData/MarketDataLib/MarketDataModel/ModelPerformance.cs
Executable file
83
MarketData/MarketDataLib/MarketDataModel/ModelPerformance.cs
Executable file
@@ -0,0 +1,83 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using MarketData.Utils;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MarketData.MarketDataModel
|
||||
{
|
||||
public class ModelPerformanceSeries : List<ModelPerformanceItem>
|
||||
{
|
||||
public ModelPerformanceSeries()
|
||||
{
|
||||
}
|
||||
public ModelPerformanceSeries(List<ModelPerformanceItem> modelPerformanceItemList)
|
||||
{
|
||||
foreach(ModelPerformanceItem modelPerformanceItem in modelPerformanceItemList) Add(modelPerformanceItem);
|
||||
}
|
||||
public void CalculatePerformance()
|
||||
{
|
||||
for(int index=0;index<this.Count;index++)
|
||||
{
|
||||
ModelPerformanceItem currentModelPerformanceItem=this[index];
|
||||
ModelPerformanceItem prevModelPerformanceItem=0==index?null:this[index-1];
|
||||
if(null==prevModelPerformanceItem)
|
||||
{
|
||||
currentModelPerformanceItem.CumulativeGainLoss=currentModelPerformanceItem.GainLossDOD;
|
||||
if(0==currentModelPerformanceItem.Exposure)currentModelPerformanceItem.R=0;
|
||||
else currentModelPerformanceItem.R=(currentModelPerformanceItem.MarketValue-currentModelPerformanceItem.Exposure)/currentModelPerformanceItem.Exposure;
|
||||
currentModelPerformanceItem.OnePlusR=1.00+currentModelPerformanceItem.R;
|
||||
currentModelPerformanceItem.CumProd=currentModelPerformanceItem.OnePlusR;
|
||||
currentModelPerformanceItem.CumProdMinusOne=currentModelPerformanceItem.CumProd-1.00;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentModelPerformanceItem.CumulativeGainLoss=currentModelPerformanceItem.GainLossDOD+prevModelPerformanceItem.CumulativeGainLoss;
|
||||
if(0==currentModelPerformanceItem.Exposure)currentModelPerformanceItem.R=0;
|
||||
else currentModelPerformanceItem.R=prevModelPerformanceItem.Exposure.Equals(currentModelPerformanceItem.Exposure)?(currentModelPerformanceItem.MarketValue-prevModelPerformanceItem.MarketValue)/prevModelPerformanceItem.MarketValue:0;
|
||||
currentModelPerformanceItem.OnePlusR=1.00+currentModelPerformanceItem.R;
|
||||
currentModelPerformanceItem.CumProd=currentModelPerformanceItem.OnePlusR*prevModelPerformanceItem.CumProd;
|
||||
currentModelPerformanceItem.CumProdMinusOne=currentModelPerformanceItem.CumProd-1.00;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public class ModelPerformanceItem
|
||||
{
|
||||
public DateTime Date { get; set; }
|
||||
public double Exposure { get; set; } // This is the exposure on a given day.
|
||||
public double MarketValue { get; set; } // This is the MarketValue on a given day
|
||||
public double GainLossDOD { get; set; } // This is the gain loss change from day to day
|
||||
public double GainLoss { get; set; } // This is the gain loss on the given day
|
||||
public double CumulativeGainLoss{get;set;} // This is the cumulative gain loss. The last item in the series contains the cumulative amount gained or lost.
|
||||
public double R{get;set;} // This is the period Return. (MV[n]-MV[n-1])/MV[n-1]
|
||||
public double OnePlusR{get;set;} // (R+1)
|
||||
public double CumProd{get;set;} // (R+1)*(R+1).....
|
||||
public double CumProdMinusOne{get;set;} // subtract 1 from CumProd to get a decimal return. Each item in the series represents a cumulative return for that date. The final element contains the cumulative return for the entire series
|
||||
public bool ClosedPositions{get;set;} // inidcates if any positions closed on this date
|
||||
public ModelPerformanceItem()
|
||||
{
|
||||
}
|
||||
public static String Header()
|
||||
{
|
||||
StringBuilder sb=new StringBuilder();
|
||||
sb.Append("Date,Exposure,MarketValue,GainLossDOD,GainLoss,CumulativeGainLoss,R,OnePlusR,CumProd,CumProdMinusOne,ClosedPositions");
|
||||
return sb.ToString();
|
||||
}
|
||||
public override String ToString()
|
||||
{
|
||||
StringBuilder sb=new StringBuilder();
|
||||
sb.Append(Utility.AddQuotes(Utility.DateTimeToStringMMSDDSYYYY(Date))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatCurrency(Exposure))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatCurrency(MarketValue))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatCurrency(GainLossDOD))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatCurrency(GainLoss))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatCurrency(CumulativeGainLoss))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatPercent(R,2))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatNumber(OnePlusR,2))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatNumber(CumProd,2))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(Utility.FormatPercent(CumProdMinusOne,3))).Append(",");
|
||||
sb.Append(Utility.AddQuotes(ClosedPositions.ToString()));
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user