public static void HedgeStrategiesAgainstDelta(MySqlConnection conn, DataTable priceTable) { List <string> HedgeStrategyList = HedgeStrategies.GetStrategyList2Hedge(conn: conn); List <string> DeltaStrategyList = HedgeStrategies.GetDeltaStrategyList(conn: conn); string ActiveDeltaStrategy = DeltaStrategyList[DeltaStrategyList.Count - 1]; Console.WriteLine("Calculating hedges for strategies..."); foreach (string item in HedgeStrategyList) { Console.WriteLine(item); HedgeStrategies.HedgeStrategyAgainstDelta(alias: item, deltaAlias: ActiveDeltaStrategy, conn: conn, priceTable: priceTable); } }
DataTable GenerateHedgeTable(MySqlConnection conn) { string DeltaStrategy = HedgeStrategies.GetDeltaStrategyList(conn: conn).Last(); //string DeltaStrategy = HedgeStrategies.GetDeltaStrategyList(conn: conn).First(); DataTable DeltaNetPosition = TA.Strategy.GetNetPosition(alias: DeltaStrategy, conn: conn); DeltaNetPosition.Columns.Add("TickerHead", typeof(string)); DeltaNetPosition.Columns.Add("TickerClass", typeof(string)); DeltaNetPosition.Columns.Add("ContINDX", typeof(int)); for (int i = 0; i < DeltaNetPosition.Rows.Count; i++) { ContractUtilities.ContractSpecs Cs = ContractUtilities.ContractMetaInfo.GetContractSpecs(ticker: DeltaNetPosition.Rows[i].Field <string>("Ticker")); DeltaNetPosition.Rows[i]["TickerHead"] = Cs.tickerHead; DeltaNetPosition.Rows[i]["TickerClass"] = Cs.tickerClass; DeltaNetPosition.Rows[i]["ContINDX"] = Cs.contINDX; } DataRow[] FlatCurvePositions = (from x in DeltaNetPosition.AsEnumerable() where Underlying.FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b)) select x).ToArray(); DataRow[] NonFlatCurvePositions = (from x in DeltaNetPosition.AsEnumerable() where !Underlying.FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b)) select x).ToArray(); DataTable FlatCurveHedgeTable = new DataTable(); FlatCurveHedgeTable.Columns.Add("Ticker", typeof(string)); FlatCurveHedgeTable.Columns.Add("TickerHead", typeof(string)); FlatCurveHedgeTable.Columns.Add("IsSpreadQ", typeof(bool)); FlatCurveHedgeTable.Columns.Add("Hedge", typeof(int)); DataTable NonFlatCurveHedgeTable = new DataTable(); NonFlatCurveHedgeTable.Columns.Add("Ticker", typeof(string)); NonFlatCurveHedgeTable.Columns.Add("TickerHead", typeof(string)); NonFlatCurveHedgeTable.Columns.Add("IsSpreadQ", typeof(bool)); NonFlatCurveHedgeTable.Columns.Add("Hedge", typeof(int)); if (FlatCurvePositions.Count() > 0) { DataTable FlatCurveTable = FlatCurvePositions.CopyToDataTable(); ContractUtilities.ContractList liquidContractList = new ContractUtilities.ContractList(FlatCurveTable.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToArray()); Dictionary <string, string> LiquidContractDictionary = new Dictionary <string, string>(); foreach (string item in liquidContractList.dbTickerList) { LiquidContractDictionary.Add(ContractUtilities.ContractMetaInfo.GetContractSpecs(item).tickerHead, item); } var grouped = FlatCurveTable.AsEnumerable().GroupBy(r => r["TickerHead"]).Select(w => new { TickerHead = w.Key.ToString(), Qty = w.Sum(r => decimal.Parse(r["Qty"].ToString())), }).ToList(); for (int i = 0; i < grouped.Count; i++) { FlatCurveHedgeTable.Rows.Add(); FlatCurveHedgeTable.Rows[i]["Ticker"] = LiquidContractDictionary[grouped[i].TickerHead]; FlatCurveHedgeTable.Rows[i]["TickerHead"] = grouped[i].TickerHead; FlatCurveHedgeTable.Rows[i]["IsSpreadQ"] = false; FlatCurveHedgeTable.Rows[i]["Hedge"] = Math.Round(-grouped[i].Qty); } } if (NonFlatCurvePositions.Count() > 0) { DataTable SortedNonFlatCurvePositions = NonFlatCurvePositions.AsEnumerable() .OrderBy(r => r.Field <string>("TickerHead")) .ThenBy(r => r.Field <int>("contINDX")) .CopyToDataTable(); List <string> TickerHeadList = SortedNonFlatCurvePositions.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToList(); for (int i = 0; i < TickerHeadList.Count(); i++) { DataTable TickerHeadPositions = SortedNonFlatCurvePositions.Select("TickerHead='" + TickerHeadList[i] + "'").CopyToDataTable(); if (TickerHeadPositions.Rows.Count == 1) { DataRow Row = NonFlatCurveHedgeTable.NewRow(); NonFlatCurveHedgeTable.Rows.Add(); Row["Ticker"] = TickerHeadPositions.Rows[0].Field <string>("Ticker"); Row["TickerHead"] = TickerHeadList[i]; Row["IsSpreadQ"] = false; Row["Hedge"] = Math.Round(-TickerHeadPositions.Rows[0].Field <double>("Qty")); NonFlatCurveHedgeTable.Rows.Add(Row); continue; } int sum = (int)Math.Round(-TickerHeadPositions.AsEnumerable().Sum(x => x.Field <double>("Qty"))); int MaxIndex = TickerHeadPositions.Rows.IndexOf(TickerHeadPositions.Select("Qty = MAX(Qty)")[0]); int MinIndex = TickerHeadPositions.Rows.IndexOf(TickerHeadPositions.Select("Qty = MIN(Qty)")[0]); if (sum > 0) { DataRow Row = NonFlatCurveHedgeTable.NewRow(); Row["Ticker"] = TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker"); Row["TickerHead"] = TickerHeadList[i]; Row["IsSpreadQ"] = false; Row["Hedge"] = sum; NonFlatCurveHedgeTable.Rows.Add(Row); TickerHeadPositions.Rows[MinIndex]["Qty"] = TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") + sum; } else if (sum < 0) { DataRow Row = NonFlatCurveHedgeTable.NewRow(); Row["Ticker"] = TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker"); Row["TickerHead"] = TickerHeadList[i]; Row["IsSpreadQ"] = false; Row["Hedge"] = sum; NonFlatCurveHedgeTable.Rows.Add(Row); TickerHeadPositions.Rows[MaxIndex]["Qty"] = TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") + sum; } bool PositionCleanedQ = false; while (!PositionCleanedQ) { var OrderedRows = TickerHeadPositions.AsEnumerable().OrderByDescending(x => x["Qty"]); MaxIndex = TickerHeadPositions.Rows.IndexOf(OrderedRows.First()); MinIndex = TickerHeadPositions.Rows.IndexOf(OrderedRows.Last()); PositionCleanedQ = !((TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") > 0.5) & (TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") < -0.5)); if (PositionCleanedQ) { break; } int qty = -(int)Math.Round(Math.Min(TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty"), -TickerHeadPositions.Rows[MinIndex].Field <double>("Qty"))); string SpreadTicker; int HedgeQty; if (TickerHeadPositions.Rows[MaxIndex].Field <int>("ContINDX") < TickerHeadPositions.Rows[MinIndex].Field <int>("ContINDX")) { SpreadTicker = TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker") + "-" + TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker"); HedgeQty = qty; } else { HedgeQty = -qty; SpreadTicker = TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker") + "-" + TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker"); } DataRow Row = NonFlatCurveHedgeTable.NewRow(); Row["Ticker"] = SpreadTicker; Row["TickerHead"] = TickerHeadList[i]; Row["IsSpreadQ"] = true; Row["Hedge"] = HedgeQty; NonFlatCurveHedgeTable.Rows.Add(Row); TickerHeadPositions.Rows[MaxIndex]["Qty"] = TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") + qty; TickerHeadPositions.Rows[MinIndex]["Qty"] = TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") - qty; } } } FlatCurveHedgeTable.Merge(NonFlatCurveHedgeTable); return(FlatCurveHedgeTable); }
public static string GetActiveDeltaStrategy(MySqlConnection conn) { return(HedgeStrategies.GetDeltaStrategyList(conn: conn).Last()); }