Overall Statistics
Total Orders
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Start Equity
100000
End Equity
100000
Net Profit
0%
Sharpe Ratio
0
Sortino Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
9.739
Tracking Error
0.064
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
# region imports
from AlgorithmImports import *
from datetime import timedelta
# endregion

class IVTSAlpha(AlphaModel):
    
    securities = []


    def update(self, algorithm: QCAlgorithm, data: Slice) -> List[Insight]:
        insights = []

        for security in self.securities:
            
            insight = Insight(security.symbol, timedelta(minutes=60), InsightType.PRICE, InsightDirection.UP)
            insights.append(insight)
            return Insight.group(insights)


    def on_securities_changed(self, algorithm: QCAlgorithm, changes: SecurityChanges) -> None:
        for security in changes.added_securities:
            self.securities.append(security)

        for security in changes.removed_securities:
            if security in self.securities:
                self.securities.remove(security)
#region imports
from AlgorithmImports import *
from universe import *
from alpha import *
from portfolio import *
#endregion

class ConservativeApgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2024, 1, 1)
        self.set_end_date(2024, 1, 7)
        self.set_cash(100_000)            
        self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.MARGIN)

        # SPY 500 companies
        spy = self.add_equity("SPY",
            resolution = Resolution.MINUTE,
            data_normalization_mode = DataNormalizationMode.RAW).symbol
        self.set_benchmark(spy)
        
        self.set_universe_selection(etf_constituents_universe(spy, self.universe_settings))
        self.set_alpha(IVTSAlpha())
        self.Settings.RebalancePortfolioOnInsightChanges = False
        self.Settings.RebalancePortfolioOnSecurityChanges = False
        self.set_portfolio_construction(StraddlePortfolio())
        self.set_risk_management(NullRiskManagementModel())
        self.set_execution(NullExecutionModel())

# region imports
from AlgorithmImports import *
# endregion

# Portfolio construction scaffolding class; basic method args.
class StraddlePortfolio(PortfolioConstructionModel):
    # Create list of PortfolioTarget objects from Insights
    def create_targets(self, algorithm: QCAlgorithm, insights: List[Insight]) -> List[PortfolioTarget]:
        return super().create_targets(algorithm, insights)
    
    # Determines the target percent for each insight
    def determine_target_percent(self, insights: List[Insight]) -> Dict[Insight, float]:
        
        targets = {}

        for insight in insights:
            # For simplicity, let's just evenly divide the portfolio among all insights
            targets[insight] = 1.0 / len(insights)

        return targets
# region imports
from AlgorithmImports import *
# endregion

class etf_constituents_universe(ETFConstituentsUniverseSelectionModel):
    def __init__(self, benchmark, universe_settings: UniverseSettings = None) -> None:
        super().__init__(benchmark, universe_settings, self.etf_constituents_filter)

    def etf_constituents_filter(self, constituents):
        return [c.symbol for c in constituents]