Created with Highcharts 12.1.2EquityJan 2012Jan…Jul 2012Jan 2013Jul 2013Jan 2014Jul 2014Jan 2015Jul 2015Jan 2016Jul 2016Jan 2017Jul 2017Jan 2018Jul 2018Jan 2019Jul 2019Jan 202099k100k101k102k103k104k105k106k107k108k109k110k
Overall Statistics
Total Trades
48
Average Win
0.81%
Average Loss
-1.08%
Compounding Annual Return
0.043%
Drawdown
8.600%
Expectancy
0.022
Net Profit
0.333%
Sharpe Ratio
0.029
Probabilistic Sharpe Ratio
0.312%
Loss Rate
42%
Win Rate
58%
Profit-Loss Ratio
0.75
Alpha
0
Beta
0.003
Annual Standard Deviation
0.024
Annual Variance
0.001
Information Ratio
-1.036
Tracking Error
0.129
Treynor Ratio
0.236
Total Fees
$247.45
# https://quantpedia.com/strategies/us-holiday-effect-in-eu-markets/
# 
# Buy DAX index (via ETF, CFD, fund or futures) at European close one day before each US holiday day. Sell on European close during US holiday day. Hold cash otherwise.

import numpy as np
import fk_tools

class US_Holiday_EU_Markets(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2012, 1, 1)
        self.SetEndDate(2019, 10, 1)
        self.SetCash(100000)           
        
        data = self.AddData(fk_tools.QuandlFutures, "CHRIS/EUREX_FESX1", Resolution.Daily)
        data.SetFeeModel(fk_tools.CustomFeeModel(self))
        self.symbol = data.Symbol
        
    def OnData(self, data):
        calendar1 = self.TradingCalendar.GetDaysByType(TradingDayType.PublicHoliday, self.Time, self.Time)
        calendar2 = self.TradingCalendar.GetDaysByType(TradingDayType.Weekend, self.Time, self.Time + timedelta(days=2))
        
        holidays = [i.Date for i in calendar1]
        weekends = [i.Date for i in calendar2]
        
        # subtract weekends in all holidays
        public_holidays = list(set(holidays) - set(weekends))

        if not self.Portfolio.Invested and len(public_holidays) > 0:
            self.SetHoldings(self.symbol, 1)
        if self.Portfolio.Invested and len(public_holidays) == 0:
            self.Liquidate()

# Quandl free data
class QuandlFutures(PythonQuandl):
    def __init__(self):
        self.ValueColumnName = "settle"
import numpy as np

def Return(values):
    return (values[-1] - values[0]) / values[0]
    
def Volatility(values):
    values = np.array(values)
    returns = (values[1:] - values[:-1]) / values[:-1]
    return np.std(returns)  

# Custom fee model
class CustomFeeModel(FeeModel):
    def GetOrderFee(self, parameters):
        fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00005
        return OrderFee(CashAmount(fee, "USD"))

# Quandl free data
class QuandlFutures(PythonQuandl):
    def __init__(self):
        self.ValueColumnName = "settle"
        
# Quantpedia data
# NOTE: IMPORTANT: Data order must be ascending (datewise)
class QuantpediaFutures(PythonData):
    def GetSource(self, config, date, isLiveMode):
        return SubscriptionDataSource("data.quantpedia.com/backtesting_data/futures/{0}.csv".format(config.Symbol.Value), SubscriptionTransportMedium.RemoteFile, FileFormat.Csv)

    def Reader(self, config, line, date, isLiveMode):
        data = QuantpediaFutures()
        data.Symbol = config.Symbol
        
        if not line[0].isdigit(): return None
        split = line.split(';')
        
        data.Time = datetime.strptime(split[0], "%d.%m.%Y") + timedelta(days=1)
        data['settle'] = float(split[1])
        data.Value = float(split[1])

        return data