Overall Statistics |
Total Trades 4405 Average Win 0.00% Average Loss 0.00% Compounding Annual Return 3.013% Drawdown 0.500% Expectancy 0.319 Net Profit 1.030% Sharpe Ratio 1.777 Loss Rate 41% Win Rate 59% Profit-Loss Ratio 1.23 Alpha 0.026 Beta 0.049 Annual Standard Deviation 0.013 Annual Variance 0 Information Ratio 1.33 Tracking Error 0.047 Treynor Ratio 0.484 Total Fees $0.00 |
import io, requests import numpy as np import pandas as pd from datetime import datetime from datetime import timedelta feat_assets = ['AUDUSD', 'EURUSD', 'GBPUSD', 'NZDUSD', 'USDCAD', 'USDCHF', 'USDJPY', 'USDNOK', 'USDSEK', 'USDSGD'] trade_assets = ['EURAUD', 'EURNZD', 'GBPAUD', 'GBPNZD', 'AUDUSD', 'NZDUSD'] No_Channels = 10 Input_Size = 256 class BasicTemplateAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2019,1,3) #Set Start Date self.SetEndDate(2019,5,8) #Set End Date self.SetCash(100000) #Set Strategy Cash self.SetBrokerageModel(BrokerageName.OandaBrokerage) for asset in list(set(feat_assets+trade_assets)): self.AddForex(asset, Resolution.Hour, Market.Oanda, True, 1.0) self.History(512, Resolution.Hour) self.SetBenchmark("EURUSD") def OnData(self, data): #if self.Time.hour % 4 != 0: return cc = None for asset in feat_assets: df = self.History([asset], timedelta(14), Resolution.Hour).loc[asset] df = df['bidclose'].resample('1H').interpolate(method='cubic') if asset[-3:] != 'USD': df = 1.0 / df df = np.log((df/df.shift(1)).tail(Input_Size)) cc = df if cc is None else pd.concat([cc, df], axis=1) X = np.swapaxes(cc.values, 0, 1) sss = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] for i, asset in enumerate(trade_assets): sss[i] = self.Securities[asset].AskPrice / self.Securities[asset].BidPrice - 1.0 self.Debug(sss) data = {'arr': X.reshape(-1).tolist(), 'spr': sss} response = requests.post('https://rota.serveo.net/test', json=data) try: weights = np.array(response.json()['arr']) except: self.Debug('JSONDecodeError') return ''' values = [] for asset in trade_assets: values.append(self.Portfolio[asset].Quantity * self.Securities[asset].Price) values = np.array(values) values /= np.sum(np.abs(values)) self.Debug(values) ''' self.Debug(weights) for i, asset in enumerate(trade_assets): #self.SetHoldings(asset, weights[i]) self.Transactions.CancelOpenOrders(asset) cc = None for asset in trade_assets: df = self.History([asset], timedelta(14), Resolution.Hour).loc[asset] df = df['bidclose'].resample('1H').interpolate(method='cubic') df = np.log((df/df.shift(1)).tail(Input_Size)) cc = df if cc is None else pd.concat([cc, df], axis=1) stdarr = np.exp(cc.abs().quantile(0.5).values)#0.25 for i, asset in enumerate(trade_assets): oq = self.CalculateOrderQuantity(asset, weights[i]) #oq -= self.Portfolio[asset].Quantity lp = self.Securities[asset].AskPrice * stdarr[i] if oq > 0: lp = self.Securities[asset].BidPrice / stdarr[i] if oq != 0: self.LimitOrder(asset, oq, lp)