Overall Statistics
Total Orders
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
21.219%
Drawdown
28.700%
Expectancy
0
Start Equity
100000
End Equity
121261.98
Net Profit
21.262%
Sharpe Ratio
0.657
Sortino Ratio
0.576
Probabilistic Sharpe Ratio
32.825%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0.024
Beta
0.967
Annual Standard Deviation
0.274
Annual Variance
0.075
Information Ratio
0.354
Tracking Error
0.052
Treynor Ratio
0.186
Total Fees
$1.72
Estimated Strategy Capacity
$2600000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
0.28%
from joblib import Parallel, delayed
import numpy as np

from AlgorithmImports import *

class ParallelProcessingAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        self.SetEndDate(2021, 1, 1)
        self.SetCash(100000)
        self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
        
    def parallel_calculation(self, data_chunk):
        return np.mean(data_chunk)
    
    def OnData(self, data):
        if not self.Portfolio.Invested:
            history = self.History(self.spy, 100, Resolution.Daily)
            data_chunks = np.array_split(history['close'].values, 4)
            
            # Use threading backend
            results = Parallel(n_jobs=2, backend="threading")(
                delayed(self.parallel_calculation)(chunk) 
                for chunk in data_chunks
            )
            
            if np.mean(results) > history['close'].iloc[-1]:
                self.SetHoldings(self.spy, 1.0)