protected CommodsMultiScore(ComID[] ccys_, int numDays_)
 {
   NumDays = numDays_;
   ComIndexes = ccys_.Select(x => x.ArrayIndex).ToArray();
   Weights = ccys_.Select(x => _RELATIVE_VOLS[x.Name]).ToArray();
   Refresh(false);
 }
Esempio n. 2
0
 public static ProductCom GetCached(ComID comid_)
 {
   if (!_CACHE.ContainsKey(comid_.ID))
     lock(_CACHE)
       if(!_CACHE.ContainsKey(comid_.ID))
         _CACHE.Add(comid_.ID, new ProductCom(comid_));
   return _CACHE[comid_.ID];
 }
Esempio n. 3
0
    public static ConstructGen<PairTrade> CalculateWeights(ComID[] commodities_)
    {
      // calculate the weighting
      var con = new ConstructGen<PairTrade>(commodities_.Select(x => x.Name).ToArray());

      for (int i = 0; i < con.ArrayLength; ++i)
        con.SetColumnValues(i, CalculateWeights(commodities_[i]));

      if (con.NeedsToSortKeys())
        con.SortKeys();

      return con;
    }
Esempio n. 4
0
    public static void Go(ComID[] commodities_, bool dispBW_=false)
    {
      var wts = CalculateWeights(commodities_);
      //wts.DisplayInGrid("weightings");
      var pnl = DoPnl(commodities_, wts);
      //pnl.DisplayInGrid("pnl");
      //return;

      var eval = new ReturnsEval.DataSeriesEvaluator("blah", ReturnsEval.DataSeriesType.Returns);

      var weightedBW = !dispBW_ ? null : DoBW(commodities_, wts);

      for (int i = 0; i < pnl.ArrayLength; ++i)
      {
        var comPnl = pnl.GetColumnValuesAsDDC(i);
        eval.AddInnerSeries(comPnl.Dates, comPnl.Data, pnl.ColumnHeadings[i]);

        if (weightedBW != null)
        {
          var chart = new SI.Controls.LineChartDataDisplay();
          chart.AddSeries(
            dates_: comPnl.Dates,
            values_: comPnl.ToCumulative().Data,
            desc_: "pnl",
            yAxisExtent_: 40,
            yLabelFormat_: "##0.0#%",
            yAxisLeft_: true);

          var com = weightedBW.GetColumnValuesAsDDC(i);

          com = new DatedDataCollectionGen<double>(wts.Dates.ToArray(), wts.Dates.Select(x => com.ValueOnDate(x)).ToArray());

          chart.AddSeries(
            dates_: com.Dates,
            values_: com.Data,
            desc_: "bw",
            yAxisExtent_: 40,
            yLabelFormat_: "##0.0###%",
            yAxisLeft_: false);

          chart.DisplayInShowForm(commodities_[i].Mnemonic);
        }
      }

      eval.Evaluate();

      eval.Display();
    }
Esempio n. 5
0
    public static DatedDataCollectionGen<PairTrade> CalculateWeights(ComID comID_)
    {
      var contracts = Singleton<ComFuturesMetas>.Instance.Where(x => x.ComID == comID_.ID).OrderBy(x => x.LastLastDate);

      var startDate = new DateTime(2001, 1, 2);  // only have date up until april now
      var endDate = new DateTime(2015, 3, 1);

      var numContractsToConsider = 6;
      var minNumContract = 4;

      var rebalDates = Backtest.Trader.GenerateRebalDates(Backtest.RebalFreq.Monthly, startDate);

      var dates = new List<DateTime>();
      var vals = new List<PairTrade>();

      for(int i=0;i<rebalDates.Count && rebalDates[i]<endDate ;++i)
      {
        var rebalDate = rebalDates[i];

        //if (rebalDate == new DateTime(2013, 8, 2))
        //  System.Diagnostics.Debugger.Break();

        var rebalDatePlusBuffer = rebalDate.AddDays(40d);

        // we want those contracts that are 'live' now and will be up until next rebal date

        var contractsForDate =
          contracts.Where(
            x =>
              x.FirstTrade < rebalDate && x.LastLastDate > rebalDatePlusBuffer 
              && x.Prices != null && x.Prices.HasDate(rebalDate))
            .OrderBy(x => x.LastLastDate)
            .Take(numContractsToConsider)
            .ToArray();

        if (contractsForDate.Length < minNumContract)
          continue;

        var prices = new double[contractsForDate.Length];

        bool zeroPrice = false;

        for (int c = 0; c < contractsForDate.Length; ++c)
        {
          var conPxs = contractsForDate[c].Prices;

          prices[c] = conPxs.ValueOnExactDate(rebalDate);

          if (prices[c] == 0d) zeroPrice = true;
        }

        if (zeroPrice)
          continue;

        // make it the same length as prices for ease of index, although first entry will be empty
        var backw_cont = new double[prices.Length];
        for (int c = 0; c < backw_cont.Length - 1; ++c)
          backw_cont[c+1] = ((prices[c]/prices[c+1]) - 1d)/
                          Convert.ToDouble((contractsForDate[c + 1].LastTrade - contractsForDate[c].LastTrade).Days); // divide by the day gap between the contract prices to standardize

        int maxBwIndex = 0;
        int maxContIndex = 0;

        for (int c = 1; c < backw_cont.Length; ++c)
        {
          maxBwIndex = backw_cont[maxBwIndex] > backw_cont[c] ? maxBwIndex : c;
          maxContIndex = backw_cont[maxContIndex] < backw_cont[c] ? maxContIndex : c;
        }

        // long the most backwardated, short the most contangoed

        dates.Add(rebalDate);
        vals.Add(new PairTrade()
        {
          Trade1 = new Trade()
          {
            Future = contractsForDate[maxBwIndex],
            Weight = 1d
          },
          Trade2 = new Trade()
          {
            Future = contractsForDate[maxContIndex],
            Weight = -1d
          },
          ContractsConsidered=contractsForDate,
        });
      }

      return new DatedDataCollectionGen<PairTrade>(dates.ToArray(), vals.ToArray());
    }
Esempio n. 6
0
    public static ConstructGen<double> DoBW(ComID[] coms_, ConstructGen<PairTrade> pairTrades_)
    {
      var conRets = new ConstructGen<double>(coms_.Select(x => x.Name).ToArray());

      for (int rebalIndex = 0; rebalIndex < pairTrades_.Dates.Count; ++rebalIndex)
      {
        var rebalDate = pairTrades_.Dates[rebalIndex];
        var tradeEndDate = (rebalIndex < (pairTrades_.Dates.Count - 1) ? pairTrades_.Dates[rebalIndex + 1] : DateTime.Today);

        var pairTradesOnDay = pairTrades_.GetValues(rebalDate);

        for (int i = 0; i < pairTradesOnDay.Length; ++i)
        {
          var pairTrade = pairTradesOnDay[i];

          if (pairTrade == null)
            continue;

          var rets = pairTrade.WeightedBackwardation.GetSubValues(rebalDate.AddDays(1d), tradeEndDate);

          rets = rets.DivideBy(pairTrade.GetStdev(rebalDate, 63) * 3000d);

          conRets.SetColumnValues(i, rets);
        }
      }

      conRets.SortKeys();

      conRets = conRets.ProcessEachCell(x => (double.IsNaN(x) || double.IsInfinity(x) || double.IsNegativeInfinity(x) ? 0d : x));

      return conRets;
    }
Esempio n. 7
0
    /// <summary>
    /// This is the version that goes short the front and long the 3rd
    /// </summary>
    /// <param name="comID_"></param>
    /// <returns></returns>
    public static DatedDataCollectionGen<PairTrade> CalculateWeightsStatic(ComID comID_)
    {
      var contracts = Singleton<ComFuturesMetas>.Instance.Where(x => x.ComID == comID_.ID).OrderBy(x => x.LastLastDate);

      var startDate = new DateTime(2001, 1, 2);  // only have date up until april now
      var endDate = new DateTime(2015, 3, 1);

      var minNumContract = 7;

      var rebalDates = Backtest.Trader.GenerateRebalDates(Backtest.RebalFreq.Monthly, startDate);

      var dates = new List<DateTime>();
      var vals = new List<PairTrade>();

      for (int i = 0; i < rebalDates.Count && rebalDates[i] < endDate; ++i)
      {
        var rebalDate = rebalDates[i];
        var rebalDatePlusBuffer = rebalDate.AddDays(40d);

        // we want those contracts that are 'live' now and will be up until next rebal date

        var contractsForDate =
          contracts.Where(
            x =>
              x.FirstTrade < rebalDate && x.LastLastDate > rebalDatePlusBuffer && x.Prices != null &&
              x.Prices.HasDate(rebalDate))
            .OrderBy(x => x.LastLastDate)
            .ToArray();

        if (contractsForDate.Length < minNumContract)
          continue;

        // short the front, long the third
        dates.Add(rebalDate);
        vals.Add(new PairTrade()
        {
          Trade1 = new Trade()
          {
            Future = contractsForDate[4],
            Weight = 1d
          },
          Trade2 = new Trade()
          {
            Future = contractsForDate[1],
            Weight = -1d
          },
          ContractsConsidered = contractsForDate
        });
      }

      return new DatedDataCollectionGen<PairTrade>(dates.ToArray(), vals.ToArray());
    }
Esempio n. 8
0
 public MonthYearOffset(ComID underlying_, int yearOffset_, MonthCode month_)
 {
   Underlying = underlying_;
   YearOffset = yearOffset_;
   Month = month_;
 }
Esempio n. 9
0
 public ProductCom(ComID ccy_)
   : base(ccy_)
 {
 }