Categories
Algorithmic Trading

How to Get Multiple Asset’s Historical Prices Using Lumibot’s get_historical_prices_for_assets

Introduction

Crafting effective trading strategies requires a solid foundation – historical price data. This data acts as a window into an asset’s past performance, revealing valuable insights for backtesting, fundamental analysis, and long-term trend identification. Lumibot, a Python library designed for algorithmic trading, simplifies the process of acquiring historical price data for multiple assets simultaneously. This article focuses explicitly on the get_historical_prices_for_assets method, allowing you to efficiently retrieve historical price information for assets like AAPL and MSFT.

Here’s what Lumibot’s get_historical_prices_for_assets offers:

  • Flexibility: Retrieve data for various asset types, including stocks, ETFs, cryptocurrencies, and more (depending on your data source configuration).
  • Efficiency: Fetch data for multiple assets in one call, saving time and effort compared to individual requests.
  • Customization: Control the data timeframe (e.g., daily, hourly) and granularity (e.g., including after-hours data) to fit your specific needs.

By leveraging historical price data through Lumibot, you can unlock new possibilities for your trading bot development.

Advantages of Historical Data in Algorithmic Trading

Historical data plays a crucial role in algorithmic trading, providing valuable insights for developing and optimizing strategies. Here are some of the key advantages:

1. Pattern Recognition

  • Identifying Trends: Historical data can help identify trends, such as uptrends, downtrends, and sideways movements, which can be used to inform trading decisions.
  • Recognizing Chart Patterns: Patterns like head and shoulders, double tops/bottoms, and triangles can be detected in historical data, providing potential signals for future price movements.

2. Statistical Analysis

  • Volatility Analysis: Historical data can be used to calculate volatility metrics, such as standard deviation and beta, which are essential for risk management.
  • Correlation Analysis: By analyzing correlations between different assets, traders can construct diversified portfolios and hedge risk.

3. Machine Learning

  • Training Models: Historical data can be used to train machine learning models, such as neural networks and support vector machines, to predict future price movements.
  • Time series forecasting: Historical data enables time series forecasting, predicting future market trends and patterns.

4. Risk Management

  • Stop-Loss and Take-Profit Levels: Historical data can be used to set appropriate stop-loss and take-profit levels based on past price movements and volatility.
  • Position Sizing: By analyzing historical data, traders can determine optimal position sizes to manage risk effectively.

5. Market Analysis

  • Fundamental Analysis: Historical data on financial statements, economic indicators, and industry trends can be used to assess the underlying value of assets.
  • Sentiment Analysis: Analyzing historical news and social media sentiment can provide insights into market sentiment and potential price movements.

By effectively utilizing historical data, algorithmic traders can develop robust and profitable strategies that have a solid foundation in past market behavior.practical implementation of get_historical_prices_for_assets in Lumibot.

Steps To Use get_historical_prices_for_assets() Method in Lumibot

Prerequisites

Must have Python installed in the system(version 3.10 or above)Install required Python packages.


 pip install lumibot

Necessary imports for running the Python file.

from lumibot.strategies import Strategy
import pandas_ta as ta

Create ALPACA_CONFIG with API KEY and API SECRET by logging in or signing up at https://alpaca.markets/.………..

Steps for Using get_historical_price()

Step 1: Add ALPACA_CONFIG Details

Alpaca is a broker, just like the interactive broker. The details below are required to use the Alpaca broker API.

ALPACA_CONFIG = {
    "API_KEY": "YOUR_API_KEY_HERE", # Get your API Key from
https://alpaca.markets/
    "API_SECRET": "YOUR_SECRET_HERE", # Get your secret from
https://alpaca.markets/
    "PAPER":True # Set to False for real money
}

Step 2: Create a GetHistoricalPrice Class 

Once you have added the Alpaca config detail, create a GetHistoricalPrice class, which will inherit the Strategy class as below.

class GetHistoricalPrice(Strategy):

Step 3: Add  on_trading_iteration() Method 

Once you have added the initialize method, follow with the creation of  on_trading_iteration() method as below:

  def on_trading_iteration(self):
        """Get the historical price for assets"""

        # Fetch historical prices for multiple assets
        bars = self.get_historical_prices_for_assets(["AAPL", "MSFT"], 10, "day")

        for symbol, asset_data in bars.items():
            # Log the DataFrame of historical prices

            self.log_message(f"Historical prices for {symbol}:\n{asset_data.df}")


The code snippet is fetching historical price data for two assets, AAPL and MSFT, over the last 10 days. The data is retrieved in the form of DataFrames. The function then logs these DataFrames, providing a detailed view of the historical prices for each asset. This information can be used for further analysis or trading strategies.

Note: The bars  variable is assigned its value through:

  bars = self.get_historical_prices_for_assets(["AAPL", "MSFT"], 10, "day")

The data stored in bars is, hence, like open price, close price, etc., as mentioned above. Some others can be volume and dividend.

Further details

for symbol, asset_data in bars.items():
            # Log the DataFrame of historical prices

            self.log_message(f"Historical prices for {symbol}:\n{asset_data.df}")

The above code iterates over the dictionary of asset data, where the keys are symbols, and the values are DataFrames containing historical prices. For each asset, it logs the symbol and its corresponding DataFrame, providing a detailed view of the historical price data.

Note 1: Running the Code in the Same File 

In Python, if __name__ == “__main__”: is a conditional statement, which allows you to control the execution of code depending on whether the script is run directly or imported as a module. This implies that the code will run only if runs as a script and not as a module.

if __name__ == "__main__": 

Step 4: Import Alpaca and Trader

Import Alpaca and Trader classes from Lumibot.brokers and Lumibot.traders modules. While Alpaca is an interface to the Alpaca trading platform, it leverages us with the functionalities to interact with the Alpaca API for implementing things like placing orders, managing positions, and fetching market data like Historical Price Data, which we are doing in this blog.

The Trader class helps orchestrate the trading process, managing multiple trading strategies, interacting with brokers like Alpaca, Interactive Brokers, and Tradiers, handling order execution and position management, and ensuring a framework for live trading and backtesting. 

from lumibot.brokers import Alpaca
from lumibot.traders import Trader

Step 5: Create Trader Class Object

As you import the Alpaca and Trader class, create the trader object of the Trader() class.

 trader = Trader()

Step 6: Create an Object of Alpaca Class

On creation of the trader class object, create the object of the Alpaca class by passing the Alpaca_Config array created above.

broker = Alpaca(ALPACA_CONFIG)

Step 7: Create an Object of GetHistoricalPrice Class

Once we have created the object for the Alpaca class, we will create an object of the GetHistoricalPrice class by passing the Alpaca object (broker) as a parameter to the GetHistoricalPrice class. 

 strategy = GetHistoricalPrice(broker=broker)

Step 8: Pass the Strategy to the Trader Class Object

On creation of the object of the GetHistoricalPrice class, add the strategy to the trader class object using the add_strategy() method.

trader.add_strategy(strategy)

Step 9: Start the Overall Trading Process

The code below starts the overall trading process. This typically executes backtesting or a live trading process for a collection of strategies within a trading platform. This command starts the execution engine. It establishes the connection with a broker, which is Alpaca, and starts background tasks like market data ingestion and order management. Briefly, it is the starting point of the trading process.

trader.run_all()

Complete Code

from lumibot.strategies import Strategy

ALPACA_CONFIG = {
    "API_KEY": "",
    "API_SECRET": "",
    "PAPER": True
}

class GetHistoricalPrice(Strategy):

    def on_trading_iteration(self):
        """Get the historical price for assets"""

        # Fetch historical prices for multiple assets
        bars = self.get_historical_prices_for_assets(["AAPL", "MSFT"], 10, "day")

        for symbol, asset_data in bars.items():
            # Log the DataFrame of historical prices

            self.log_message(f"Historical prices for {symbol}:\n{asset_data.df}")

if __name__ == "__main__":

    from lumibot.brokers import Alpaca
    from lumibot.traders import Trader

    trader = Trader()
    broker = Alpaca(ALPACA_CONFIG)
    strategy = GetHistoricalPrice(broker=broker)
    trader.add_strategy(strategy)
    trader.run_all()



Output

Conclusion

Lumibot’s get_historical_prices_for_assets method offers a powerful tool for efficiently retrieving historical price data for multiple assets. By leveraging this data, you can enhance your trading strategies, make informed decisions, and gain a competitive edge in the market.

Start exploring the possibilities with Lumibot today! Visit the Lumibot documentation and begin building your trading bot strategies:





Multiple assets historical prices