diff --git a/MarketDataLib/Generator/Momentum/Backtest.cs b/MarketDataLib/Generator/Momentum/Backtest.cs index 6320592..1a10feb 100644 --- a/MarketDataLib/Generator/Momentum/Backtest.cs +++ b/MarketDataLib/Generator/Momentum/Backtest.cs @@ -1,14 +1,9 @@ using System; using System.Collections.Generic; -using System.Text; using MarketData.MarketDataModel; using MarketData.DataAccess; using MarketData.Utils; using System.Linq; -using MarketData.Helper; -using MarketData.Numerical; -using System.Threading; -using MarketData.Integration; using MarketData.Cache; using MarketData.Generator.Model; @@ -396,18 +391,7 @@ namespace MarketData.Generator.Momentum if(!ActivePositions.ContainsKey(slotIndex)) { Positions positions = null; -// if (Configuration.RiskAllocation.Equals(MGConfiguration.RISK_ALLOCATION_SHARPE_RATIO)) -// { -// positions=BuyPositionsWithSharpeRatioRiskAllocation(TradeDate,AnalysisDate,CashBalance/((double)HoldingPeriod-(double)ActivePositions.Count),SymbolsHeld(TradeDate)); -//// positions = BuyPositionsWithSharpeRatioRiskAllocation(TradeDate, AnalysisDate, CashBalance / ((double)HoldingPeriod - (double)ActivePositions.Count), ActivePositions.SymbolsHeld()); -// } -// else -// { -// positions=BuyPositions(TradeDate,AnalysisDate,CashBalance/((double)HoldingPeriod-(double)ActivePositions.Count),SymbolsHeld(TradeDate)); -//// positions = BuyPositions(TradeDate, AnalysisDate, CashBalance / ((double)HoldingPeriod - (double)ActivePositions.Count), ActivePositions.SymbolsHeld()); -// } positions=BuyPositions(TradeDate,AnalysisDate,CashBalance/((double)HoldingPeriod-(double)ActivePositions.Count),SymbolsHeld(TradeDate)); - // positions = BuyPositions(TradeDate, AnalysisDate, CashBalance / ((double)HoldingPeriod - (double)ActivePositions.Count), ActivePositions.SymbolsHeld()); MDTrace.WriteLine(LogLevel.DEBUG, "******************** B U Y ********************"); positions.Display(); if(CashBalance-positions.Exposure<0.00) @@ -433,17 +417,6 @@ namespace MarketData.Generator.Momentum cashAllocation = Math.Min(CashBalance, (ActivePositions.GetExposure() + CashBalance) / (double)HoldingPeriod); MDTrace.WriteLine(LogLevel.DEBUG,String.Format("CASH ALLOCATION:{0}",Utility.FormatCurrency(cashAllocation))); Positions positions = null; -// if (Configuration.RiskAllocation.Equals(MGConfiguration.RISK_ALLOCATION_SHARPE_RATIO)) -// { -// positions = BuyPositionsWithSharpeRatioRiskAllocation(TradeDate, AnalysisDate, cashAllocation, SymbolsHeld(TradeDate)); -// // positions=BuyPositionsWithSharpeRatioRiskAllocation(TradeDate,AnalysisDate,cashAllocation,ActivePositions.SymbolsHeld()); -// } -// else -// { -//// positions = BuyPositions(TradeDate, AnalysisDate, cashAllocation, ActivePositions.SymbolsHeld()); -// positions=BuyPositions(TradeDate,AnalysisDate,cashAllocation,SymbolsHeld(TradeDate)); -// } - // positions = BuyPositions(TradeDate, AnalysisDate, cashAllocation, ActivePositions.SymbolsHeld()); positions=BuyPositions(TradeDate,AnalysisDate,cashAllocation,SymbolsHeld(TradeDate)); MDTrace.WriteLine(LogLevel.DEBUG,"********************** B U Y ********************"); positions.Display(); @@ -557,7 +530,7 @@ namespace MarketData.Generator.Momentum else position.CurrentPrice=price.Close; } // *************************************************************************************************************************************************** -// *************************************************** B U Y P O S I T I O N S N O R I S K A L L O C A T I O N ******************************* +// ******************************************************** B U Y P O S I T I O N S ************************************************************* // *************************************************************************************************************************************************** private Positions BuyPositions(DateTime tradeDate, DateTime analysisDate, double cash, List symbolsHeld) { @@ -621,102 +594,6 @@ namespace MarketData.Generator.Momentum } return positions; } -// ****************************************************************************************************************************************************************** -// ********************************************** U S E S H A R P E R A T I O F O R P O S I T I O N S I Z I N G *********************************************** -// ****************************************************************************************************************************************************************** - //private Positions BuyPositionsWithSharpeRatioRiskAllocation(DateTime tradeDate, DateTime analysisDate, double cash, List symbolsHeld) - //{ - // MDTrace.WriteLine(LogLevel.DEBUG, "**BUY_POSITIONS_WITH_SHARPE_RATIO_RISK_ALLOCATION**"); - // Positions positions = new Positions(); - // if (Configuration.BenchmarkMode) return BuyBenchmarkPositions(tradeDate, cash); - // MomentumCandidates momentumCandidates = MomentumGenerator.GenerateMomentum(tradeDate, symbolsHeld, Configuration); - // positions = PositonSizingWithSharpeRatioRiskAllocation(momentumCandidates, tradeDate, cash); - // if (0 == positions.Count && Configuration.UseFallbackCandidate) // if we don't get any signals then consider the fallback candidate options as per the configuration file - // { - // String fallbackCandidate = Configuration.FallbackCandidate; - // if (null != Configuration.FallbackCandidateBestOf && !"".Equals(Configuration.FallbackCandidateBestOf)) - // { - // QualityIndicator qualityIndicator=new QualityIndicator(Configuration.QualityIndicatorType); - // fallbackCandidate=CandidateSelector.SelectBestCandidateSymbol(qualityIndicator,Utility.ToList(Configuration.FallbackCandidateBestOf),Configuration.FallbackCandidate,tradeDate); - // } - // Price price = GBPriceCache.GetInstance().GetPrice(fallbackCandidate, tradeDate); - // if (null == price) - // { - // MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Cannot locate a price for {0} on {1}", fallbackCandidate, Utility.DateTimeToStringMMHDDHYYYY(tradeDate))); - // return positions; - // } - // Position position = new Position(); - // position.Symbol = fallbackCandidate; - // position.PurchaseDate = tradeDate; - // position.PurchasePrice = price.Close; - // position.CurrentPrice = price.Close; - // position.Shares = (int)Math.Floor(cash / position.PurchasePrice); - // positions.Add(position); - // } - // return positions; - //} - private Positions PositonSizingWithSharpeRatioRiskAllocation(MomentumCandidates momentumCandidates,DateTime tradeDate,double cash) - { - Positions positions = new Positions(); - List riskAllocations = new List(); - for (int index = 0; index < momentumCandidates.Count; index++) - { - MomentumCandidate momentumCandidate = momentumCandidates[index]; - Price price = GBPriceCache.GetInstance().GetPrice(momentumCandidate.Symbol, tradeDate); - if (null == price) - { - MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Cannot locate a price for {0} on {1}", momentumCandidate.Symbol, Utility.DateTimeToStringMMHDDHYYYY(tradeDate))); - continue; - } - Position position = new Position(); - position.Symbol = momentumCandidate.Symbol; - position.CumReturn252 = momentumCandidate.CumReturn252; - position.IDIndicator = momentumCandidate.IDIndicator; - position.Score=momentumCandidate.Score; - position.MaxDrawdown = momentumCandidate.MaxDrawdown; - position.MaxUpside = momentumCandidate.MaxUpside; - position.PE = momentumCandidate.PE; - position.Beta = momentumCandidate.Beta; - position.ZacksRank = momentumCandidate.ZacksRank; - position.Velocity = momentumCandidate.Velocity; - position.Volume = momentumCandidate.Volume; - position.Return1D = position.Return1D; - position.PurchaseDate = tradeDate; - position.PurchasePrice = price.Close; - position.CurrentPrice = price.Close; - position.SharpeRatio = SharpeRatioGenerator.GenerateSharpeRatio(position.Symbol, tradeDate); - position.Shares = 0.00; - if (double.IsNaN(position.SharpeRatio)||0.00==position.SharpeRatio) continue; - //WatchListDA.AddToWatchList(position.Symbol, "Momentum"); - positions.Add(position); - } - if (null == positions || 0 == positions.Count) return positions; - positions = new Positions(positions.Take(MaxPositions).ToList()); - double minSharpeRatio = positions.Min(x => x.SharpeRatio); - for (int index = 0; index < positions.Count; index++) - { - Position position = positions[index]; - SRRiskAllocation riskAllocation = new SRRiskAllocation(); - riskAllocation.Symbol = position.Symbol; - riskAllocation.SharpeRatioBaseOne = minSharpeRatio < 0.00 ? position.SharpeRatio + Math.Abs(minSharpeRatio) + 1.00 : position.SharpeRatio; - riskAllocations.Insert(index, riskAllocation); - } - double sumSharpeRatioBaseOne = riskAllocations.Sum(x => x.SharpeRatioBaseOne); - riskAllocations.Select(t => t.Weight = t.SharpeRatioBaseOne/sumSharpeRatioBaseOne).ToList(); - riskAllocations.Select(t => t.Allocation = t.Weight*cash).ToList(); - for (int index = 0; index < positions.Count; index++) - { - Position position = positions[index]; - SRRiskAllocation riskAllocation = riskAllocations[index]; - if (!position.Symbol.Equals(riskAllocation.Symbol)) throw new Exception("RiskAllocation items are not in sequence with positions."); - position.Shares = Math.Floor(riskAllocation.Allocation/position.PurchasePrice); - } - positions =new Positions(positions.Where(x => x.Shares > 0).ToList()); - return positions; - } -// ********************************************************************************************************************************************************************* -// ********************************************************* E N D S H A R P E R A T I O R I S K A L L O C A T I O N ***************************************** -// ********************************************************************************************************************************************************************* private Positions BuyBenchmarkPositions(DateTime tradeDate, double cash) { Positions positions = new Positions(); @@ -735,7 +612,9 @@ namespace MarketData.Generator.Momentum positions.Add(position); return positions; } -// *********************************************************************************************************************************************************** +// ********************************************************************************************************************************************************************* +// ************************************************************ E N D B U Y P O S I T I O N S *********************************************** +// ********************************************************************************************************************************************************************* private void DisplayBalance() { MDTrace.WriteLine(LogLevel.DEBUG,"*******************************************");