| Overall Statistics |
|
Total Orders 15 Average Win 0% Average Loss 0% Compounding Annual Return 11.122% Drawdown 7.100% Expectancy 0 Start Equity 25000 End Equity 35225.35 Net Profit 40.901% Sharpe Ratio 0.583 Sortino Ratio 0.771 Probabilistic Sharpe Ratio 71.100% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.037 Beta -0.168 Annual Standard Deviation 0.059 Annual Variance 0.004 Information Ratio 0.118 Tracking Error 0.177 Treynor Ratio -0.207 Total Fees $0.00 Estimated Strategy Capacity $1500000.00 Lowest Capacity Asset USDJPY 8G Portfolio Turnover 0.18% |
#region imports
from AlgorithmImports import *
#endregion
# The official interest rate is from Quandl
#
from AlgorithmImports import *
from NodaTime import DateTimeZone
import numpy as np
class ForexCarryTradeAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2022, 1, 1)
self.SetEndDate(2025, 3, 31)
self.SetCash(25000)
#tickers = ["USDEUR", "USDZAR", "USDAUD",
# "USDJPY", "USDTRY", "USDINR",
# "USDCNY", "USDMXN", "USDCAD"]
#rate_symbols = ["BCB/17900", # Euro Area
# "BCB/17906", # South Africa
# "BCB/17880", # Australia
# "BCB/17903", # Japan
# "BCB/17907", # Turkey
# "BCB/17901", # India
# "BCB/17899", # China
# "BCB/17904", # Mexico
# "BCB/17881"] # Canada
rate_symbol_by_ticker = {
"USDEUR": "BCB/17900", # Euro Area
"USDZAR": "BCB/17906", # South Africa
"USDAUD": "BCB/17880", # Australia
"USDJPY": "BCB/17903", # Japan
"USDTRY": "BCB/17907", # Turkey
"USDINR": "BCB/17901", # India
"USDCNY": "BCB/17899", # China
"USDMXN": "BCB/17904", # Mexico
"USDCAD": "BCB/17881" # Canada
}
self.symbols = {}
for ticker, rate_symbol in rate_symbol_by_ticker.items():
forex_symbol = self.AddForex(ticker, Resolution.Daily, Market.Oanda).Symbol
data_symbol = self.AddData(NasdaqDataLink, rate_symbol, Resolution.Daily, TimeZones.Utc, True).Symbol
self.symbols[str(forex_symbol)] = data_symbol
#self.SetWarmUp(10)
self._top = float(self.GetParameter("max_holding"))
self._num = int(self.GetParameter("number_of_markets"))
#self.Debug(f"Bond Rate directory : {dir(self.Securities[self.symbols['USDMXN']])}")
#self.Debug(f"Bond Rate : {dir(self.Securities[self.symbols['USDMXN']].AskPrice)}")
self.Schedule.On(self.DateRules.MonthStart("USDEUR"), self.TimeRules.AfterMarketOpen("USDEUR"), Action(self.Rebalance))
def Rebalance(self):
top_symbols = sorted(self.symbols, key = lambda x: self.Securities[self.symbols[x]].AskPrice)
if self.IsWarmingUp:
return
self.SetHoldings(top_symbols[0],self._top)
for j in np.arange(self._num):
i=-1*(j+1)
self.SetHoldings(top_symbols[i], -self._top/(self._num))
def OnData(self, data):
pass
#class QuandlRate(PythonQuandl):
#
# def __init__(self):
# self.ValueColumnName = 'Value'