Portfolio
Holdings
Properties
SecurityHolding
objects have the following properties:
# Save shortcut to SecurityHolding object, and fetch quantity and invested status. security_holding = self.portfolio["SPY"] quantity = security_holding.quantity invested = security_holding.invested
FutureHolding
objects also have settled_profit
and unsettled_profit
properties.
Get Total Close Profit
To get the profit of a position holding if you closed the position, call the total_close_profit
method. The value this method returns is denominated in your account currency and accounts for order fees.
profit = self.portfolio["SPY"].total_close_profit()
The total_close_profit
method accepts the following optional arguments:
Argument | Data Type | Description | Default Value |
---|---|---|---|
include_fees | bool | Whether to reduce the profit based on the estimated fee from the fee model. | True |
exit_price | float/NoneType | A hypothetical exit price to use for the profit calculation. If you don't provide a value, it uses the bid price for sell orders or the ask price for buy orders. | None |
entry_price | float/NoneType | A hypothetical exit price to use for the profit calculation. If you don't provide a value, it uses the average price of the SecurityHolding . | None |
quantity | float/NoneType | The quantity to liquidate. If you don't provide a value, it uses the quantity of the SecurityHolding . | None |
LEAN uses this method to define the unrealized_profit
property.
Get Quantity Value
To get the value of a security at any quantity, call the get_quantity_value
method. The value this method returns is denominated in your account currency.
# Get the quantity value at the current price value_at_current_price = self.portfolio["SPY"].get_quantity_value(100) # Get the quantity value at a specific price value_at_specific_price = self.portfolio["SPY"].get_quantity_value(100, price=30)
Set Initial Holdings
When you deploy a backtest or a new paper trading algorithm, the default initial portfolio state contains $100,000 USD.
However, in the initialize method, you can define the initial portfolio state to something else.
To set the initial cash balances, call set_cash
with the currency ticker and quantity.
To set multiple currencies, call the method multiple times.
self.set_cash(100000) # Set the quantity of the account currency to 100,000 self.set_cash("BTC", 10) # Set the Bitcoin quantity to 10 self.set_cash("EUR", 10000) # Set the EUR quantity to 10,000
To set the initial security holdings, subscribe to the security so that it enters your portfolio, then call the SecurityHolding.set_holdings
method with the average purchase price and quantity.
if not self.live_mode: self.portfolio["SPY"].set_holdings(average_price=500, quantity=100)
Examples
The following examples demonstrate common practices for setting the portfolio holdings.
Example 1: Initial Holdings
The following algorithm simulates an account with multiple initial positions and cash. Note that these initial holdings will affect the algorithm's performance.
class PortfolioExampleAlgorithm(QCAlgorithm): def initialize(self) -> None: self.set_start_date(2024, 1, 1) self.set_end_date(2024, 1, 31) # Simulate initial cash in multiple currencies. # Note that all currencies other than the account currency will affect the performance. self.set_account_currency("USD", 10000) self.set_cash("EUR", 1000) self.set_cash("JPY", 1000000) self.set_cash("HKD", 10000) # Request data for some securities in the account already. spy = self.add_equity("SPY").symbol aapl = self.add_equity("AAPL").symbol btcusd = self.add_crypto("BTCUSD").symbol xauusd = self.add_cfd("XAUUSD").symbol # Simulate that the account initially holds some assets. # Note that all initial holdings will affect the performance. self.portfolio[spy].set_holdings(average_price=420, quantity=102) self.portfolio[aapl].set_holdings(average_price=120, quantity=25) self.portfolio[btcusd].set_holdings(average_price=45000, quantity=0.125) self.portfolio[xauusd].set_holdings(average_price=1000, quantity=100)