Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 public static string GetActiveDeltaStrategy(MySqlConnection conn)
 {
     return(HedgeStrategies.GetDeltaStrategyList(conn: conn).Last());
 }