| Overall Statistics |
|
Total Orders 266 Average Win 2.32% Average Loss -2.33% Compounding Annual Return 23.219% Drawdown 28.700% Expectancy 0.196 Start Equity 100000 End Equity 169258.09 Net Profit 69.258% Sharpe Ratio 0.761 Sortino Ratio 0.634 Probabilistic Sharpe Ratio 32.344% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 1.00 Alpha 0.036 Beta 0.733 Annual Standard Deviation 0.224 Annual Variance 0.05 Information Ratio -0.07 Tracking Error 0.181 Treynor Ratio 0.233 Total Fees $2200.20 Estimated Strategy Capacity $520000000.00 Lowest Capacity Asset AAPL R735QTJ8XC9X Portfolio Turnover 28.74% |
from AlgorithmImports import *
from QuantConnect.DataSource import *
class BrainSentimentDataAlgorithm(QCAlgorithm):
latest_sentiment_value = None
target_holdings = 0
def initialize(self) -> None:
self.set_start_date(2019, 1, 1)
self.set_end_date(2021, 7, 8)
self.set_cash(100000)
# Requesting data
self.aapl = self.add_equity("AAPL", Resolution.DAILY).symbol
self.dataset_symbol = self.add_data(BrainSentimentIndicator30Day, self.aapl).symbol
# Historical data
history = self.history(self.dataset_symbol, 100, Resolution.DAILY)
self.debug(f"We got {len(history)} items from our history request for {self.dataset_symbol}")
if history.empty:
return
# Warm up historical sentiment values
previous_sentiment_values = history.loc[self.dataset_symbol].sentiment.values
for sentiment in previous_sentiment_values:
self.update(sentiment)
def update(self, sentiment: float) -> None:
if self.latest_sentiment_value is not None:
self.target_holdings = int(sentiment > self.latest_sentiment_value)
self.latest_sentiment_value = sentiment
def on_data(self, slice: Slice) -> None:
if slice.contains_key(self.dataset_symbol):
sentiment = slice[self.dataset_symbol].sentiment
self.update(sentiment)
# Ensure we have security data in the current slice
if not (slice.contains_key(self.aapl) and slice[self.aapl] is not None):
return
if self.target_holdings != self.portfolio.invested:
self.set_holdings(self.aapl, self.target_holdings)