🚀 AI One-Click Generation of quantconnect Strategy Code

How to Use `Insight.Price` and `InsightDirection` in QuantConnect

quantconnect | Published on: 2025/12/2
The following content is generated by EasyQuant .

Problem Description

How do I create a signal that predicts a stock's price will go up?

Solution

To create a signal that predicts a stock's price will go up in QuantConnect, you typically rely on Technical Indicators, Statistical Arbitrage, or Machine Learning.

One of the most common and fundamental methods to generate a bullish (upward) signal is using a Moving Average Crossover (specifically the "Golden Cross"). This strategy predicts that price momentum is shifting upward when a short-term moving average crosses above a long-term moving average.

Below is a complete, runnable algorithm that implements a Golden Cross strategy. It generates a buy signal when the 50-day Simple Moving Average (SMA) crosses above the 200-day SMA.

Strategy Logic

  1. Indicators: Calculate a 50-day SMA (Fast) and a 200-day SMA (Slow).
  2. Bullish Signal: When the 50-day SMA becomes greater than the 200-day SMA, we predict the trend is up and buy.
  3. Exit Signal: When the 50-day SMA drops below the 200-day SMA, the trend has weakened, and we liquidate.

Python Implementation

# region imports
from AlgorithmImports import *
# endregion

class BullishSignalAlgorithm(QCAlgorithm):

    def initialize(self):
        # 1. Set Setup parameters
        self.set_start_date(2018, 1, 1)
        self.set_end_date(2023, 1, 1)
        self.set_cash(100000)

        # 2. Add the asset to the universe (e.g., SPY)
        self.symbol = self.add_equity("SPY", Resolution.DAILY).symbol

        # 3. Define Technical Indicators
        # Fast Moving Average (50 days) captures short-term trends
        self.fast_sma = self.sma(self.symbol, 50, Resolution.DAILY)
        
        # Slow Moving Average (200 days) captures long-term trends
        self.slow_sma = self.sma(self.symbol, 200, Resolution.DAILY)

        # 4. Set WarmUp period to ensure indicators are ready immediately
        self.set_warm_up(200)

    def on_data(self, data: Slice):
        # Ensure data exists for the symbol before processing
        if not data.contains_key(self.symbol) or data[self.symbol] is None:
            return

        # Do not trade if the algorithm is still warming up indicators
        if self.is_warming_up:
            return

        # 5. Signal Generation Logic
        # Check if the Fast SMA is greater than the Slow SMA
        if self.fast_sma.current.value > self.slow_sma.current.value:
            
            # If we are not already invested, this is a new Bullish Signal
            if not self.portfolio.invested:
                self.set_holdings(self.symbol, 1.0)
                self.debug(f"Bullish Signal Triggered: Buy {self.symbol} at {self.time}")

        # Check if the Fast SMA is less than the Slow SMA (Bearish/Exit Signal)
        elif self.fast_sma.current.value < self.slow_sma.current.value:
            
            # If we are currently invested, we need to exit
            if self.portfolio.invested:
                self.liquidate(self.symbol)
                self.debug(f"Trend Reversal: Sell {self.symbol} at {self.time}")

        # 6. Plotting for visual analysis
        self.plot("Indicators", "Fast SMA", self.fast_sma.current.value)
        self.plot("Indicators", "Slow SMA", self.slow_sma.current.value)
        self.plot("Indicators", "Price", data[self.symbol].close)

Key Components Explained

  1. self.sma(...): This helper method creates a Simple Moving Average indicator and automatically updates it with new data as it arrives.
  2. self.set_warm_up(200): This is crucial. It tells the engine to feed in the previous 200 days of data before the Start Date. This ensures that on day one of your backtest, the 200-day moving average is already calculated and valid.
  3. self.portfolio.invested: This property checks if you currently hold a position in the asset. It prevents the algorithm from submitting duplicate buy orders if the signal remains true for multiple days.
  4. self.plot(...): This visualizes the signal in the backtest results, allowing you to verify that the buy orders align with the crossover points.

Q&A: Signal Generation in QuantConnect

Q: Can I use other indicators besides Moving Averages?
A: Yes. QuantConnect supports hundreds of indicators like RSI (Relative Strength Index), MACD (Moving Average Convergence Divergence), and Bollinger Bands. You can initialize them similarly using self.rsi(...) or self.macd(...).

Q: How do I predict price using fundamental data instead of price history?
A: You can access fundamental data (like P/E ratio or Earnings per Share) via the self.fundamentals object in Universe Selection or by adding fundamental data subscriptions. A signal could be generated, for example, if a company's earnings growth exceeds a certain threshold.

Q: Is this code ready for live trading?
A: While the code is syntactically correct for live trading, this specific strategy is a basic example. For live deployment, you should add risk management (Stop Loss/Take Profit), consider transaction costs (slippage/fees), and perform robust backtesting across different market conditions.

Q: How do I make the signal more complex (e.g., requiring two conditions)?
A: You can combine conditions using Python's and operator. For example:

if self.fast_sma.current.value > self.slow_sma.current.value and self.rsi.current.value < 70:
    self.set_holdings(self.symbol, 1.0)