[Quantproject-developers] QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoose
Brought to you by:
glauco_1
|
From: Glauco S. <gla...@us...> - 2008-11-17 19:51:15
|
Update of /cvsroot/quantproject/QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv20901/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers Modified Files: OutOfSampleChooser.cs Log Message: - changed to handler intraday strategy - outOfSampleReturnIntervals are not used anymore - now, the inefficiency is tested between two intraday DateTime(s) Index: OutOfSampleChooser.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers/OutOfSampleChooser.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** OutOfSampleChooser.cs 29 Sep 2008 21:19:47 -0000 1.2 --- OutOfSampleChooser.cs 17 Nov 2008 19:51:04 -0000 1.3 *************** *** 19,23 **** along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! */ using System; --- 19,23 ---- along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! */ using System; *************** *** 72,75 **** --- 72,87 ---- #region GetPositionsToBeOpened + + private void checkParameters( + DateTime firstDateTimeToTestInefficiency , + DateTime lastDateTimeToTestInefficiency ) + { + if ( firstDateTimeToTestInefficiency >= lastDateTimeToTestInefficiency ) + throw new Exception( + "The first date time to test inefficiency must be strictly before " + + "the last date time to test inefficiency." ); + } + + #region getPositionsToBeOpened_actually #region getInefficientCouples *************** *** 78,82 **** private DateTime getIntervalBeginForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { // this method will be invoked only if (this.returnIntervals.Count >= 2) --- 90,94 ---- private DateTime getIntervalBeginForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { // this method will be invoked only if (this.returnIntervals.Count >= 2) *************** *** 89,93 **** private DateTime getIntervalEndForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { return outOfSampleReturnIntervals.LastInterval.Begin; --- 101,105 ---- private DateTime getIntervalEndForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { return outOfSampleReturnIntervals.LastInterval.Begin; *************** *** 95,117 **** private ReturnInterval getReturnIntervalForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { ! DateTime intervalBegin = ! this.getIntervalBeginForLastSecondPhaseInterval( ! outOfSampleReturnIntervals ); ! DateTime intervalEnd = ! this.getIntervalEndForLastSecondPhaseInterval( ! outOfSampleReturnIntervals ); ReturnInterval returnIntervalForLastSecondPhaseInterval = ! new ReturnInterval( intervalBegin , intervalEnd ); return returnIntervalForLastSecondPhaseInterval; } private ReturnIntervals getReturnIntervalsForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals ) { ReturnInterval returnIntervalForLastSecondPhaseInterval = this.getReturnIntervalForLastSecondPhaseInterval( ! outOfSampleReturnIntervals ); ReturnIntervals returnIntervalsForLastSecondPhaseInterval = new ReturnIntervals( returnIntervalForLastSecondPhaseInterval ); --- 107,139 ---- private ReturnInterval getReturnIntervalForLastSecondPhaseInterval( ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency ! // ReturnIntervals outOfSampleReturnIntervals ! ) { ! // DateTime intervalBegin = ! // this.getIntervalBeginForLastSecondPhaseInterval( ! // outOfSampleReturnIntervals ); ! // DateTime intervalEnd = ! // this.getIntervalEndForLastSecondPhaseInterval( ! // outOfSampleReturnIntervals ); ReturnInterval returnIntervalForLastSecondPhaseInterval = ! new ReturnInterval( ! firstDateTimeToTestInefficiency , lastDateTimeToTestInefficiency ); return returnIntervalForLastSecondPhaseInterval; } private ReturnIntervals getReturnIntervalsForLastSecondPhaseInterval( ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency ! // ReturnIntervals outOfSampleReturnIntervals ! ) { ReturnInterval returnIntervalForLastSecondPhaseInterval = this.getReturnIntervalForLastSecondPhaseInterval( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency ! // outOfSampleReturnIntervals ! ); ReturnIntervals returnIntervalsForLastSecondPhaseInterval = new ReturnIntervals( returnIntervalForLastSecondPhaseInterval ); *************** *** 119,123 **** } private ReturnsManager getReturnsManagerForLastSecondPhaseInterval( ! ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) --- 141,147 ---- } private ReturnsManager getReturnsManagerForLastSecondPhaseInterval( ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) *************** *** 125,138 **** ReturnIntervals returnIntervals = this.getReturnIntervalsForLastSecondPhaseInterval( ! outOfSampleReturnIntervals ); ! // ReturnsManager returnsManager = ! // new ReturnsManager( returnIntervals , ! // this.historicalAdjustedQuoteProvider ); ReturnsManager returnsManager = new ReturnsManager( returnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); return returnsManager; } #endregion getReturnsManagerForLastSecondPhaseInterval private double getReturnForTheLastSecondPhaseInterval( ReturnsManager returnsManagerForLastSecondPhaseInterval , --- 149,163 ---- ReturnIntervals returnIntervals = this.getReturnIntervalsForLastSecondPhaseInterval( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency ! // outOfSampleReturnIntervals ! ); ReturnsManager returnsManager = new ReturnsManager( returnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); return returnsManager; } #endregion getReturnsManagerForLastSecondPhaseInterval + private double getReturnForTheLastSecondPhaseInterval( ReturnsManager returnsManagerForLastSecondPhaseInterval , *************** *** 143,147 **** double returnForTheLastSecondPhaseInterval = weightedPositions.GetReturn( 0 , ! returnsManagerForLastSecondPhaseInterval ); return returnForTheLastSecondPhaseInterval; } --- 168,172 ---- double returnForTheLastSecondPhaseInterval = weightedPositions.GetReturn( 0 , ! returnsManagerForLastSecondPhaseInterval ); return returnForTheLastSecondPhaseInterval; } *************** *** 171,176 **** private WeightedPositions getPositionsIfInefficiencyIsInTheRange( ! ReturnsManager returnsManagerForLastSecondPhaseInterval , ! WeightedPositions currentWeightedPositions ) { WeightedPositions weightedPositionsToBeOpened = null; --- 196,201 ---- private WeightedPositions getPositionsIfInefficiencyIsInTheRange( ! ReturnsManager returnsManagerForLastSecondPhaseInterval , ! WeightedPositions currentWeightedPositions ) { WeightedPositions weightedPositionsToBeOpened = null; *************** *** 179,195 **** double returnForTheLastSecondPhaseInterval = this.getReturnForTheLastSecondPhaseInterval( ! returnsManagerForLastSecondPhaseInterval , ! currentWeightedPositions ); if ( ( returnForTheLastSecondPhaseInterval >= ! this.minThresholdForGoingLong ) && ! ( returnForTheLastSecondPhaseInterval <= ! this.maxThresholdForGoingLong ) ) // it looks like there has been an inefficiency that // might be recovered, by going short weightedPositionsToBeOpened = currentWeightedPositions.Opposite; if ( ( -returnForTheLastSecondPhaseInterval >= ! this.minThresholdForGoingShort ) && ! ( -returnForTheLastSecondPhaseInterval <= ! this.maxThresholdForGoingShort ) ) // it looks like there has been an inefficiency that // might be recovered, by going long --- 204,220 ---- double returnForTheLastSecondPhaseInterval = this.getReturnForTheLastSecondPhaseInterval( ! returnsManagerForLastSecondPhaseInterval , ! currentWeightedPositions ); if ( ( returnForTheLastSecondPhaseInterval >= ! this.minThresholdForGoingLong ) && ! ( returnForTheLastSecondPhaseInterval <= ! this.maxThresholdForGoingLong ) ) // it looks like there has been an inefficiency that // might be recovered, by going short weightedPositionsToBeOpened = currentWeightedPositions.Opposite; if ( ( -returnForTheLastSecondPhaseInterval >= ! this.minThresholdForGoingShort ) && ! ( -returnForTheLastSecondPhaseInterval <= ! this.maxThresholdForGoingShort ) ) // it looks like there has been an inefficiency that // might be recovered, by going long *************** *** 204,211 **** private void addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( ! TestingPositions[] bestTestingPositionsInSample , ! ReturnsManager returnsManagerForLastSecondPhaseInterval , ! int currentTestingPositionsIndex , ! ArrayList inefficientCouples ) { WeightedPositions currentWeightedPositions = --- 229,236 ---- private void addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( ! TestingPositions[] bestTestingPositionsInSample , ! ReturnsManager returnsManagerForLastSecondPhaseInterval , ! int currentTestingPositionsIndex , ! ArrayList inefficientCouples ) { WeightedPositions currentWeightedPositions = *************** *** 215,219 **** WeightedPositions weightedPositionsThatMightBeOpended = this.getPositionsIfInefficiencyIsInTheRange( ! returnsManagerForLastSecondPhaseInterval , candidateForPortfolio ); if ( weightedPositionsThatMightBeOpended != null ) // the current couple has not an inefficiency that's in the range --- 240,244 ---- WeightedPositions weightedPositionsThatMightBeOpended = this.getPositionsIfInefficiencyIsInTheRange( ! returnsManagerForLastSecondPhaseInterval , candidateForPortfolio ); if ( weightedPositionsThatMightBeOpended != null ) // the current couple has not an inefficiency that's in the range *************** *** 226,231 **** ArrayList inefficientCouples = new ArrayList(); for ( int currentTestingPositionsIndex = 0 ; ! currentTestingPositionsIndex < bestTestingPositionsInSample.Length ; ! currentTestingPositionsIndex++ ) this.addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( bestTestingPositionsInSample , --- 251,256 ---- ArrayList inefficientCouples = new ArrayList(); for ( int currentTestingPositionsIndex = 0 ; ! currentTestingPositionsIndex < bestTestingPositionsInSample.Length ; ! currentTestingPositionsIndex++ ) this.addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( bestTestingPositionsInSample , *************** *** 233,266 **** currentTestingPositionsIndex , inefficientCouples ); - // - // while ( ( weightedPositionsToBeOpended == null ) - // && ( currentTestingPositionsIndex < bestTestingPositionsInSample.Length ) ) - // { - // weightedPositionsToBeOpended = - // this.getPositionsToBeOpenedWithRespectToCurrentWeightedPositions( - // bestTestingPositionsInSample , - // returnsManagerForLastSecondPhaseInterval , - // currentTestingPositionsIndex ); - // currentTestingPositionsIndex++; - // } - // return weightedPositionsToBeOpended; return inefficientCouples; } private ArrayList getArrayListOfInefficientCouples( ! TestingPositions[] bestTestingPositionsInSample , ! ReturnIntervals outOfSampleReturnIntervals , ! HistoricalMarketValueProvider ! historicalMarketValueProviderForChosingPositionsOutOfSample ) { ReturnsManager returnsManagerForLastSecondPhaseInterval = this.getReturnsManagerForLastSecondPhaseInterval( ! outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); ArrayList inefficientCouples = this.getInefficientCouples( bestTestingPositionsInSample , ! returnsManagerForLastSecondPhaseInterval ); return inefficientCouples; } #region getInefficientCouplesFromArrayList private WeightedPositions[] getInefficientCouplesFromArrayList_actually( --- 258,284 ---- currentTestingPositionsIndex , inefficientCouples ); return inefficientCouples; } private ArrayList getArrayListOfInefficientCouples( ! TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , ! HistoricalMarketValueProvider ! historicalMarketValueProviderForChosingPositionsOutOfSample ) { ReturnsManager returnsManagerForLastSecondPhaseInterval = this.getReturnsManagerForLastSecondPhaseInterval( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! // outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); ArrayList inefficientCouples = this.getInefficientCouples( bestTestingPositionsInSample , ! returnsManagerForLastSecondPhaseInterval ); return inefficientCouples; } + #region getInefficientCouplesFromArrayList private WeightedPositions[] getInefficientCouplesFromArrayList_actually( *************** *** 282,339 **** inefficientCouples = this.getInefficientCouplesFromArrayList_actually( ! arrayListOfInefficientCouples ); return inefficientCouples; } #endregion getInefficientCouplesFromArrayList private WeightedPositions[] getInefficientCouples_withAtLeastASecondPhaseInterval( ! TestingPositions[] bestTestingPositionsInSample , ! ReturnIntervals outOfSampleReturnIntervals , ! HistoricalMarketValueProvider ! historicalMarketValueProviderForChosingPositionsOutOfSample ) { ArrayList arrayListOfInefficientCouples = this.getArrayListOfInefficientCouples( ! bestTestingPositionsInSample , ! outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); WeightedPositions[] inefficientCouples = this.getInefficientCouplesFromArrayList( arrayListOfInefficientCouples ); return inefficientCouples; } - // private WeightedPositions - // getInfefficientCouples_withAtLeastASecondPhaseInterval( - // TestingPositions[] bestTestingPositionsInSample , - // ReturnIntervals outOfSampleReturnIntervals , - // IHistoricalQuoteProvider - // historicalQuoteProviderForChosingPositionsOutOfSample ) - // { - // WeightedPositions weightedPositions = - // this.getPositionsToBeOpened_withAtLeastASecondPhaseInterval_actually( - // bestTestingPositionsInSample , - // outOfSampleReturnIntervals , - // historicalQuoteProviderForChosingPositionsOutOfSample ); - //// WeightedPositions weightedPositionsToBeReturned = null; - //// if ( weightedPositions != null ) - //// // at least one of the BestTestingPositions shows an inefficiency - //// // above the threshold - //// weightedPositionsToBeReturned = - //// selectWeightedPositions( weightedPositions ); - //// return weightedPositionsToBeReturned; - // return weightedPositions; - // } private WeightedPositions[] getInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) { WeightedPositions[] inefficientCouples = null; ! if ( outOfSampleReturnIntervals.Count >= 2 ) ! // at least a second phase interval exists ! inefficientCouples = ! this.getInefficientCouples_withAtLeastASecondPhaseInterval( bestTestingPositionsInSample , ! outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); return inefficientCouples; --- 300,345 ---- inefficientCouples = this.getInefficientCouplesFromArrayList_actually( ! arrayListOfInefficientCouples ); return inefficientCouples; } #endregion getInefficientCouplesFromArrayList + private WeightedPositions[] getInefficientCouples_withAtLeastASecondPhaseInterval( ! TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , ! HistoricalMarketValueProvider ! historicalMarketValueProviderForChosingPositionsOutOfSample ) { ArrayList arrayListOfInefficientCouples = this.getArrayListOfInefficientCouples( ! bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! // outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); WeightedPositions[] inefficientCouples = this.getInefficientCouplesFromArrayList( arrayListOfInefficientCouples ); return inefficientCouples; } private WeightedPositions[] getInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) { WeightedPositions[] inefficientCouples = null; ! // if ( outOfSampleReturnIntervals.Count >= 2 ) ! // // at least a second phase interval exists ! inefficientCouples = ! this.getInefficientCouples_withAtLeastASecondPhaseInterval( bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); return inefficientCouples; *************** *** 341,344 **** --- 347,377 ---- } #endregion getInefficientCouples + + private WeightedPositions getPositionsToBeOpened_actually( + TestingPositions[] bestTestingPositionsInSample , + DateTime firstDateTimeToTestInefficiency , + DateTime lastDateTimeToTestInefficiency , + // ReturnIntervals outOfSampleReturnIntervals , + HistoricalMarketValueProvider + historicalMarketValueProviderForChosingPositionsOutOfSample , + ReturnsManager inSampleReturnsManager ) + { + WeightedPositions positionsToBeOpened = null; + WeightedPositions[] inefficientCouples = + this.getInefficientCouples( + bestTestingPositionsInSample , + firstDateTimeToTestInefficiency , + lastDateTimeToTestInefficiency , + // outOfSampleReturnIntervals , + historicalMarketValueProviderForChosingPositionsOutOfSample ); + if ( inefficientCouples != null ) + // at least an inefficient couple has been found + positionsToBeOpened = + this.getPositionsToBeOpened( inefficientCouples , + inSampleReturnsManager ); + return positionsToBeOpened; + } + #endregion getPositionsToBeOpened_actually + /// <summary> /// Selects the WeghtedPositions to actually be opened *************** *** 346,351 **** /// <param name="bestTestingPositionsInSample">most correlated couples, /// in sample</param> - /// <param name="outOfSampleReturnIntervals">return intervals for - /// the current backtest</param> /// <param name="minThreshold">min requested inefficiency</param> /// <param name="maxThreshold">max allowed inefficiency</param> --- 379,382 ---- *************** *** 354,372 **** public virtual WeightedPositions GetPositionsToBeOpened( TestingPositions[] bestTestingPositionsInSample , ! ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample , ReturnsManager inSampleReturnsManager ) { ! WeightedPositions positionsToBeOpened = null; ! WeightedPositions[] inefficientCouples = ! this.getInefficientCouples( ! bestTestingPositionsInSample , ! outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); ! if ( inefficientCouples != null ) ! // at least an inefficient couple has been found ! positionsToBeOpened = ! this.getPositionsToBeOpened( inefficientCouples , inSampleReturnsManager ); return positionsToBeOpened; --- 385,403 ---- public virtual WeightedPositions GetPositionsToBeOpened( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample , ReturnsManager inSampleReturnsManager ) { ! this.checkParameters( ! firstDateTimeToTestInefficiency , lastDateTimeToTestInefficiency ); ! WeightedPositions positionsToBeOpened = ! this.getPositionsToBeOpened_actually( ! bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! historicalMarketValueProviderForChosingPositionsOutOfSample , inSampleReturnsManager ); return positionsToBeOpened; *************** *** 382,387 **** if ( inefficientCouple.Count != 2 ) throw new Exception( "The method getLongPositionTickers() expects " + ! "an array of WeightedPositions, each of wich contains exactly " + ! "two positions!" ); } private void addPositionIfLong( --- 413,418 ---- if ( inefficientCouple.Count != 2 ) throw new Exception( "The method getLongPositionTickers() expects " + ! "an array of WeightedPositions, each of wich contains exactly " + ! "two positions!" ); } private void addPositionIfLong( *************** *** 391,396 **** { if ( ( weightedPosition.IsLong ) && ! ( !alreadyAddedLongPositionTickers.Contains( ! weightedPosition.Ticker ) ) ) // the given weightedPosition is long and its ticker has not // yet been added to the set of tickers for long positions --- 422,427 ---- { if ( ( weightedPosition.IsLong ) && ! ( !alreadyAddedLongPositionTickers.Contains( ! weightedPosition.Ticker ) ) ) // the given weightedPosition is long and its ticker has not // yet been added to the set of tickers for long positions *************** *** 407,415 **** this.checkParameters_forCurrentCouple( inefficientCouple ); this.addPositionIfLong( inefficientCouple[ 0 ] , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); this.addPositionIfLong( inefficientCouple[ 1 ] , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); } private ArrayList getArrayListOfLongPositionTickers( --- 438,446 ---- this.checkParameters_forCurrentCouple( inefficientCouple ); this.addPositionIfLong( inefficientCouple[ 0 ] , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); this.addPositionIfLong( inefficientCouple[ 1 ] , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); } private ArrayList getArrayListOfLongPositionTickers( *************** *** 420,425 **** foreach( WeightedPositions weightedPositions in inefficientCouples ) this.addLongPositions( weightedPositions , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); return arrayListOfLongPositionTickers; } --- 451,456 ---- foreach( WeightedPositions weightedPositions in inefficientCouples ) this.addLongPositions( weightedPositions , ! alreadyAddedLongPositionTickers , ! arrayListOfLongPositionTickers ); return arrayListOfLongPositionTickers; } |