Passer au contenu
Tous les documents de la bibliothèque

Planifier l’expiration des signaux avec l’assistant d’expiration de Lean

Article Strategy library · Auteur: QuantConnect

Résumé

Cet exemple du framework Lean montre comment un modèle Alpha peut utiliser un assistant d’expiration pour définir quand les signaux de trading générés doivent être clôturés. L’algorithme utilise un univers d’actions américaines US sélectionné manuellement et contenant SPY, des données horaires, une construction de portefeuille à pondération égale, une exécution immédiate et une limite de drawdown par titre. Son modèle Alpha attend une heure de mise à jour planifiée avant de générer de nouveaux signaux.

L’exemple choisit une expiration selon le jour de la semaine : dans un mois, en fin de mois, en fin de semaine ou en fin de journée. Il consigne aussi l’heure de clôture et le jour de la semaine associés au signal généré, pour illustrer l’inspection du calendrier obtenu. Il s’agit de mécanismes du framework, et non d’un signal de trading testé : le modèle attribue toujours une direction haussière, et le document ne présente ni performance d’investissement ni preuve que ces choix de calendrier sont rentables. La plage de dates réduite de l’exemple et son univers à un seul symbole limitent encore les conclusions possibles. Sa valeur réside dans l’illustration de la gestion de la durée de vie des signaux, et non dans une recommandation complète de stratégie.

Idées clés

  • Un modèle Alpha peut utiliser des assistants d’expiration pour définir quand les signaux générés doivent être clôturés.
  • L’exemple sélectionne un intervalle d’expiration selon le jour de la semaine.
  • Une heure de prochaine mise à jour planifiée empêche le modèle d’émettre des signaux à chaque mise à jour des données.
  • L’heure de clôture des signaux générés peut être consignée pour examiner le comportement de l’expiration.
  • L’exemple illustre l’utilisation du framework et ne fournit aucun élément sur les performances de trading.

Étiquettes

Texte intégral
# ExpiryHelperAlphaModelFrameworkAlgorithm


# ExpiryHelperAlphaModelFrameworkAlgorithm









Expiry Helper framework algorithm uses Expiry helper class in an Alpha Model

Expiry Helper algorithm uses Expiry helper class in an Alpha Model

## Source (Apache-2.0)

```python
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from AlgorithmImports import *

### <summary>
### Expiry Helper algorithm uses Expiry helper class in an Alpha Model
### </summary>
class ExpiryHelperAlphaModelFrameworkAlgorithm(QCAlgorithm):
    '''Expiry Helper framework algorithm uses Expiry helper class in an Alpha Model'''

    def initialize(self) -> None:
        ''' Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''

        # Set requested data resolution
        self.universe_settings.resolution = Resolution.HOUR

        self.set_start_date(2013,10,7)   #Set Start Date
        self.set_end_date(2014,1,1)      #Set End Date
        self.set_cash(100000)           #Set Strategy Cash

        symbols = [ Symbol.create("SPY", SecurityType.EQUITY, Market.USA) ]

        # set algorithm framework models
        self.set_universe_selection(ManualUniverseSelectionModel(symbols))
        self.set_alpha(self.ExpiryHelperAlphaModel())
        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())
        self.set_risk_management(MaximumDrawdownPercentPerSecurity(0.01))

        self.insights_generated += self.on_insights_generated

    def on_insights_generated(self, s: IAlgorithm, e: GeneratedInsightsCollection) -> None:
        for insight in e.insights:
            self.log(f"{e.date_time_utc.isoweekday()}: Close Time {insight.close_time_utc} {insight.close_time_utc.isoweekday()}")

    class ExpiryHelperAlphaModel(AlphaModel):
        _next_update = None
        _direction = InsightDirection.UP

        def update(self, algorithm: QCAlgorithm, data: Slice) -> list[Insight]:
            if self._next_update and self._next_update > algorithm.time:
                return []

            expiry = Expiry.END_OF_DAY

            # Use the Expiry helper to calculate a date/time in the future
            self._next_update = expiry(algorithm.time)

            weekday = algorithm.time.isoweekday()

            insights = []
            for symbol in data.bars.keys():
                # Expected CloseTime: next month on the same day and time
                if weekday == 1:
                    insights.append(Insight.price(symbol, Expiry.ONE_MONTH, self._direction))
                # Expected CloseTime: next month on the 1st at market open time
                elif weekday == 2:
                    insights.append(Insight.price(symbol, Expiry.END_OF_MONTH, self._direction))
                # Expected CloseTime: next Monday at market open time
                elif weekday == 3:
                    insights.append(Insight.price(symbol, Expiry.END_OF_WEEK, self._direction))
                # Expected CloseTime: next day (Friday) at market open time
                elif weekday == 4:
                    insights.append(Insight.price(symbol, Expiry.END_OF_DAY, self._direction))

            return insights

```

Reproduit dans son intégralité avec attribution, conformément à la licence de la source. Licence: Apache-2.0

Ce résumé a été rédigé par l’agent de recherche de Stratmill à partir de la source originale ; il n’en est pas une copie.