Overall Statistics
Total Trades
3
Average Win
0%
Average Loss
0%
Compounding Annual Return
21.697%
Drawdown
42.900%
Expectancy
0
Net Profit
21.762%
Sharpe Ratio
0.691
Probabilistic Sharpe Ratio
33.815%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0.333
Beta
-0.299
Annual Standard Deviation
0.395
Annual Variance
0.156
Information Ratio
0.128
Tracking Error
0.55
Treynor Ratio
-0.913
Total Fees
$5.79
Estimated Strategy Capacity
$41000000.00
Lowest Capacity Asset
SVXY V0H08FY38ZFP
from AlgorithmImports import *


class MultiAssetManager(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        self.SetEndDate(2021, 1, 1)
        self.SetCash(100000)
        self.resolution = int(self.GetParameter("Resolution"))
        self.equities = self.GetParameter("Equities").split(",")
        self.forexPairs = self.GetParameter("ForexPairs").split(",")
        self.cryptoPairs = self.GetParameter("CryptoPairs").split(",")
        for equity in self.equities:
            if len(equity) < 3:
                continue
            self.AddEquity(equity, self.resolution)
        for forex in self.forexPairs:
            if len(forex) < 3:
                continue
            self.AddForex(forex, self.resolution)
        for crypto in self.cryptoPairs:
            if len(crypto) < 3:
                continue
            self.AddCrypto(crypto, self.resolution)

        allocationRatioVariable = self.GetParameter(
            "AllocationRatio").split(",")
        self.allocationRatio = {}
        allocationSum = 0
        for allocation in allocationRatioVariable:
            [pair, ratio] = allocation.split(":")
            self.allocationRatio[pair] = float(ratio)
            allocationSum += float(ratio)
        if allocationSum > 1:
            raise Exception('Allocation Sum is more than 1')
        else:
            self.Log("Not allocated%:"+str(1-allocationSum))
        self.plotPairPrices()

    def OnData(self, data):
        self.plotPrices(data)
        if not self.Portfolio.Invested:
            for pair in self.allocationRatio.keys():
                self.SetHoldings(pair, self.allocationRatio[pair])
            self.Log("Purchased Stock")

    def plotPairPrices(self):
        pricesChart = Chart('Prices')
        for pair in self.allocationRatio.keys():
            pricesChart.AddSeries(
                Series(pair, SeriesType.Line, "$"))
        self.AddChart(pricesChart)

    def plotPrices(self, data):
        for pair in self.allocationRatio.keys():
            if pair not in data:
                continue
            price = data[pair].Value
            self.Plot("Prices", pair, price)