using System; using System.Linq; using System.Collections.Generic; using MarketData.Numerical; namespace MarketData.MarketDataModel { public class TimeSeriesCollection : List { public TimeSeriesCollection() { } public TimeSeriesCollection(List elements) { if (null == elements) return; foreach (TimeSeriesElement element in elements) Add(element); } // Returns the intersection of both sets on the common dates public static AlignDatesResult AlignDates(TimeSeriesCollection tsA,TimeSeriesCollection tsB) { List tsADates=(from ts in tsA select ts.AsOf).ToList(); List tsBDates=(from ts in tsB select ts.AsOf).ToList(); List tsIntersect=tsADates.Intersect(tsBDates).Distinct().ToList(); tsA=new TimeSeriesCollection((from ts in tsA where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); tsB=new TimeSeriesCollection((from ts in tsB where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); return new AlignDatesResult(tsA,tsB); } public float[] ToFloat() { float[] values = new float[Count]; for (int index = 0; index < Count; index++) values[index] = (float)this[index].Value; return values; } public bool ContainsNegativeValues() { int count= (from TimeSeriesElement element in this where element.Value < 0 select element).Count(); return count > 0 ? true : false; } public TimeSeriesCollection RemoveNegativeValues() { return new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value >= 0 select element).ToList()); } // Removes the outliers from the collection. If the resulting collection contains zero elements then returns the original collection. //public TimeSeriesCollection RemoveOutliers(int standardDeviations=4) //{ // double[] values = (from TimeSeriesElement element in this select element.Value).ToArray(); // double valuesStd=Numerics.Volatility(ref values)*standardDeviations; // TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value <=valuesStd select element).ToList()); // if(0==timeSeriesCollection.Count)return this; // else return timeSeriesCollection; //} } public class TimeSeriesElement { public enum ElementType { INVALID, OTHER,BVPS, EPS, OperatingCashflow,FreeCashflow,Revenue,QuarterlyRevenue,Inventory,QuarterlyInventory,ROIC,OperatingIncome,WorkingCapital,ROA,NetIncomeAvailableToCommonShareholders,TaxRate,InterestExpense,COGS}; private String symbol; private DateTime asof; private ElementType elementType; private double value; private String otherType; public TimeSeriesElement() { } public String Symbol { get { return symbol; } set { symbol = value; } } public DateTime AsOf { get { return asof; } set { asof = value; } } public double Value { get { return value; } set { this.value = value; } } public String OtherType { get{return otherType;} set{otherType=value;} } public TimeSeriesElement.ElementType Type { get { return elementType; } set { elementType = value; } } public static String StringForType(TimeSeriesElement.ElementType type) { switch (type) { case ElementType.INVALID : return "???"; case ElementType.BVPS: return "bvps"; case ElementType.EPS: return "eps"; case ElementType.OperatingCashflow : return "operating_cashflow"; case ElementType.FreeCashflow: return "free_cashflow"; case ElementType.Revenue: return "revenue"; case ElementType.QuarterlyRevenue: return "quarterly_revenue"; case ElementType.OperatingIncome: return "operating_income"; case ElementType.ROIC: return "roic"; case ElementType.WorkingCapital: return "working_capital"; case ElementType.ROA: return "roa"; case ElementType.TaxRate : return "tax_rate"; case ElementType.InterestExpense: return "interest_expense"; case ElementType.NetIncomeAvailableToCommonShareholders: return "net_income_available_to_common_shareholders"; case ElementType.COGS: return "cogs"; default: return "???"; } } } public class AlignDatesResult { public AlignDatesResult() { } public AlignDatesResult(TimeSeriesCollection collectionA,TimeSeriesCollection collectionB) { CollectionA=collectionA; CollectionB=collectionB; } public TimeSeriesCollection CollectionA{get;set;} public TimeSeriesCollection CollectionB{get;set;} } }