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); }
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]; }
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; }
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(); }
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()); }
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; }
/// <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()); }
public MonthYearOffset(ComID underlying_, int yearOffset_, MonthCode month_) { Underlying = underlying_; YearOffset = yearOffset_; Month = month_; }
public ProductCom(ComID ccy_) : base(ccy_) { }