[Quantproject-developers] QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoose
Brought to you by:
glauco_1
|
From: Glauco S. <gla...@us...> - 2009-02-18 20:05:53
|
Update of /cvsroot/quantproject/QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv8272/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers Modified Files: OutOfSampleChooser.cs Added Files: OutOfSampleChooserForAlreadyClosing.cs Log Message: This revision adds a new pairs trading approach, but it's not complete yet. We commit it anyway in order to allow a fresh checkout on a new computer. Index: OutOfSampleChooser.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/WalkForwardTesting/PairsTrading/OutOfSampleChoosers/OutOfSampleChooser.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** OutOfSampleChooser.cs 10 Dec 2008 19:38:43 -0000 1.5 --- OutOfSampleChooser.cs 18 Feb 2009 20:05:32 -0000 1.6 *************** *** 115,147 **** #region getReturnIntervalsForLastSecondPhaseInterval 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 = --- 115,145 ---- #region getReturnIntervalsForLastSecondPhaseInterval private ReturnInterval ! getReturnIntervalToTestInefficiency( ! DateTime currentDateTime ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency ) { ! // qui!!! ! DateTime firstDateTimeToTestInefficiency = ! currentDateTime.AddMinutes( 30 ); ! ReturnInterval returnIntervalForLastSecondPhaseInterval = new ReturnInterval( ! firstDateTimeToTestInefficiency , currentDateTime ); return returnIntervalForLastSecondPhaseInterval; } private ReturnIntervals ! getReturnIntervalsToTestInefficiency( ! DateTime currentDateTime ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency ) { ReturnInterval returnIntervalForLastSecondPhaseInterval = ! this.getReturnIntervalToTestInefficiency( ! currentDateTime ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency ); ReturnIntervals returnIntervalsForLastSecondPhaseInterval = *************** *** 151,166 **** #endregion getReturnIntervalsForLastSecondPhaseInterval ! private ReturnsManager getReturnsManagerForLastSecondPhaseInterval( ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) { ReturnIntervals returnIntervals = ! this.getReturnIntervalsForLastSecondPhaseInterval( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency ! // outOfSampleReturnIntervals ); ReturnsManager returnsManager = --- 149,164 ---- #endregion getReturnIntervalsForLastSecondPhaseInterval ! private ReturnsManager getReturnsManagerToTestInefficiency( ! DateTime currentDateTime , ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) { ReturnIntervals returnIntervals = ! this.getReturnIntervalsToTestInefficiency( ! currentDateTime ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency ); ReturnsManager returnsManager = *************** *** 197,201 **** TestingPositions[] bestTestingPositionsInSample , int currentTestingPositionsIndex , ! DateTime dateTimeToClosePositions , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) --- 195,199 ---- TestingPositions[] bestTestingPositionsInSample , int currentTestingPositionsIndex , ! // DateTime dateTimeToClosePositions , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) *************** *** 203,210 **** TestingPositions currentCouple = bestTestingPositionsInSample[ currentTestingPositionsIndex ]; ! bool areAllAvailable = ! this.areAllNeededMarketValuesAvailableForTheCurrentCouple( ! currentCouple , dateTimeToClosePositions , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); return areAllAvailable; } --- 201,209 ---- TestingPositions currentCouple = bestTestingPositionsInSample[ currentTestingPositionsIndex ]; ! bool areAllAvailable = true; ! // qui!!! ! // this.areAllNeededMarketValuesAvailableForTheCurrentCouple( ! // currentCouple , dateTimeToClosePositions , ! // historicalMarketValueProviderForChosingPositionsOutOfSample ); return areAllAvailable; } *************** *** 243,252 **** return returnForTheLastSecondPhaseInterval; } // if the currentWeightedPositions' return satisfies the thresholds // then this method returns the WeightedPositions that might be opened. // Otherwise (currentWeightedPositions' return does NOT // satisfy the thresholds) this method returns null ! private WeightedPositions ! getPositionsIfInefficiencyIsInTheRange( ReturnsManager returnsManagerForLastSecondPhaseInterval , WeightedPositions currentWeightedPositions ) --- 242,252 ---- return returnForTheLastSecondPhaseInterval; } + // if the currentWeightedPositions' return satisfies the thresholds // then this method returns the WeightedPositions that might be opened. // Otherwise (currentWeightedPositions' return does NOT // satisfy the thresholds) this method returns null ! protected virtual WeightedPositions ! getWeightedPositionsFromCandidate( ReturnsManager returnsManagerForLastSecondPhaseInterval , WeightedPositions currentWeightedPositions ) *************** *** 294,298 **** this.getCandidateForPortfolio( currentWeightedPositions ); WeightedPositions weightedPositionsThatMightBeOpended = ! this.getPositionsIfInefficiencyIsInTheRange( returnsManagerForLastSecondPhaseInterval , candidateForPortfolio ); if ( weightedPositionsThatMightBeOpended != null ) --- 294,298 ---- this.getCandidateForPortfolio( currentWeightedPositions ); WeightedPositions weightedPositionsThatMightBeOpended = ! this.getWeightedPositionsFromCandidate( returnsManagerForLastSecondPhaseInterval , candidateForPortfolio ); if ( weightedPositionsThatMightBeOpended != null ) *************** *** 305,309 **** TestingPositions[] bestTestingPositionsInSample , ReturnsManager returnsManagerForLastSecondPhaseInterval , ! DateTime dateTimeToClosePositions , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) --- 305,309 ---- TestingPositions[] bestTestingPositionsInSample , ReturnsManager returnsManagerForLastSecondPhaseInterval , ! // DateTime dateTimeToClosePositions , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) *************** *** 317,321 **** bestTestingPositionsInSample , currentTestingPositionsIndex , ! dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample ) ) this.addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( --- 317,321 ---- bestTestingPositionsInSample , currentTestingPositionsIndex , ! // dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample ) ) this.addPositionsIfInefficiencyForCurrentCoupleIsInTheRange( *************** *** 332,338 **** getArrayListOfInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider --- 332,339 ---- getArrayListOfInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! DateTime currentDateTime , ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency , ! // DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider *************** *** 340,347 **** { ReturnsManager returnsManagerForLastSecondPhaseInterval = ! this.getReturnsManagerForLastSecondPhaseInterval( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); ArrayList inefficientCouples = --- 341,348 ---- { ReturnsManager returnsManagerForLastSecondPhaseInterval = ! this.getReturnsManagerToTestInefficiency( ! currentDateTime , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , historicalMarketValueProviderForChosingPositionsOutOfSample ); ArrayList inefficientCouples = *************** *** 349,353 **** bestTestingPositionsInSample , returnsManagerForLastSecondPhaseInterval , ! dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample ); return inefficientCouples; --- 350,354 ---- bestTestingPositionsInSample , returnsManagerForLastSecondPhaseInterval , ! // dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample ); return inefficientCouples; *************** *** 379,424 **** #endregion getInefficientCouplesFromArrayList ! private WeightedPositions[] ! getInefficientCouples_withAtLeastASecondPhaseInterval( ! TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! DateTime dateTimeToClosePositions , ! // ReturnIntervals outOfSampleReturnIntervals , ! HistoricalMarketValueProvider ! historicalMarketValueProviderForChosingPositionsOutOfSample ) ! { ! ArrayList arrayListOfInefficientCouples = ! this.getArrayListOfInefficientCouples( ! bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! dateTimeToClosePositions , ! // outOfSampleReturnIntervals , ! historicalMarketValueProviderForChosingPositionsOutOfSample ); ! WeightedPositions[] inefficientCouples = ! this.getInefficientCouplesFromArrayList( arrayListOfInefficientCouples ); ! return inefficientCouples; ! } private WeightedPositions[] getInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! DateTime dateTimeToClosePositions , // 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 , ! dateTimeToClosePositions , ! // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); return inefficientCouples; --- 380,434 ---- #endregion getInefficientCouplesFromArrayList ! // private WeightedPositions[] ! // getInefficientCouples_withAtLeastASecondPhaseInterval( ! // TestingPositions[] bestTestingPositionsInSample , ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency , ! // DateTime dateTimeToClosePositions , ! //// ReturnIntervals outOfSampleReturnIntervals , ! // HistoricalMarketValueProvider ! // historicalMarketValueProviderForChosingPositionsOutOfSample ) ! // { ! // ArrayList arrayListOfInefficientCouples = ! // this.getArrayListOfInefficientCouples( ! // bestTestingPositionsInSample , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions , ! //// outOfSampleReturnIntervals , ! // historicalMarketValueProviderForChosingPositionsOutOfSample ); ! // WeightedPositions[] inefficientCouples = ! // this.getInefficientCouplesFromArrayList( arrayListOfInefficientCouples ); ! // return inefficientCouples; ! // } private WeightedPositions[] getInefficientCouples( TestingPositions[] bestTestingPositionsInSample , ! DateTime currentDateTime , ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency , ! // DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider historicalMarketValueProviderForChosingPositionsOutOfSample ) { ! // WeightedPositions[] inefficientCouples = null; ! // inefficientCouples = ! // this.getInefficientCouples_withAtLeastASecondPhaseInterval( ! // bestTestingPositionsInSample , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions , ! // historicalMarketValueProviderForChosingPositionsOutOfSample ); ! ArrayList arrayListOfInefficientCouples = ! this.getArrayListOfInefficientCouples( bestTestingPositionsInSample , ! currentDateTime , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions , ! // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); + WeightedPositions[] inefficientCouples = + this.getInefficientCouplesFromArrayList( arrayListOfInefficientCouples ); return inefficientCouples; *************** *** 428,434 **** private WeightedPositions getPositionsToBeOpened_actually( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider --- 438,445 ---- private WeightedPositions getPositionsToBeOpened_actually( TestingPositions[] bestTestingPositionsInSample , ! DateTime currentDateTime , ! // DateTime firstDateTimeToTestInefficiency , ! // DateTime lastDateTimeToTestInefficiency , ! // DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider *************** *** 440,446 **** this.getInefficientCouples( bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! dateTimeToClosePositions , // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); --- 451,458 ---- this.getInefficientCouples( bestTestingPositionsInSample , ! currentDateTime , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions , // outOfSampleReturnIntervals , historicalMarketValueProviderForChosingPositionsOutOfSample ); *************** *** 466,472 **** public virtual WeightedPositions GetPositionsToBeOpened( TestingPositions[] bestTestingPositionsInSample , ! DateTime firstDateTimeToTestInefficiency , ! DateTime lastDateTimeToTestInefficiency , ! DateTime dateTimeToClosePositions , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider --- 478,482 ---- public virtual WeightedPositions GetPositionsToBeOpened( TestingPositions[] bestTestingPositionsInSample , ! DateTime currentDateTime , // ReturnIntervals outOfSampleReturnIntervals , HistoricalMarketValueProvider *************** *** 474,487 **** ReturnsManager inSampleReturnsManager ) { ! this.checkParameters( ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! dateTimeToClosePositions ); WeightedPositions positionsToBeOpened = this.getPositionsToBeOpened_actually( bestTestingPositionsInSample , ! firstDateTimeToTestInefficiency , ! lastDateTimeToTestInefficiency , ! dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample , inSampleReturnsManager ); --- 484,498 ---- ReturnsManager inSampleReturnsManager ) { ! // this.checkParameters( ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions ); WeightedPositions positionsToBeOpened = this.getPositionsToBeOpened_actually( bestTestingPositionsInSample , ! currentDateTime , ! // firstDateTimeToTestInefficiency , ! // lastDateTimeToTestInefficiency , ! // dateTimeToClosePositions , historicalMarketValueProviderForChosingPositionsOutOfSample , inSampleReturnsManager ); --- NEW FILE: OutOfSampleChooserForAlreadyClosing.cs --- /* QuantProject - Quantitative Finance Library OutOfSampleChooserForAlreadyClosing.cs Copyright (C) 2008 Glauco Siliprandi This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License 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; using QuantProject.Business.Strategies; using QuantProject.Business.Strategies.ReturnsManagement; namespace QuantProject.Scripts.WalkForwardTesting.PairsTrading { /// <summary> /// Chooses two positions that seem to be an arbitrage opportunity. /// Among the eligible couples, a couple is discard if any of the two tickers /// have had a either split, or dividend, or any other event that may /// have caused an overnight price adjustment /// </summary> [Serializable] public class OutOfSampleChooserForAlreadyClosing : OutOfSampleChooserForSingleLongAndShort { private int numberOfConsecutiveMinutesToSayTheInefficiencyIsClosing; public OutOfSampleChooserForAlreadyClosing( double minThresholdForGoingLong , double maxThresholdForGoingLong , double minThresholdForGoingShort , double maxThresholdForGoingShort , int numberOfConsecutiveMinutesToSayTheInefficiencyIsClosing ) : base( minThresholdForGoingLong , maxThresholdForGoingLong , minThresholdForGoingShort , maxThresholdForGoingShort ) { this.numberOfConsecutiveMinutesToSayTheInefficiencyIsClosing = numberOfConsecutiveMinutesToSayTheInefficiencyIsClosing; } #region getPositionsFromCandidate #region hasThePriceBeenAdjustedLastNight private bool hasThePriceBeenAdjustedLastNight( WeightedPositions candidate ) { // qui!!! return false; } #endregion hasThePriceBeenAdjustedLastNight #region getWeightedPositionsFromCandidateWithoutAdjustment private WeightedPositions getWeightedPositionsFromCandidateWithoutAdjustment( ReturnsManager returnsManagerForLastSecondPhaseInterval , WeightedPositions candidate ) { // qui!!!! // vedi OutOfSampleChooser.getWeightedPositionsFromCandidate(), // testa l'inefficienza allo stesso modo, ma poi aggiungi il test // per vedere se c'e' l'inizio di chiusura; devi considerare // il passaggio dei tempi: probabilmente ti converra' modificare // OutOfSampleChooserForSingleLongAndShort e passargli // firstTimeToTestInefficiency nel costruttore per poi modificare // OutOfSampleChooser.GetPositionsToBeOpened() togliendo i // parametri firstDateTimeToTestInefficiency e dateTimeToClosePositions // qui!!! return candidate; } #endregion getWeightedPositionsFromCandidateWithoutAdjustment protected override WeightedPositions getWeightedPositionsFromCandidate( ReturnsManager returnsManagerForLastSecondPhaseInterval , WeightedPositions candidate ) { WeightedPositions weightedPositionsFromCandidate = null; if ( !this.hasThePriceBeenAdjustedLastNight( candidate ) ) weightedPositionsFromCandidate = this.getWeightedPositionsFromCandidateWithoutAdjustment( returnsManagerForLastSecondPhaseInterval , candidate ); return weightedPositionsFromCandidate; } #endregion getPositionsFromCandidate } } |