public TimeSeries GetTotalReturnTimeSeries() { TimeSeries last_ts = this.GetTimeSeries(TimeSeriesType.Close); if (last_ts == null || last_ts.Count == 0) { return(null); } int count = last_ts.Count; DateTime lastDate = last_ts.DateTimes[count - 1]; if (_trDB.ContainsKey(lastDate)) { return(_trDB[lastDate]); } TimeSeries tr_ts = new TimeSeries(1); tr_ts.AddDataPoint(last_ts.DateTimes[0], last_ts[0]); var all_corps = this.CorporateActions(); for (int i = 1; i < count; i++) { DateTime date = last_ts.DateTimes[i]; DateTime date_1 = last_ts.DateTimes[i - 1]; double value = last_ts[i]; double value_1 = last_ts[i - 1]; double adjustment = 1.0; foreach (CorporateAction c in all_corps) { if (c.ExDate >= date.Date) { if (c.Type == "Stock Split") { adjustment *= c.Amount; } else if (c.Type == "Scrip" && c.Amount != 0.0) { adjustment /= c.Amount; } else if (c.Type == "Spinoff" && c.Amount != 1.0) { adjustment /= 1 - c.Amount; } } } var corps = this.CorporateActions(date.Date); if (corps != null) { foreach (CorporateAction corp in corps) { double amount = corp.Amount; if (corp.Type != "Stock Split" && corp.Type != "Scrip" && corp.Type != "Spinoff")// && corp.Type != "Rights Issue") { value += amount * adjustment; } else if (corp.Type == "Spinoff" && corp.Amount != 1.0) { value /= 1 - amount; } else if (corp.Type == "Stock Split") { value *= amount; } else if (corp.Type == "Scrip" && corp.Amount != 0.0) { value /= amount; } } } double v_1 = tr_ts[i - 1]; double v = v_1 * (value / value_1); tr_ts.AddDataPoint(date, v); } double scale = last_ts[count - 1] / tr_ts[count - 1]; tr_ts *= scale; _trDB.TryAdd(lastDate, tr_ts); return(tr_ts); }
public TimeSeries GetPriceReturnTimeSeries() { TimeSeries last_ts = this.GetTimeSeries(TimeSeriesType.Close); if (last_ts == null || last_ts.Count == 0) { return(null); } int count = last_ts.Count; DateTime lastDate = last_ts.DateTimes[count - 1]; if (_prDB.ContainsKey(lastDate)) { return(_prDB[lastDate]); } TimeSeries tr_ts = new TimeSeries(1); tr_ts.AddDataPoint(last_ts.DateTimes[0], last_ts[0]); for (int i = 1; i < count; i++) { DateTime date = last_ts.DateTimes[i]; DateTime date_1 = last_ts.DateTimes[i - 1]; double value = last_ts[i]; double value_1 = last_ts[i - 1]; //var corps = this.CorporateActions(date_1.Date); var corps = this.CorporateActions(date.Date); if (corps != null) { foreach (CorporateAction corp in corps) { //Console.WriteLine(corp); double amount = corp.Amount; if (corp.Type != "Stock Split" && corp.Type != "Scrip" && corp.Type != "Spinoff") { value += amount * 0;// No Dividend Reinvestment } else if (corp.Type == "Spinoff" && corp.Amount != 1.0) { value /= 1 - amount; } else if (corp.Type == "Stock Split") { value *= amount; } else if (corp.Type == "Scrip" && corp.Amount != 0.0) { value /= amount; } } } double v_1 = tr_ts[i - 1]; double v = v_1 * (value / value_1); tr_ts.AddDataPoint(date, v); } double scale = last_ts[count - 1] / tr_ts[count - 1]; tr_ts *= scale; _prDB.TryAdd(lastDate, tr_ts); return(tr_ts); }
public TimeSeries GetTotalReturnTimeSeries() { TimeSeries _last_ts = this.GetTimeSeries(TimeSeriesType.Close); if (_last_ts == null || _last_ts.Count == 0) { return(null); } TimeSeries last_ts = _last_ts.RemoveValue(0); int count = last_ts.Count; DateTime lastDate = last_ts.DateTimes[count - 1]; if (_trDB.ContainsKey(lastDate)) { return(_trDB[lastDate]); } TimeSeries tr_ts = new TimeSeries(1); tr_ts.AddDataPoint(last_ts.DateTimes[0], last_ts[0]); var all_corps = this.CorporateActions(); if (all_corps == null || all_corps.Count == 0) { _trDB.TryAdd(lastDate, _last_ts); return(_last_ts); } for (int i = 1; i < count; i++) { DateTime date = last_ts.DateTimes[i]; DateTime date_1 = last_ts.DateTimes[i - 1]; double value = last_ts[i]; double value_1 = last_ts[i - 1]; double adjustment = 1.0; foreach (CorporateAction c in all_corps) { if (c.ExDate >= date.Date) { // if (c.Type == "Stock Split") // adjustment *= c.Amount; // else if (c.Type == "Scrip" && c.Amount != 0.0) { adjustment /= c.Amount; } else if (c.Type == "Spinoff" && c.Amount != 1.0) { adjustment /= 1 - c.Amount; } } } var corps = this.CorporateActions(date.Date); if (corps != null) { foreach (CorporateAction corp in corps) { double amount = corp.Amount; if (corp.Type != "Stock Split" && corp.Type != "Scrip" && corp.Type != "Spinoff")// && corp.Type != "Rights Issue") { value += amount * adjustment; } else if (corp.Type == "Spinoff" && corp.Amount != 1.0) { value /= 1 - amount; } // else if (corp.Type == "Stock Split") // { // if(value / value_1 > amount*0.75 && value / value_1 < amount*1.25) // { // Console.WriteLine(" --- APPLY STOCK SPLIT(" + this.Name + "): " + date_1 + " - " + date + " -- " + value_1 + " -> " + value + " | " + amount); // value *= amount; // } // } else if (corp.Type == "Scrip" && corp.Amount != 0.0) { value /= amount; } } } double v_1 = tr_ts[i - 1]; double v = v_1 * (value_1 == 0.0 ? 1.0 : value / value_1); tr_ts.AddDataPoint(date, v); } double scale = tr_ts[count - 1] == 0.0 ? 1.0 : last_ts[count - 1] / tr_ts[count - 1]; tr_ts *= scale; _trDB.TryAdd(lastDate, tr_ts); return(tr_ts); }