◈ExchangeKit

Trading days · market holidays · 2025–2028

Market holidays and trading days.

Every closure day for the world's major stock exchanges, with trading-day counts, monthly breakdowns, one-click .ics subscriptions and a free JSON API.

Market map — live open / closed

Every exchange on one interactive map. Green pulsing dots are markets open right now; we locate you automatically. Drag to pan, scroll to zoom.loading…

Open nowClosedYou

Exchanges

Trading days and the next closure for 2026.

[Ad slot]

Why this matters

Settlement, payroll, FX valuation, fund NAV, trading windows and deadline planning all depend on the exchange calendar — not just public holidays. ExchangeKit gives you the exact list per exchange and year.

Cross-check with your broker or exchange notice before acting on time-sensitive trades.

FAQ

What counts as a market holiday?
A weekday on which the exchange is closed. Weekends are always non-trading days and are not listed.
Where does the data come from?
Exchange holiday rules are computed with pandas-market-calendars; names are joined from open public-holiday datasets.
Can I subscribe to an exchange calendar?
Yes — every exchange page has .ics links for Google Calendar, Apple Calendar and Outlook.
(function(){ var svg=document.getElementById('exmap'); if(!svg) return; var g=document.getElementById('map-g'), tip=document.getElementById('map-tip'); var W=1000,H=500; var COUNTRY_POS={"US":[39.5,-98.4],"CA":[56.1,-106.3],"MX":[23.6,-102.6],"BR":[-14.2,-51.9],"AR":[-38.4,-63.6],"CL":[-35.7,-71.5],"CO":[4.6,-74.3],"PE":[-9.2,-75.0],"GB":[55.4,-3.4],"IE":[53.4,-8.2],"FR":[46.2,2.2],"DE":[51.2,10.4],"ES":[40.5,-3.7],"IT":[41.9,12.6],"NL":[52.1,5.3],"BE":[50.5,4.5],"AT":[47.5,14.6],"CH":[46.8,8.2],"PT":[39.4,-8.2],"SE":[60.1,18.6],"NO":[60.5,8.5],"DK":[56.3,9.5],"FI":[61.9,25.7],"PL":[51.9,19.1],"CZ":[49.8,15.5],"HU":[47.2,19.5],"GR":[39.1,21.8],"RU":[61.5,60.0],"UA":[48.4,31.2],"TR":[39.0,35.2],"IL":[31.0,34.9],"SA":[23.9,45.1],"AE":[23.4,53.8],"EG":[26.8,30.8],"ZA":[-30.6,22.9],"NG":[9.1,8.7],"KE":[0.0,37.9],"CN":[35.9,104.2],"JP":[36.2,138.3],"KR":[35.9,127.8],"TW":[23.7,121.0],"HK":[22.3,114.2],"SG":[1.35,103.8],"MY":[4.2,101.9],"TH":[15.9,101.0],"VN":[14.1,108.3],"ID":[-2.5,118.0],"PH":[12.9,121.8],"IN":[20.6,78.9],"PK":[30.4,69.3],"BD":[23.7,90.4],"AU":[-25.3,133.8],"NZ":[-41.0,174.9],"SA_":[23.9,45.1]}; function px(lat,lon){ return [(lon+180)/360*W,(90-lat)/180*H]; } var markers=[].slice.call(document.querySelectorAll('.ex-dot')); markers.forEach(function(m){ var p=px(parseFloat(m.getAttribute('data-lat')),parseFloat(m.getAttribute('data-lon'))); m.setAttribute('transform','translate('+p[0].toFixed(1)+','+p[1].toFixed(1)+')'); }); function status(m){ var tz=m.getAttribute('data-tz'), open=m.getAttribute('data-open'), close=m.getAttribute('data-close'); try{ var parts=new Intl.DateTimeFormat('en-GB',{timeZone:tz,weekday:'short',hour:'2-digit',minute:'2-digit',hour12:false}).formatToParts(new Date()); var map={}; parts.forEach(function(p){ map[p.type]=p.value; }); var hm=map.hour+':'+map.minute, wd=map.weekday; var isOpen = (wd!=='Sat'&&wd!=='Sun') && hm>=open && hm · '+m.getAttribute('data-city')+ '
'+(s.open?'Open':'Closed')+ ' · local '+s.local; tip.classList.add('on'); var rect=svg.parentNode.getBoundingClientRect(); tip.style.left=Math.max(70,Math.min(rect.width-70,ev.clientX-rect.left))+'px'; tip.style.top=(ev.clientY-rect.top)+'px'; } markers.forEach(function(m){ m.addEventListener('pointerenter',function(e){ showTip(m,e); }); m.addEventListener('pointermove',function(e){ showTip(m,e); }); m.addEventListener('pointerleave',function(){ tip.classList.remove('on'); }); m.addEventListener('click',function(){ location.href=m.getAttribute('data-href'); }); }); var view={x:0,y:0,k:1}; function apply(){ g.setAttribute('transform','translate('+view.x.toFixed(2)+','+view.y.toFixed(2)+') scale('+view.k.toFixed(3)+')'); } apply(); var drag=null; svg.addEventListener('pointerdown',function(e){ drag={x:e.clientX,y:e.clientY,vx:view.x,vy:view.y}; svg.classList.add('dragging'); try{svg.setPointerCapture(e.pointerId);}catch(err){} }); svg.addEventListener('pointermove',function(e){ if(!drag) return; var r=svg.getBoundingClientRect(); var k=W/r.width; view.x=drag.vx+(e.clientX-drag.x)*k; view.y=drag.vy+(e.clientY-drag.y)*k; apply(); }); function endDrag(){ drag=null; svg.classList.remove('dragging'); } svg.addEventListener('pointerup',endDrag); svg.addEventListener('pointercancel',endDrag); function zoomAt(factor,cx,cy){ var nk=Math.min(9,Math.max(1,view.k*factor)); view.x=cx-(cx-view.x)*nk/view.k; view.y=cy-(cy-view.y)*nk/view.k; view.k=nk; apply(); } svg.addEventListener('wheel',function(e){ e.preventDefault(); var r=svg.getBoundingClientRect(); zoomAt(e.deltaY<0?1.18:1/1.18,(e.clientX-r.left)*W/r.width,(e.clientY-r.top)*H/r.height); },{passive:false}); var ctr=[W/2,H/2]; svg.parentNode.querySelectorAll('[data-map-zoom]').forEach(function(b){ b.addEventListener('click',function(){ zoomAt(b.getAttribute('data-map-zoom')==='in'?1.4:1/1.4,ctr[0],ctr[1]); }); }); var resetBtn=svg.parentNode.querySelector('[data-map-reset]'); if(resetBtn) resetBtn.addEventListener('click',function(){ flyTo(0,0,1); }); function animateTo(t,k){ var s={x:view.x,y:view.y,k:view.k}, t0=performance.now(), dur=650; function step(now){ var p=Math.min(1,(now-t0)/dur), e=1-Math.pow(1-p,3); view.x=s.x+(t.x-s.x)*e; view.y=s.y+(t.y-s.y)*e; view.k=s.k+(t.k-s.k)*e; apply(); if(p<1) requestAnimationFrame(step); } requestAnimationFrame(step); } function flyTo(lat,lon,k){ var p=px(lat,lon); var nk=k||2.2; animateTo({x:W/2-p[0]*nk,y:H/2-p[1]*nk,k:nk}); } function addYou(lat,lon){ var p=px(lat,lon); var ns='http://www.w3.org/2000/svg'; var yg=document.createElementNS(ns,'g'); yg.setAttribute('class','you-dot'); yg.setAttribute('transform','translate('+p[0].toFixed(1)+','+p[1].toFixed(1)+')'); var r1=document.createElementNS(ns,'circle'); r1.setAttribute('class','ring'); r1.setAttribute('r','10'); var r2=document.createElementNS(ns,'circle'); r2.setAttribute('class','core'); r2.setAttribute('r','3.2'); yg.appendChild(r1); yg.appendChild(r2); g.appendChild(yg); g.appendChild(yg); } function locate(){ fetch('/geo').then(function(r){ return r.ok?r.json():null; }).then(function(d){ var cc=d&&(d.country||''); cc=(cc||'').toUpperCase(); var pos=COUNTRY_POS[cc]; if(pos){ addYou(pos[0],pos[1]); flyTo(pos[0],pos[1],2.3); } }).catch(function(){ try{ var tz=Intl.DateTimeFormat().resolvedOptions().timeZone||''; if(/Shanghai|Chongqing|Urumqi/.test(tz)){ var p=COUNTRY_POS['CN']; addYou(p[0],p[1]); flyTo(p[0],p[1],2.3); } }catch(e){} }); } var locBtn=svg.parentNode.querySelector('[data-map-locate]'); if(locBtn) locBtn.addEventListener('click',locate); locate(); })();