\n \n \n <\script src=\"https://interactive.guim.co.uk/libs/iframe-messenger/iframeMessenger.js\"><\/script>\n \n\n
FTSE 100 in 2020
Index
Last
4,500
5,000
5,500
6,000
6,500
7,000
7,500
8,000
Jan 2020
Apr
Jul
Oct
\n\n \n <\script>\n var elChart = document.querySelector(\".js-chart\")\n var elAxisX = document.querySelector(\".axis-x\")\n var elsText = elAxisX ? elAxisX.querySelectorAll(\".axis-x-text\") : []\n var indentL = elAxisX ? parseInt(elAxisX.dataset.lIndent, 10) : 0\n var extendR = elAxisX ? parseInt(elAxisX.dataset.rIndent, 10) : 0\n var isBarBased = elChart.getAttribute(\"data-id\").toLowerCase().indexOf(\"bar\") > -1\n\n // responsive\n function responsive() {\n iframeMessenger.resize() // 1\n rescaleSvgElements() // 2\n updateYLabelWidths() // 3\n updateXAxisTextPosition() // 4\n updateChartHeight() // 5\n }\n responsive()\n\n // handle event\n var timeout = null\n window.addEventListener('resize', function(evt) {\n if (timeout) window.clearTimeout(timeout)\n timeout = window.setTimeout(function() {\n responsive()\n timeout = null\n }, 200)\n });\n\n /* 1. iframe resize */\n // iframeMessenger for embed in guardian's page\n\n /* 2. svg path or circle rescale */\n function rescaleSvgElements() {\n var width = 300\n var elSvg = document.querySelector(\"svg\")\n if (elSvg) {\n var svgWidth = elSvg.getBoundingClientRect().width\n // line chart\n var strokeWidth = Math.round(2*width*10/svgWidth)/10\n var paths = Array.prototype.slice.call(document.querySelectorAll(\"path\"))\n paths.forEach(function(path) { path.setAttribute(\"stroke-width\", strokeWidth); })\n // plot chart\n var r = Math.round(3*width*10/svgWidth)/10\n var circles = Array.prototype.slice.call(document.querySelectorAll(\"circle\"))\n circles.forEach(function(circle) { circle.setAttribute(\"r\", r); })\n }}\n\n /* 3. y label width update */\n function updateYLabelWidths() {\n if (elChart.getAttribute(\"data-res-y\") === \"false\") return\n\n const elRows = [...elChart.querySelectorAll(\".row\")]\n const elGroups = [...elChart.querySelectorAll(\".group\")]\n const elLegend = document.querySelector(\".legend\")\n const labelWidth = elChart.querySelector(\".label\").offsetWidth\n const chartWidth = elChart.offsetWidth\n const isInline = labelWidth <= chartWidth/3\n\n elRows.forEach(el => {\n el.style.height = isInline ? \"24px\" : \"auto\"\n })\n elGroups.forEach(el => {\n el.style.width = isInline ? \"calc(\" + 100 + \"% - \" + labelWidth + \"px)\" : \"100%\"\n el.style.display = isInline ? \"inline-block\" : \"block\"\n })\n\n elAxisX.style.width = \"calc(100% - \" + ((isInline ? labelWidth : 0) + indentL + extendR + 1) + \"px)\"\n elLegend.style.marginLeft = isInline ? labelWidth + \"px\" : 0\n }\n\n /* 4. x axis text position update */\n function updateXAxisTextPosition() {\n if (!elAxisX) return\n\n var elsTick = elAxisX.querySelectorAll(\".axis-x-tick\")\n var elTest = document.querySelector(\".js-test-res\")\n\n // a. default width / left\n var axisXWidth = elAxisX.offsetWidth\n var maxWidth = elsTick[1].offsetLeft - elsTick[0].offsetLeft\n var txtWidths = [].slice.call(elsText).map((el, i) => {\n elTest.textContent = el.textContent\n var txtWidth = elTest.offsetWidth + 2\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n el.style.textAlign = \"center\"\n return txtWidth\n })\n elTest.textContent = \"\"\n\n // b. adjust width if multi lines\n var isMultiLine = txtWidths.find(w => w > maxWidth)\n if (isMultiLine) {\n [].slice.call(elsText).forEach((el, i) => {\n var txtWidth = el.querySelector(\"span\").offsetWidth + 1\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n })\n }\n\n // c. adjust two ends if out of frame\n var iLast = elsTick.length - 1\n var indent = parseInt(elAxisX.dataset.yIndent, 10) + indentL\n var textStrLeft = (indent + elsTick[0].offsetLeft) - elsText[0].offsetWidth / 2\n var textEndRight = (axisXWidth + extendR - elsTick[iLast].offsetLeft) - elsText[iLast].offsetWidth / 2\n if (textStrLeft < 0) {\n elsText[0].style.left = ((isBarBased ? 0 : 1) - indent) + \"px\"\n elsText[0].style.textAlign = \"left\"\n }\n if (textEndRight < 0) {\n elsText[iLast].style.left = \"auto\"\n elsText[iLast].style.right = (-1) - extendR + \"px\"\n elsText[iLast].style.textAlign = \"right\"\n }\n }\n\n /* chart height update */\n function updateChartHeight() {\n var elsLabel = document.querySelectorAll(\".label-x .label\")\n var isAxisXBottom = elAxisX ? (elAxisX.dataset.xBottom===\"true\") : false\n if (isAxisXBottom || elsLabel.length > 0) {\n var elsAll = [].slice.call(elsText).concat([].slice.call(elsLabel))\n var heights = elsAll.map(el => Math.ceil(el.offsetHeight))\n var maxHeight = Math.max.apply(null, heights)\n elChart.style.marginBottom = (maxHeight + 14) + \"px\"\n }\n }\n <\/script>\n
\n","id":"b7da7d90-da99-4b0b-ac51-4938affb825d","url":"https://api.nextgen.guardianapps.co.uk/embed/atom/chart/b7da7d90-da99-4b0b-ac51-4938affb825d"},{"elementId":"9c06b807-99b7-4dd2-8109-f3d373599052","_type":"model.dotcomrendering.pageElements.ChartAtomBlockElement","html":"\n\n\n \n \n \n <\script src=\"https://interactive.guim.co.uk/libs/iframe-messenger/iframeMessenger.js\"><\/script>\n \n\n
Brent crude oil in 2020
Dollars a barrel
Last
10
20
30
40
50
60
70
Apr
Jul
Oct
\n\n \n <\script>\n var elChart = document.querySelector(\".js-chart\")\n var elAxisX = document.querySelector(\".axis-x\")\n var elsText = elAxisX ? elAxisX.querySelectorAll(\".axis-x-text\") : []\n var indentL = elAxisX ? parseInt(elAxisX.dataset.lIndent, 10) : 0\n var extendR = elAxisX ? parseInt(elAxisX.dataset.rIndent, 10) : 0\n var isBarBased = elChart.getAttribute(\"data-id\").toLowerCase().indexOf(\"bar\") > -1\n\n // responsive\n function responsive() {\n iframeMessenger.resize() // 1\n rescaleSvgElements() // 2\n updateYLabelWidths() // 3\n updateXAxisTextPosition() // 4\n updateChartHeight() // 5\n }\n responsive()\n\n // handle event\n var timeout = null\n window.addEventListener('resize', function(evt) {\n if (timeout) window.clearTimeout(timeout)\n timeout = window.setTimeout(function() {\n responsive()\n timeout = null\n }, 200)\n });\n\n /* 1. iframe resize */\n // iframeMessenger for embed in guardian's page\n\n /* 2. svg path or circle rescale */\n function rescaleSvgElements() {\n var width = 300\n var elSvg = document.querySelector(\"svg\")\n if (elSvg) {\n var svgWidth = elSvg.getBoundingClientRect().width\n // line chart\n var strokeWidth = Math.round(2*width*10/svgWidth)/10\n var paths = Array.prototype.slice.call(document.querySelectorAll(\"path\"))\n paths.forEach(function(path) { path.setAttribute(\"stroke-width\", strokeWidth); })\n // plot chart\n var r = Math.round(3*width*10/svgWidth)/10\n var circles = Array.prototype.slice.call(document.querySelectorAll(\"circle\"))\n circles.forEach(function(circle) { circle.setAttribute(\"r\", r); })\n }}\n\n /* 3. y label width update */\n function updateYLabelWidths() {\n if (elChart.getAttribute(\"data-res-y\") === \"false\") return\n\n const elRows = [...elChart.querySelectorAll(\".row\")]\n const elGroups = [...elChart.querySelectorAll(\".group\")]\n const elLegend = document.querySelector(\".legend\")\n const labelWidth = elChart.querySelector(\".label\").offsetWidth\n const chartWidth = elChart.offsetWidth\n const isInline = labelWidth <= chartWidth/3\n\n elRows.forEach(el => {\n el.style.height = isInline ? \"24px\" : \"auto\"\n })\n elGroups.forEach(el => {\n el.style.width = isInline ? \"calc(\" + 100 + \"% - \" + labelWidth + \"px)\" : \"100%\"\n el.style.display = isInline ? \"inline-block\" : \"block\"\n })\n\n elAxisX.style.width = \"calc(100% - \" + ((isInline ? labelWidth : 0) + indentL + extendR + 1) + \"px)\"\n elLegend.style.marginLeft = isInline ? labelWidth + \"px\" : 0\n }\n\n /* 4. x axis text position update */\n function updateXAxisTextPosition() {\n if (!elAxisX) return\n\n var elsTick = elAxisX.querySelectorAll(\".axis-x-tick\")\n var elTest = document.querySelector(\".js-test-res\")\n\n // a. default width / left\n var axisXWidth = elAxisX.offsetWidth\n var maxWidth = elsTick[1].offsetLeft - elsTick[0].offsetLeft\n var txtWidths = [].slice.call(elsText).map((el, i) => {\n elTest.textContent = el.textContent\n var txtWidth = elTest.offsetWidth + 2\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n el.style.textAlign = \"center\"\n return txtWidth\n })\n elTest.textContent = \"\"\n\n // b. adjust width if multi lines\n var isMultiLine = txtWidths.find(w => w > maxWidth)\n if (isMultiLine) {\n [].slice.call(elsText).forEach((el, i) => {\n var txtWidth = el.querySelector(\"span\").offsetWidth + 1\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n })\n }\n\n // c. adjust two ends if out of frame\n var iLast = elsTick.length - 1\n var indent = parseInt(elAxisX.dataset.yIndent, 10) + indentL\n var textStrLeft = (indent + elsTick[0].offsetLeft) - elsText[0].offsetWidth / 2\n var textEndRight = (axisXWidth + extendR - elsTick[iLast].offsetLeft) - elsText[iLast].offsetWidth / 2\n if (textStrLeft < 0) {\n elsText[0].style.left = ((isBarBased ? 0 : 1) - indent) + \"px\"\n elsText[0].style.textAlign = \"left\"\n }\n if (textEndRight < 0) {\n elsText[iLast].style.left = \"auto\"\n elsText[iLast].style.right = (-1) - extendR + \"px\"\n elsText[iLast].style.textAlign = \"right\"\n }\n }\n\n /* chart height update */\n function updateChartHeight() {\n var elsLabel = document.querySelectorAll(\".label-x .label\")\n var isAxisXBottom = elAxisX ? (elAxisX.dataset.xBottom===\"true\") : false\n if (isAxisXBottom || elsLabel.length > 0) {\n var elsAll = [].slice.call(elsText).concat([].slice.call(elsLabel))\n var heights = elsAll.map(el => Math.ceil(el.offsetHeight))\n var maxHeight = Math.max.apply(null, heights)\n elChart.style.marginBottom = (maxHeight + 14) + \"px\"\n }\n }\n <\/script>\n \n","id":"477a99d3-8a8e-40ed-add0-eae7c746a385","url":"https://api.nextgen.guardianapps.co.uk/embed/atom/chart/477a99d3-8a8e-40ed-add0-eae7c746a385"},{"elementId":"0228c303-dde3-447b-8838-a51be23b9e2f","_type":"model.dotcomrendering.pageElements.ChartAtomBlockElement","html":"\n\n\n \n \n \n <\script src=\"https://interactive.guim.co.uk/libs/iframe-messenger/iframeMessenger.js\"><\/script>\n \n\n
Pound v dollar
Value of £1 in dollars
Last
1.1
1.15
1.2
1.25
1.3
1.35
Jan
Apr
Jul
Oct
\n\n \n <\script>\n var elChart = document.querySelector(\".js-chart\")\n var elAxisX = document.querySelector(\".axis-x\")\n var elsText = elAxisX ? elAxisX.querySelectorAll(\".axis-x-text\") : []\n var indentL = elAxisX ? parseInt(elAxisX.dataset.lIndent, 10) : 0\n var extendR = elAxisX ? parseInt(elAxisX.dataset.rIndent, 10) : 0\n var isBarBased = elChart.getAttribute(\"data-id\").toLowerCase().indexOf(\"bar\") > -1\n\n // responsive\n function responsive() {\n iframeMessenger.resize() // 1\n rescaleSvgElements() // 2\n updateYLabelWidths() // 3\n updateXAxisTextPosition() // 4\n updateChartHeight() // 5\n }\n responsive()\n\n // handle event\n var timeout = null\n window.addEventListener('resize', function(evt) {\n if (timeout) window.clearTimeout(timeout)\n timeout = window.setTimeout(function() {\n responsive()\n timeout = null\n }, 200)\n });\n\n /* 1. iframe resize */\n // iframeMessenger for embed in guardian's page\n\n /* 2. svg path or circle rescale */\n function rescaleSvgElements() {\n var width = 300\n var elSvg = document.querySelector(\"svg\")\n if (elSvg) {\n var svgWidth = elSvg.getBoundingClientRect().width\n // line chart\n var strokeWidth = Math.round(2*width*10/svgWidth)/10\n var paths = Array.prototype.slice.call(document.querySelectorAll(\"path\"))\n paths.forEach(function(path) { path.setAttribute(\"stroke-width\", strokeWidth); })\n // plot chart\n var r = Math.round(3*width*10/svgWidth)/10\n var circles = Array.prototype.slice.call(document.querySelectorAll(\"circle\"))\n circles.forEach(function(circle) { circle.setAttribute(\"r\", r); })\n }}\n\n /* 3. y label width update */\n function updateYLabelWidths() {\n if (elChart.getAttribute(\"data-res-y\") === \"false\") return\n\n const elRows = [...elChart.querySelectorAll(\".row\")]\n const elGroups = [...elChart.querySelectorAll(\".group\")]\n const elLegend = document.querySelector(\".legend\")\n const labelWidth = elChart.querySelector(\".label\").offsetWidth\n const chartWidth = elChart.offsetWidth\n const isInline = labelWidth <= chartWidth/3\n\n elRows.forEach(el => {\n el.style.height = isInline ? \"24px\" : \"auto\"\n })\n elGroups.forEach(el => {\n el.style.width = isInline ? \"calc(\" + 100 + \"% - \" + labelWidth + \"px)\" : \"100%\"\n el.style.display = isInline ? \"inline-block\" : \"block\"\n })\n\n elAxisX.style.width = \"calc(100% - \" + ((isInline ? labelWidth : 0) + indentL + extendR + 1) + \"px)\"\n elLegend.style.marginLeft = isInline ? labelWidth + \"px\" : 0\n }\n\n /* 4. x axis text position update */\n function updateXAxisTextPosition() {\n if (!elAxisX) return\n\n var elsTick = elAxisX.querySelectorAll(\".axis-x-tick\")\n var elTest = document.querySelector(\".js-test-res\")\n\n // a. default width / left\n var axisXWidth = elAxisX.offsetWidth\n var maxWidth = elsTick[1].offsetLeft - elsTick[0].offsetLeft\n var txtWidths = [].slice.call(elsText).map((el, i) => {\n elTest.textContent = el.textContent\n var txtWidth = elTest.offsetWidth + 2\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n el.style.textAlign = \"center\"\n return txtWidth\n })\n elTest.textContent = \"\"\n\n // b. adjust width if multi lines\n var isMultiLine = txtWidths.find(w => w > maxWidth)\n if (isMultiLine) {\n [].slice.call(elsText).forEach((el, i) => {\n var txtWidth = el.querySelector(\"span\").offsetWidth + 1\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n })\n }\n\n // c. adjust two ends if out of frame\n var iLast = elsTick.length - 1\n var indent = parseInt(elAxisX.dataset.yIndent, 10) + indentL\n var textStrLeft = (indent + elsTick[0].offsetLeft) - elsText[0].offsetWidth / 2\n var textEndRight = (axisXWidth + extendR - elsTick[iLast].offsetLeft) - elsText[iLast].offsetWidth / 2\n if (textStrLeft < 0) {\n elsText[0].style.left = ((isBarBased ? 0 : 1) - indent) + \"px\"\n elsText[0].style.textAlign = \"left\"\n }\n if (textEndRight < 0) {\n elsText[iLast].style.left = \"auto\"\n elsText[iLast].style.right = (-1) - extendR + \"px\"\n elsText[iLast].style.textAlign = \"right\"\n }\n }\n\n /* chart height update */\n function updateChartHeight() {\n var elsLabel = document.querySelectorAll(\".label-x .label\")\n var isAxisXBottom = elAxisX ? (elAxisX.dataset.xBottom===\"true\") : false\n if (isAxisXBottom || elsLabel.length > 0) {\n var elsAll = [].slice.call(elsText).concat([].slice.call(elsLabel))\n var heights = elsAll.map(el => Math.ceil(el.offsetHeight))\n var maxHeight = Math.max.apply(null, heights)\n elChart.style.marginBottom = (maxHeight + 14) + \"px\"\n }\n }\n <\/script>\n \n","id":"8fa3f5b0-71a9-452c-b7c4-320b30eafafc","url":"https://api.nextgen.guardianapps.co.uk/embed/atom/chart/8fa3f5b0-71a9-452c-b7c4-320b30eafafc"},{"elementId":"18488916-48af-491b-a92e-d3caebe384cd","_type":"model.dotcomrendering.pageElements.ChartAtomBlockElement","html":"\n\n\n \n \n \n <\script src=\"https://interactive.guim.co.uk/libs/iframe-messenger/iframeMessenger.js\"><\/script>\n \n\n
Gold price
Dollars an ounce
Last
1,400
1,500
1,600
1,700
1,800
1,900
2,000
2,100
Jan
Apr
Jul
Oct
\n\n \n <\script>\n var elChart = document.querySelector(\".js-chart\")\n var elAxisX = document.querySelector(\".axis-x\")\n var elsText = elAxisX ? elAxisX.querySelectorAll(\".axis-x-text\") : []\n var indentL = elAxisX ? parseInt(elAxisX.dataset.lIndent, 10) : 0\n var extendR = elAxisX ? parseInt(elAxisX.dataset.rIndent, 10) : 0\n var isBarBased = elChart.getAttribute(\"data-id\").toLowerCase().indexOf(\"bar\") > -1\n\n // responsive\n function responsive() {\n iframeMessenger.resize() // 1\n rescaleSvgElements() // 2\n updateYLabelWidths() // 3\n updateXAxisTextPosition() // 4\n updateChartHeight() // 5\n }\n responsive()\n\n // handle event\n var timeout = null\n window.addEventListener('resize', function(evt) {\n if (timeout) window.clearTimeout(timeout)\n timeout = window.setTimeout(function() {\n responsive()\n timeout = null\n }, 200)\n });\n\n /* 1. iframe resize */\n // iframeMessenger for embed in guardian's page\n\n /* 2. svg path or circle rescale */\n function rescaleSvgElements() {\n var width = 300\n var elSvg = document.querySelector(\"svg\")\n if (elSvg) {\n var svgWidth = elSvg.getBoundingClientRect().width\n // line chart\n var strokeWidth = Math.round(2*width*10/svgWidth)/10\n var paths = Array.prototype.slice.call(document.querySelectorAll(\"path\"))\n paths.forEach(function(path) { path.setAttribute(\"stroke-width\", strokeWidth); })\n // plot chart\n var r = Math.round(3*width*10/svgWidth)/10\n var circles = Array.prototype.slice.call(document.querySelectorAll(\"circle\"))\n circles.forEach(function(circle) { circle.setAttribute(\"r\", r); })\n }}\n\n /* 3. y label width update */\n function updateYLabelWidths() {\n if (elChart.getAttribute(\"data-res-y\") === \"false\") return\n\n const elRows = [...elChart.querySelectorAll(\".row\")]\n const elGroups = [...elChart.querySelectorAll(\".group\")]\n const elLegend = document.querySelector(\".legend\")\n const labelWidth = elChart.querySelector(\".label\").offsetWidth\n const chartWidth = elChart.offsetWidth\n const isInline = labelWidth <= chartWidth/3\n\n elRows.forEach(el => {\n el.style.height = isInline ? \"24px\" : \"auto\"\n })\n elGroups.forEach(el => {\n el.style.width = isInline ? \"calc(\" + 100 + \"% - \" + labelWidth + \"px)\" : \"100%\"\n el.style.display = isInline ? \"inline-block\" : \"block\"\n })\n\n elAxisX.style.width = \"calc(100% - \" + ((isInline ? labelWidth : 0) + indentL + extendR + 1) + \"px)\"\n elLegend.style.marginLeft = isInline ? labelWidth + \"px\" : 0\n }\n\n /* 4. x axis text position update */\n function updateXAxisTextPosition() {\n if (!elAxisX) return\n\n var elsTick = elAxisX.querySelectorAll(\".axis-x-tick\")\n var elTest = document.querySelector(\".js-test-res\")\n\n // a. default width / left\n var axisXWidth = elAxisX.offsetWidth\n var maxWidth = elsTick[1].offsetLeft - elsTick[0].offsetLeft\n var txtWidths = [].slice.call(elsText).map((el, i) => {\n elTest.textContent = el.textContent\n var txtWidth = elTest.offsetWidth + 2\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n el.style.textAlign = \"center\"\n return txtWidth\n })\n elTest.textContent = \"\"\n\n // b. adjust width if multi lines\n var isMultiLine = txtWidths.find(w => w > maxWidth)\n if (isMultiLine) {\n [].slice.call(elsText).forEach((el, i) => {\n var txtWidth = el.querySelector(\"span\").offsetWidth + 1\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n })\n }\n\n // c. adjust two ends if out of frame\n var iLast = elsTick.length - 1\n var indent = parseInt(elAxisX.dataset.yIndent, 10) + indentL\n var textStrLeft = (indent + elsTick[0].offsetLeft) - elsText[0].offsetWidth / 2\n var textEndRight = (axisXWidth + extendR - elsTick[iLast].offsetLeft) - elsText[iLast].offsetWidth / 2\n if (textStrLeft < 0) {\n elsText[0].style.left = ((isBarBased ? 0 : 1) - indent) + \"px\"\n elsText[0].style.textAlign = \"left\"\n }\n if (textEndRight < 0) {\n elsText[iLast].style.left = \"auto\"\n elsText[iLast].style.right = (-1) - extendR + \"px\"\n elsText[iLast].style.textAlign = \"right\"\n }\n }\n\n /* chart height update */\n function updateChartHeight() {\n var elsLabel = document.querySelectorAll(\".label-x .label\")\n var isAxisXBottom = elAxisX ? (elAxisX.dataset.xBottom===\"true\") : false\n if (isAxisXBottom || elsLabel.length > 0) {\n var elsAll = [].slice.call(elsText).concat([].slice.call(elsLabel))\n var heights = elsAll.map(el => Math.ceil(el.offsetHeight))\n var maxHeight = Math.max.apply(null, heights)\n elChart.style.marginBottom = (maxHeight + 14) + \"px\"\n }\n }\n <\/script>\n \n","id":"b06c0cd8-1161-43f3-a99f-ead0668739c2","url":"https://api.nextgen.guardianapps.co.uk/embed/atom/chart/b06c0cd8-1161-43f3-a99f-ead0668739c2"},{"elementId":"cb3e99fe-fe39-4a36-ae17-8ea21cb84b1d","_type":"model.dotcomrendering.pageElements.ChartAtomBlockElement","html":"\n\n\n \n \n \n <\script src=\"https://interactive.guim.co.uk/libs/iframe-messenger/iframeMessenger.js\"><\/script>\n \n\n
Bitcoin
Value in US dollars
Last
0
5,000
10,000
15,000
20,000
25,000
30,000
Jan
Apr
Jul
Oct
\n\n \n <\script>\n var elChart = document.querySelector(\".js-chart\")\n var elAxisX = document.querySelector(\".axis-x\")\n var elsText = elAxisX ? elAxisX.querySelectorAll(\".axis-x-text\") : []\n var indentL = elAxisX ? parseInt(elAxisX.dataset.lIndent, 10) : 0\n var extendR = elAxisX ? parseInt(elAxisX.dataset.rIndent, 10) : 0\n var isBarBased = elChart.getAttribute(\"data-id\").toLowerCase().indexOf(\"bar\") > -1\n\n // responsive\n function responsive() {\n iframeMessenger.resize() // 1\n rescaleSvgElements() // 2\n updateYLabelWidths() // 3\n updateXAxisTextPosition() // 4\n updateChartHeight() // 5\n }\n responsive()\n\n // handle event\n var timeout = null\n window.addEventListener('resize', function(evt) {\n if (timeout) window.clearTimeout(timeout)\n timeout = window.setTimeout(function() {\n responsive()\n timeout = null\n }, 200)\n });\n\n /* 1. iframe resize */\n // iframeMessenger for embed in guardian's page\n\n /* 2. svg path or circle rescale */\n function rescaleSvgElements() {\n var width = 300\n var elSvg = document.querySelector(\"svg\")\n if (elSvg) {\n var svgWidth = elSvg.getBoundingClientRect().width\n // line chart\n var strokeWidth = Math.round(2*width*10/svgWidth)/10\n var paths = Array.prototype.slice.call(document.querySelectorAll(\"path\"))\n paths.forEach(function(path) { path.setAttribute(\"stroke-width\", strokeWidth); })\n // plot chart\n var r = Math.round(3*width*10/svgWidth)/10\n var circles = Array.prototype.slice.call(document.querySelectorAll(\"circle\"))\n circles.forEach(function(circle) { circle.setAttribute(\"r\", r); })\n }}\n\n /* 3. y label width update */\n function updateYLabelWidths() {\n if (elChart.getAttribute(\"data-res-y\") === \"false\") return\n\n const elRows = [...elChart.querySelectorAll(\".row\")]\n const elGroups = [...elChart.querySelectorAll(\".group\")]\n const elLegend = document.querySelector(\".legend\")\n const labelWidth = elChart.querySelector(\".label\").offsetWidth\n const chartWidth = elChart.offsetWidth\n const isInline = labelWidth <= chartWidth/3\n\n elRows.forEach(el => {\n el.style.height = isInline ? \"24px\" : \"auto\"\n })\n elGroups.forEach(el => {\n el.style.width = isInline ? \"calc(\" + 100 + \"% - \" + labelWidth + \"px)\" : \"100%\"\n el.style.display = isInline ? \"inline-block\" : \"block\"\n })\n\n elAxisX.style.width = \"calc(100% - \" + ((isInline ? labelWidth : 0) + indentL + extendR + 1) + \"px)\"\n elLegend.style.marginLeft = isInline ? labelWidth + \"px\" : 0\n }\n\n /* 4. x axis text position update */\n function updateXAxisTextPosition() {\n if (!elAxisX) return\n\n var elsTick = elAxisX.querySelectorAll(\".axis-x-tick\")\n var elTest = document.querySelector(\".js-test-res\")\n\n // a. default width / left\n var axisXWidth = elAxisX.offsetWidth\n var maxWidth = elsTick[1].offsetLeft - elsTick[0].offsetLeft\n var txtWidths = [].slice.call(elsText).map((el, i) => {\n elTest.textContent = el.textContent\n var txtWidth = elTest.offsetWidth + 2\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n el.style.textAlign = \"center\"\n return txtWidth\n })\n elTest.textContent = \"\"\n\n // b. adjust width if multi lines\n var isMultiLine = txtWidths.find(w => w > maxWidth)\n if (isMultiLine) {\n [].slice.call(elsText).forEach((el, i) => {\n var txtWidth = el.querySelector(\"span\").offsetWidth + 1\n var resWidth = Math.min(txtWidth, maxWidth)\n el.style.width = resWidth + \"px\"\n el.style.left = (elsTick[i].offsetLeft - resWidth / 2) * 100 / axisXWidth + \"%\"\n })\n }\n\n // c. adjust two ends if out of frame\n var iLast = elsTick.length - 1\n var indent = parseInt(elAxisX.dataset.yIndent, 10) + indentL\n var textStrLeft = (indent + elsTick[0].offsetLeft) - elsText[0].offsetWidth / 2\n var textEndRight = (axisXWidth + extendR - elsTick[iLast].offsetLeft) - elsText[iLast].offsetWidth / 2\n if (textStrLeft < 0) {\n elsText[0].style.left = ((isBarBased ? 0 : 1) - indent) + \"px\"\n elsText[0].style.textAlign = \"left\"\n }\n if (textEndRight < 0) {\n elsText[iLast].style.left = \"auto\"\n elsText[iLast].style.right = (-1) - extendR + \"px\"\n elsText[iLast].style.textAlign = \"right\"\n }\n }\n\n /* chart height update */\n function updateChartHeight() {\n var elsLabel = document.querySelectorAll(\".label-x .label\")\n var isAxisXBottom = elAxisX ? (elAxisX.dataset.xBottom===\"true\") : false\n if (isAxisXBottom || elsLabel.length > 0) {\n var elsAll = [].slice.call(elsText).concat([].slice.call(elsLabel))\n var heights = elsAll.map(el => Math.ceil(el.offsetHeight))\n var maxHeight = Math.max.apply(null, heights)\n elChart.style.marginBottom = (maxHeight + 14) + \"px\"\n }\n }\n <\/script>\n \n","id":"48034160-b07a-4965-9dc0-ebfb0d4d8061","url":"https://api.nextgen.guardianapps.co.uk/embed/atom/chart/48034160-b07a-4965-9dc0-ebfb0d4d8061"}]},"site":"frontend","page":"Article","NAV":{"topLevelPillars":[{"title":"News","longTitle":"Headlines","url":"/","pillar":0,"mobileOnly":false},{"title":"Opinion","longTitle":"Opinion home","url":"/commentisfree","pillar":1,"mobileOnly":false},{"title":"Sport","longTitle":"Sport home","url":"/sport","pillar":2,"mobileOnly":false},{"title":"Culture","longTitle":"Culture home","url":"/culture","pillar":3,"mobileOnly":false},{"title":"Lifestyle","longTitle":"Lifestyle home","url":"/lifeandstyle","pillar":4,"mobileOnly":false}],"currentNavLink":"Markets","subNavSections":{"parent":{"title":"Business","longTitle":"Business","url":"/business","children":[{"title":"Economics","longTitle":"Economics","url":"/business/economics","children":[],"mobileOnly":false},{"title":"Banking","longTitle":"Banking","url":"/business/banking","children":[],"mobileOnly":false},{"title":"Money","longTitle":"Money","url":"/money","children":[{"title":"Property","longTitle":"Property","url":"/money/property","children":[],"mobileOnly":false},{"title":"Pensions","longTitle":"Pensions","url":"/money/pensions","children":[],"mobileOnly":false},{"title":"Savings","longTitle":"Savings","url":"/money/savings","children":[],"mobileOnly":false},{"title":"Borrowing","longTitle":"Borrowing","url":"/money/debt","children":[],"mobileOnly":false},{"title":"Careers","longTitle":"Careers","url":"/money/work-and-careers","children":[],"mobileOnly":false}],"mobileOnly":false},{"title":"Markets","longTitle":"Markets","url":"/business/stock-markets","children":[],"mobileOnly":false},{"title":"Project Syndicate","longTitle":"Project Syndicate","url":"/business/series/project-syndicate-economists","children":[],"mobileOnly":false},{"title":"B2B","longTitle":"B2B","url":"/business-to-business","children":[],"mobileOnly":false},{"title":"Retail","longTitle":"Retail","url":"/business/retail","children":[],"mobileOnly":false}],"mobileOnly":false},"links":[{"title":"Economics","longTitle":"Economics","url":"/business/economics","children":[],"mobileOnly":false},{"title":"Banking","longTitle":"Banking","url":"/business/banking","children":[],"mobileOnly":false},{"title":"Money","longTitle":"Money","url":"/money","children":[{"title":"Property","longTitle":"Property","url":"/money/property","children":[],"mobileOnly":false},{"title":"Pensions","longTitle":"Pensions","url":"/money/pensions","children":[],"mobileOnly":false},{"title":"Savings","longTitle":"Savings","url":"/money/savings","children":[],"mobileOnly":false},{"title":"Borrowing","longTitle":"Borrowing","url":"/money/debt","children":[],"mobileOnly":false},{"title":"Careers","longTitle":"Careers","url":"/money/work-and-careers","children":[],"mobileOnly":false}],"mobileOnly":false},{"title":"Markets","longTitle":"Markets","url":"/business/stock-markets","children":[],"mobileOnly":false},{"title":"Project Syndicate","longTitle":"Project Syndicate","url":"/business/series/project-syndicate-economists","children":[],"mobileOnly":false},{"title":"B2B","longTitle":"B2B","url":"/business-to-business","children":[],"mobileOnly":false},{"title":"Retail","longTitle":"Retail","url":"/business/retail","children":[],"mobileOnly":false}]}},"GA":{"webTitle":"FTSE 100 suffers worst year since 2008 financial crisis","pillar":"news","section":"business","contentType":"article","commissioningDesks":"ukbusiness","contentId":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","authorIds":"profile/graemewearden","keywordIds":"business/ftse,business/business,business/stock-markets,world/coronavirus-outbreak,business/britishairways,business/rollsroycegroup,business/bp,business/lloyds-banking-group,business/natwest-group,business/scottishmortgageinvestmenttrust,technology/tesla,technology/amazon,business/tencent,business/ocado,business/nasdaq,business/nikkei,business/ubs","toneIds":"tone/news","seriesId":"","isHosted":"false","edition":"us","beaconUrl":"//phar.gu-web.net"},"linkedData":[{"@type":"NewsArticle","@context":"https://schema.org","@id":"https://amp.hlcarpenter.com/business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","publisher":{"@type":"Organization","@context":"https://schema.org","@id":"#publisher","name":"The Hlcarpenter.com","url":"/","logo":{"@type":"ImageObject","url":"https://uploads.guim.co.uk/2018/01/31/TheHlcarpenter.com_AMP.png","width":190,"height":60},"sameAs":["https://www.facebook.com/Hlcarpenter.com","https://twitter.com/guardian","https://www.youtube.com/user/TheHlcarpenter.com"]},"isAccessibleForFree":true,"isPartOf":{"@type":["CreativeWork","Product"],"name":"The Hlcarpenter.com","productID":"hlcarpenter.com:basic"},"image":["https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&enable=upscale&s=ad6a94be62e8cf8dc81787c79c78cd3f","https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1200&height=1200&quality=85&auto=format&fit=crop&s=a78049263c026bbda5608d8d90b4db6b","https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1200&height=900&quality=85&auto=format&fit=crop&s=5992aba92b1dce0ff8750eeed53e77a5","https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1200&quality=85&auto=format&fit=max&s=f3e771c49729c2130ea45b8b047c2d39"],"author":[{"@type":"Person","name":"Graeme Wearden","sameAs":"/profile/graemewearden"}],"datePublished":"2020-12-31T16:58:42.000Z","headline":"FTSE 100 suffers worst year since 2008 financial crisis","dateModified":"2021-01-01T04:36:52.000Z","mainEntityOfPage":"/business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis"},{"@type":"WebPage","@context":"https://schema.org","@id":"/business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","potentialAction":{"@type":"ViewAction","target":"android-app://com.guardian/https/www.hlcarpenter.com/business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis"}}]}},"config":{"isDotcomRendering":true,"stage":"PROD","frontendAssetsFullURL":"https://assets.guim.co.uk/","page":{"avatarApiUrl":"https://avatar.hlcarpenter.com","references":[{"reuters-stock-ric":"LLOY.L"},{"reuters-stock-ric":"SMT.L"},{"reuters-index-ric":".FTSE"},{"reuters-stock-ric":"AMZN.O"},{"reuters-stock-ric":"RR.L"},{"reuters-stock-ric":"BP.L"},{"rich-link":"/info/2017/may/16/guardian-business-today-sign-up-financial-news-email"},{"reuters-stock-ric":"ICAG.L"}],"isProd":true,"shortUrlId":"/p/gvn35","switches":{"prebidAppnexusUkRow":true,"clickToView":true,"prebidTrustx":true,"scAdFreeBanner":false,"abStickyNavTest":true,"compareVariantDecision":false,"enableSentryReporting":true,"lazyLoadContainers":true,"adFreeStrictExpiryEnforcement":false,"liveblogRendering":true,"remarketing":true,"registerWithPhone":false,"targeting":true,"extendedMostPopularFronts":true,"slotBodyEnd":true,"emailInlineInFooter":true,"adomik":true,"facebookTrackingPixel":true,"serviceWorkerEnabled":false,"iasAdTargeting":true,"extendedMostPopular":true,"prebidAnalytics":true,"imrWorldwide":true,"acast":true,"twitterUwt":true,"prebidAppnexusInvcode":true,"prebidAppnexus":true,"enableDiscussionSwitch":true,"prebidXaxis":false,"interactiveFullHeaderSwitch":false,"discussionAllPageSize":true,"prebidUserSync":true,"audioOnwardJourneySwitch":true,"mobileStickyPrebid":true,"breakingNews":true,"externalVideoEmbeds":true,"simpleReach":true,"abSignInGateCopyOpt":true,"carrotTrafficDriver":true,"geoMostPopular":true,"weAreHiring":true,"relatedContent":true,"thirdPartyEmbedTracking":true,"prebidOzone":true,"prebidAdYouLike":true,"mostViewedFronts":true,"abSignInGateMainControl":true,"ampPrebid":true,"googleSearch":true,"brazeSwitch":true,"consentManagement":true,"commercial":true,"redplanetForAus":true,"prebidSonobi":true,"idProfileNavigation":true,"confiantAdVerification":true,"discussionAllowAnonymousRecommendsSwitch":false,"scrollDepth":true,"permutive":true,"comscore":true,"webFonts":true,"prebidImproveDigital":true,"ophan":true,"crosswordSvgThumbnails":true,"prebidTriplelift":true,"weather":true,"commercialOutbrainNewids":true,"dotcomRendering":true,"abSignInGateMainVariant":true,"hostedVideoAutoplay":true,"abAdblockAsk":true,"prebidPubmatic":true,"serverShareCounts":true,"autoRefresh":true,"abCuratedContent3Carousel":true,"enhanceTweets":true,"prebidIndexExchange":true,"prebidOpenx":true,"idCookieRefresh":true,"sharingComments":true,"discussionPageSize":true,"smartAppBanner":false,"boostGaUserTimingFidelity":false,"historyTags":true,"mobileStickyLeaderboard":true,"abDeeplyReadTest":false,"surveys":true,"remoteBanner":true,"inizio":true},"hasYouTubeAtom":false,"inBodyInternalLinkCount":3,"atomTypes":{"guide":false,"audio":false,"explainer":false,"profile":false,"chart":true,"timeline":false,"qanda":false,"commonsdivision":false},"keywordIds":"business/ftse,business/business,business/stock-markets,world/coronavirus-outbreak,business/britishairways,business/rollsroycegroup,business/bp,business/lloyds-banking-group,business/natwest-group,business/scottishmortgageinvestmenttrust,technology/tesla,technology/amazon,business/tencent,business/ocado,business/nasdaq,business/nikkei,business/ubs","blogIds":"","sharedAdTargeting":{"ct":"article","co":["graemewearden"],"url":"/business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","su":["0"],"edition":"us","tn":["news"],"p":"ng","k":["business","rollsroycegroup","amazon","tencent","britishairways","lloyds-banking-group","nasdaq","nikkei","natwest-group","bp","ocado","ubs","ftse","coronavirus-outbreak","stock-markets","scottishmortgageinvestmenttrust","tesla"],"sh":"/p/gvn35"},"beaconUrl":"//phar.gu-web.net","campaigns":[],"calloutsUrl":"https://callouts.code.dev-guardianapis.com/formstack-campaign/submit","requiresMembershipAccess":false,"hasMultipleVideosInPage":false,"onwardWebSocket":"ws://api.nextgen.guardianapps.co.uk/recently-published","a9PublisherId":"3722","pbIndexSites":[{"bp":"D","id":208278},{"bp":"M","id":213548},{"bp":"T","id":215483}],"toneIds":"tone/news","dcrSentryDsn":"https://1937ab71c8804b2b8438178dfdd6468f@sentry.io/1377847","idWebAppUrl":"https://oauth.hlcarpenter.com","discussionApiUrl":"https://discussion.hlcarpenter.com/discussion-api","sentryPublicApiKey":"344003a8d11c41d8800fbad8383fdc50","omnitureAccount":"guardiangu-network","contributorBio":"","pageCode":"8519909","pillar":"News","commercialBundleUrl":"https://assets.guim.co.uk/javascripts/6d699370121c734690ce/graun.commercial.dcr.js","discussionApiClientHeader":"nextgen","membershipUrl":"https://membership.hlcarpenter.com","cardStyle":"news","shouldHideReaderRevenue":false,"sentryHost":"app.getsentry.com/35463","shouldHideAdverts":false,"membershipAccess":"","isPreview":false,"googletagJsUrl":"//securepubads.g.doubleclick.net/tag/js/gpt.js","supportUrl":"https://support.hlcarpenter.com","hasShowcaseMainElement":false,"isColumn":false,"isPaidContent":false,"sectionName":"Business","mobileAppsAdUnitRoot":"beta-guardian-app","dfpAdUnitRoot":"hlcarpenter.com","headline":"FTSE 100 suffers worst year since 2008 financial crisis","commentable":false,"idApiUrl":"https://idapi.hlcarpenter.com","showRelatedContent":true,"commissioningDesks":"uk-business","inBodyExternalLinkCount":0,"adUnit":"/59666047/hlcarpenter.com/business/article/ng","stripePublicToken":"pk_live_2O6zPMHXNs2AGea4bAmq5R7Z","videoDuration":0,"stage":"PROD","idOAuthUrl":"https://oauth.hlcarpenter.com","isSensitive":false,"isDev":false,"thirdPartyAppsAccount":"guardiangu-thirdpartyapps","richLink":"/info/2017/may/16/guardian-business-today-sign-up-financial-news-email","avatarImagesUrl":"https://avatar.guim.co.uk","trackingNames":"UK Business","fbAppId":"180444840287","externalEmbedHost":"https://embed.hlcarpenter.com","ajaxUrl":"https://api.nextgen.guardianapps.co.uk","keywords":"FTSE,Business,Stock markets,Coronavirus,British Airways,Rolls-Royce,BP,Lloyds Banking Group,NatWest Group,Scottish Mortgage Investment Trust,Tesla,Amazon,Tencent,Ocado,Nasdaq,Nikkei,UBS","revisionNumber":"DEV","blogs":"","section":"business","hasInlineMerchandise":false,"locationapiurl":"/weatherapi/locations?query=","buildNumber":"37557","isPhotoEssay":false,"ampIframeUrl":"https://assets.guim.co.uk/data/vendor/b242a49b1588bb36bdaacefe001ca77a/amp-iframe.html","userAttributesApiUrl":"https://members-data-api.hlcarpenter.com/user-attributes","isLive":false,"publication":"The Hlcarpenter.com","host":"","brazeApiKey":"7f28c639-8bda-48ff-a3f6-24345abfc07c","contentType":"Article","facebookIaAdUnitRoot":"facebook-instant-articles","ophanEmbedJsUrl":"//j.ophan.co.uk/ophan.embed","idUrl":"https://profile.hlcarpenter.com","thumbnail":"https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/500.jpg?quality=85&auto=format&fit=max&s=d26a404152fc8fceb6272edbb3e0b5fb","isFront":false,"wordCount":1033,"author":"Graeme Wearden","dfpAccountId":"59666047","nonKeywordTagIds":"type/article,tone/news,profile/graemewearden,publication/Hlcarpenter.com,Hlcarpenter.com/mainsection,Hlcarpenter.com/mainsection/financial3,tracking/commissioningdesk/uk-business","pageId":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","forecastsapiurl":"/weatherapi/forecast","assetsPath":"https://assets.guim.co.uk/","lightboxImages":{"id":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","headline":"FTSE 100 suffers worst year since 2008 financial crisis","shouldHideAdverts":false,"standfirst":"

UK index fell by 14.3% during 2020, the poorest performance among largest international stock index

","images":[{"caption":"IAG, British Airways’ parent company, slumped by 61% in 2020.","credit":"Photograph: Hannah McKay/Reuters","displayCredit":true,"src":"https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=700&quality=85&auto=format&fit=max&s=4ba88e7e63294c54b50711333e5dde29","srcsets":"https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1920&quality=85&auto=format&fit=max&s=9b533a50af9ec22ba64a9b1b60ba337d 1920w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1225&quality=85&auto=format&fit=max&s=9ec50d4baf719795cf2f666f7fce55ca 1225w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=1065&quality=85&auto=format&fit=max&s=9a00aee94b3d40d32c21466255802695 1065w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=965&quality=85&auto=format&fit=max&s=f0779ef7534144b6e7540f620a59b146 965w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=725&quality=85&auto=format&fit=max&s=a7feb9523fc8954ac071b1ad2fe56fdf 725w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=645&quality=85&auto=format&fit=max&s=bd1eaea34eb4460fb7dcf099b3d686cb 645w, https://i.guim.co.uk/img/media/c32e8398f099d80a0dd82be4332cdbabde3c50a5/0_232_3500_2101/master/3500.jpg?width=465&quality=85&auto=format&fit=max&s=a491373aafe236f4960e771e9964d94a 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.6658733936220846,"role":"None","parentContentId":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","id":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis"}]},"isImmersive":false,"dfpHost":"pubads.g.doubleclick.net","googletagUrl":"//securepubads.g.doubleclick.net/tag/js/gpt.js","mmaUrl":"https://manage.hlcarpenter.com","hbImpl":{"prebid":true,"a9":true},"abTests":{},"shortUrl":"/p/gvn35","isContent":true,"contentId":"business/2020/dec/31/ftse-100-suffers-worst-year-since-2008-financial-crisis","edition":"US","discussionFrontendUrl":"https://assets.guim.co.uk/discussion/discussion-frontend.preact.iife.8bdbd9194e.js","ipsosTag":"business","ophanJsUrl":"//j.ophan.co.uk/ophan.ng","atoms":["8fa3f5b0-71a9-452c-b7c4-320b30eafafc","48034160-b07a-4965-9dc0-ebfb0d4d8061","b7da7d90-da99-4b0b-ac51-4938affb825d","b06c0cd8-1161-43f3-a99f-ead0668739c2","477a99d3-8a8e-40ed-add0-eae7c746a385"],"productionOffice":"Uk","dfpNonRefreshableLineItemIds":[68842407,70516407,70931847,71342607,72502287,72503607,73773207,73829127,74480367,74823567,74824167,75586767,75588207,76352007,76437927,76443087,76443567,76603287,77324247,77504847,77546367,77561007,77590287,77622207,77747367,78316047,78455967,78470967,78507807,78713607,79009167,79094487,80502447,80568087,80568207,80568327,80568447,80569047,81002967,82211367,82339767,82879287,82881807,83178927,85253487,85558287,85961247,86814567,87004887,87191607,87726207,87852807,87878367,88153527,88333647,88420407,88526727,88621527,88861167,89035647,89035887,89036607,89084607,89084967,89141967,89356167,89743047,89793087,90159687,90323007,90359967,90935367,91095807,91118247,91732647,91985967,92216007,92355087,92436807,92506887,92681487,92948847,93121767,93550767,93717567,93784887,93785607,93930207,94193007,94674927,94822527,95840847,95931207,96296367,97980687,98151207,98165247,98610447,98671647,98893047,101192247,101476527,101684007,101999127,102061647,102066567,102344847,102790767,102792207,102892767,102894687,102895167,102895647,103062327,104218407,106736607,107115927,107235087,107509047,107955087,108799287,108893967,109638687,109648167,109761807,109831287,111055527,111057567,112799127,112882647,112888527,112950567,113374647,113880927,114906327,115133247,116149647,117980727,118236687,118631847,118934247,119632887,119737767,121592967,122583687,123487167,123873927,123978567,123996567,123996927,123997527,124001247,125878047,126003687,126004167,130630407,130630647,130686687,130686807,130693287,130777407,130840767,131115447,131135007,131652687,132065367,132325287,132348327,132758367,133502127,133852047,133854327,133989327,134130087,134567967,134876607,134979567,135278007,135292767,135353727,135773007,135776847,135826887,135841887,135850407,136120767,136236207,136278807,136455207,136550247,137025927,137200287,137382567,140711127,141827967,142466367,142883847,143109567,144237927,146321007,146324607,146326287,146339727,146355567,147500367,147801807,148446687,148454487,152119407,153546927,154108047,154108167,154112007,154112367,154113087,154113207,154114887,154125567,154126407,154290807,154290927,154291287,154291407,154291527,154291887,154295007,154295967,154297527,154303287,154303527,154332087,154386087,154387407,154391247,154391967,154392927,154394847,154540527,154544247,154693287,154793967,154794087,155010327,155010447,160437567,163112127,163372647,165575127,4345086236,4345095356,4345169885,4345177565,4345182855,4345186250,4349172433,4360612711,4360793649,4371265570,4371369115,4393832120,4400994377,4428613611,4443205897,4451525654,4480779579,4498662865,4512645730,4516493673,4516698376,4517304218,4517378559,4517379732,4517380203,4539078702,4548855586,4549107258,4552894255,4555165414,4555183615,4555236856,4555635725,4555650690,4555674903,4555684517,4555688577,4556153989,4556285026,4556324359,4556326294,4556648082,4556678787,4557241378,4557634755,4557708173,4557762374,4557783054,4557975570,4558001894,4558957661,4559094602,4559618101,4560130208,4579011086,4579746196,4584262791,4586005424,4586012639,4598413679,4608554346,4612781170,4613725167,4652061785,4659761500,4666709965,4671027724,4671116147,4680579583,4680686606,4684616813,4688643082,4689828177,4698081076,4698085906,4698483837,4698485673,4698836785,4700389583,4702727917,4705009339,4706776058,4715712191,4719669541,4739368280,4741268540,4741269263,4752748306,4770577846,4794336160,4795460127,4813434715,4814193728,4816151238,4818099525,4843101319,4843259745,4843534303,4843660002,4851611473,4900192015,4907479084,4950965688,4953561994,4956216414,4956359904,4957449531,4957639563,4961380948,4963865755,4972816526,4974150367,4974378154,4974421332,4974425718,4974440616,4974909599,4974917942,4979472123,4979611347,4986877832,4986883844,4988662283,4995359684,4995363299,4995664790,5000134545,5000531182,5000790614,5004234716,5008428214,5008745198,5014861653,5015013326,5017538127,5017618519,5017627117,5017870049,5017880045,5017883228,5017885847,5018142683,5022785722,5025139359,5030227901,5031882476,5033068546,5033399504,5043072122,5048369906,5048446713,5048474394,5048578765,5048623579,5048855939,5048896271,5050809297,5051271119,5051862705,5052565344,5058276148,5058861737,5060861401,5080503991,5084422705,5084769575,5086430628,5088761690,5089439429,5094408955,5095477169,5095911984,5100382690,5106137416,5106578097,5108771973,5108801259,5108834289,5109414149,5109477985,5112760220,5114958382,5115460784,5119369095,5119589887,5119608376,5119622833,5120038706,5122977293,5124775878,5133611676,5133616221,5135185825,5135800503,5135919817,5136222120,5138121327,5138315476,5138858096,5139829373,5140474550,5146213631,5154348200,5154699509,5168480847,5168728930,5168743192,5168757037,5168769787,5168772901,5168778655,5168970951,5169221645,5169233267,5169331108,5169776357,5170070115,5174441005,5176804734,5179364348,5182269069,5188336066,5189431118,5189548223,5189828618,5191810924,5192098697,5193340753,5194618937,5198567242,5199544925,5199894385,5202346462,5202735047,5203815492,5214574966,5221774258,5225354826,5235889561,5237536072,5240124892,5240125189,5246856420,5247376316,5255393980,5266175458,5266175890,5266307404,5266581080,5277318463,5277410634,5278753376,5281116862,5281772778,5287997419,5288243957,5292326384,5294756358,5295990867,5296142792,5298193115,5301069538,5307038116,5308699342,5308761803,5310716113,5311015892,5311315855,5313231081,5314388147,5317639803,5317639806,5317639815,5317639824,5317639827,5317642026,5317642029,5317642032,5317642035,5317642038,5317642041,5317642044,5317642047,5317642050,5317642215,5317642218,5317642221,5317642224,5317642227,5317642230,5317642233,5317642236,5317642239,5317642287,5317642293,5317642296,5317642299,5317642302,5317642305,5317642308,5317642311,5317642314,5317642500,5317642506,5317642509,5317643991,5317643994,5317643997,5317646859,5317646862,5317646865,5317646868,5317646871,5317646874,5317647027,5317647030,5317647033,5317647036,5317647039,5317647042,5317647078,5317647081,5317647084,5317647087,5317647090,5317647093,5317647117,5317647240,5317647243,5317648032,5317648035,5317648038,5317648065,5317648068,5317648074,5317648077,5317648212,5317648215,5317648218,5317648230,5317649196,5317649199,5317649202,5317650693,5317650696,5317650699,5317650702,5317650705,5317650708,5317650711,5317650714,5317650717,5317650888,5317650891,5317650894,5317650897,5317650900,5317650903,5317650906,5317650909,5317650945,5317650948,5317650951,5317650954,5317650957,5317651080,5317651083,5317651086,5317651089,5317651110,5317651113,5317651116,5317651119,5317828458,5317828461,5317828464,5317841238,5317841241,5317841244,5317841247,5317841277,5317841400,5317841403,5317841406,5317841409,5317841412,5317841436,5317841439,5317841442,5317841445,5317841448,5317841721,5317841727,5317841730,5317841733,5317841736,5317841739,5317841742,5317841745,5317841748,5317841901,5317841904,5317841907,5317841910,5317841913,5317841916,5317841919,5317841922,5317841925,5317841958,5317841961,5317841964,5317841967,5317841970,5317841973,5317841976,5317841997,5317842120,5317842690,5317842693,5317842696,5317842699,5317842702,5317842705,5317842708,5317842849,5317842852,5317842855,5317842858,5317842861,5317842864,5317842867,5317842909,5317842912,5317842915,5317842918,5317843080,5317843083,5317843086,5317843089,5317843092,5317843110,5317843113,5317843116,5317843119,5317843137,5317843140,5317843143,5317843146,5317843149,5317843155,5317844526,5317844529,5317844544,5317844547,5317844556,5317844559,5317845060,5317845063,5317845066,5317845069,5317845072,5317845075,5317845078,5317845081,5317845084,5317845087,5317845090,5317845093,5317845096,5317845270,5317845273,5317845276,5317845279,5317845282,5317845285,5317845288,5317845291,5317845294,5317845297,5317845300,5317845303,5317845306,5317845324,5317845327,5317845330,5317875310,5317962891,5318531695,5318531698,5318531701,5318531704,5318531707,5318531710,5318531713,5318531716,5318531719,5318531722,5318531896,5318531899,5318531902,5318531905,5318531908,5318531911,5318531914,5318531917,5318531956,5318531959,5318531962,5318531965,5318531968,5318531971,5318531974,5318531977,5318531980,5318532124,5318532127,5318532130,5318532883,5318532886,5318532898,5318532901,5318532913,5318532916,5318535796,5318535799,5318535802,5318535805,5318535808,5318535811,5318535814,5318535817,5318535982,5318535985,5318535988,5318535991,5318535994,5318535997,5318536000,5318536003,5318536057,5318536060,5318536063,5318536078,5318537953,5318537956,5318537959,5318537962,5318537965,5318537968,5318538121,5318538124,5318538127,5318538130,5318538133,5318538136,5318538172,5318538175,5318538178,5318538181,5318538184,5318538208,5318538610,5318538613,5318538616,5318538622,5318538625,5318538628,5318538631,5318538634,5318538670,5318538673,5318538676,5318538679,5318538682,5318538685,5318538688,5318538691,5318538694,5318538841,5318538844,5318538847,5318540599,5318540602,5318540605,5318540608,5318540611,5318540614,5318540617,5318540620,5318540776,5318540779,5318540782,5318540785,5318540788,5318540791,5318540794,5318540797,5318540839,5318540842,5318540845,5318540848,5318540851,5318540854,5318540857,5318540860,5318541097,5318541100,5318541103,5318541106,5318541109,5318541112,5318541115,5318541118,5318541241,5318541280,5318541283,5318541289,5318541292,5318541295,5318541298,5318541301,5318541304,5318541349,5318541352,5318541355,5318541358,5318541481,5318541484,5318541487,5318541490,5318541493,5318541517,5318541520,5318541523,5318541778,5318541781,5318541784,5318541799,5318541802,5318541805,5318541808,5318541823,5318541826,5318541835,5318543272,5318543275,5318731807,5318731810,5318739007,5318739010,5318739013,5318739016,5318739019,5318739022,5318739055,5318739058,5318739061,5318739064,5318739067,5318739070,5318739094,5318739097,5318739100,5318739103,5318739106,5318739109,5318739112,5318739250,5318741269,5318741272,5318741275,5318741278,5318741401,5318741425,5318741428,5318741431,5318741434,5318741437,5318741473,5318741476,5318741479,5318741482,5318741485,5318741488,5318741491,5318741494,5318741503,5318742385,5318742388,5318742391,5318742394,5318742397,5318742400,5318742403,5318742406,5318742451,5318742454,5318742457,5318742460,5318742463,5318742466,5318743129,5318743132,5318743135,5318743138,5318743141,5318743162,5318743165,5318743168,5318743192,5318743195,5318743198,5318743321,5318743324,5318743327,5318743339,5318743426,5318743429,5318743432,5318743435,5318743438,5318743561,5318743564,5318743567,5318743603,5318743606,5318743609,5318743612,5318743615,5318743618,5318743621,5318743624,5318743627,5318743630,5318743648,5318743651,5318744077,5318744080,5318744083,5318744086,5318744116,5318744119,5318744122,5318744125,5318744128,5318744155,5318744158,5318744281,5318744284,5318744287,5318744293,5318864639,5318864762,5318864765,5318864768,5318864771,5318864774,5318864777,5318864780,5318864816,5318864819,5318864822,5318864825,5318864828,5318864831,5318864834,5318864837,5318864840,5318864843,5318864846,5318865008,5318865011,5318865014,5318865017,5318865020,5318865023,5318865026,5318865029,5318865032,5318865050,5318865053,5318865056,5318865059,5318866262,5318866265,5318866268,5318866271,5318866274,5318866277,5318866280,5318866283,5318866286,5318866451,5318866454,5318866457,5318866460,5318866463,5318866466,5318866469,5318866472,5318866475,5318866529,5318866532,5318867009,5318867012,5318867018,5318867039,5318867162,5318867165,5318867186,5318867189,5318867192,5318867195,5318867198,5318867201,5318867204,5318867207,5318867210,5318867213,5318867270,5318867279,5318867405,5318867411,5318868881,5318868884,5318868887,5318868890,5318868896,5318868899,5318868902,5318868905,5318868908,5318869082,5318869085,5318869088,5318869091,5318869094,5318869097,5318869100,5318869103,5318869106,5318869163,5318869166,5318869169,5318869172,5318869175,5318869178,5318869181,5318869184,5318869325,5318869328,5318869331,5318869334,5318869337,5318869340,5318869370,5318869373,5318869376,5318871548,5318871551,5318871554,5318871557,5318871560,5318871563,5318871566,5318871569,5318873177,5318873180,5318873183,5318873186,5318873189,5318873192,5318873195,5318873198,5318873234,5318873237,5318873240,5318873243,5318873246,5318873249,5318873252,5318873255,5318873420,5318873423,5318873426,5318873429,5318873432,5318873435,5318873441,5318873444,5318873447,5318926492,5319064274,5319064277,5319068810,5319068813,5319068816,5319068819,5319068822,5319068825,5319068828,5319068855,5319068858,5319068861,5319068864,5319068867,5319068870,5319069017,5319069020,5319069023,5319069026,5319069029,5319069047,5319069050,5319069248,5319069251,5319069254,5319069257,5319069260,5319069263,5319069266,5319069299,5319069302,5319069305,5319069308,5319069311,5319069314,5319069317,5319069320,5319069356,5319069359,5319069482,5319069485,5319069488,5319069491,5319069494,5319069497,5319069521,5319071465,5319071468,5319071483,5319072671,5319072674,5319072677,5319072710,5319072713,5319072716,5319072719,5319072842,5319072845,5319072848,5319072866,5319073331,5319073334,5319073337,5319073340,5319073346,5319073349,5319074633,5319074636,5319074639,5319074762,5319074765,5319074768,5319074771,5319074774,5319074777,5319074780,5319074783,5319074846,5319074849,5319074852,5319074855,5319074876,5319074879,5319075014,5319075017,5319075020,5319075023,5319075029,5319076067,5319076070,5319076073,5319076076,5319076079,5319076202,5319076205,5319076208,5319076211,5319076214,5319076217,5319076220,5319076223,5319076226,5324801169,5329152860,5330307720,5330401363,5330589013,5338315860,5339353594,5340782318,5341957914,5342605889,5344079902,5344710145,5345043263,5345055992,5345151767,5352937640,5353508550,5354239380,5356142370,5357019739,5357314970,5357322221,5357425331,5357751081,5358515412,5358530526,5358739382,5359317792,5359326660,5359665347,5360464781,5363926759,5368112341,5368613457,5370206536,5370867504,5372009946,5372952707,5381567907,5381932514,5387477683,5389110394,5389507817,5394024873,5395089503,5395094296,5395167785,5398639115,5402290248,5414399009,5418142465,5423511818,5423958631,5424105011,5424316299,5426052636,5428101561,5428238577,5437125968,5441046622,5441386781,5443815241,5445787189,5452334545,5452537381,5454590081,5457737962,5457900371,5459157095,5461672778,5465040945,5466211677,5466214734,5466531271,5466996373,5466996946,5469112465,5469250311,5471332305,5472367436,5473663887,5478754708,5479129658,5479433266,5483205317,5483607329,5492374239,5498289762,5501407883,5501408349,5507589986,5509683030,5514880750,5516342298,5516696296,5519048334,5520152069,5522655965,5523426655,5527580296,5528615963,5532729331,5534958866,5536818852,5537333007,5538360938,5539423093,5543293170,5544242098,5545361453,5545606755,5545773485,5545851295,5548613451,5548613664,5549679783,5552092245,5553648922,5554381329,5558515143,5558518443,5558523552,5558527566,5558529060,5558531448,5558533656,5558537001,5558758006,5559666853,5559668044,5559671971,5559672454,5559673918,5559683413,5559691654,5559692581,5559692584,5559791415,5559795497,5559795962,5559796472,5559799676,5559802297,5559905222,5563851720,5564201933,5565381780,5565381786,5565944093,5566690440,5566888543,5570251365,5570403307,5571550025,5580798708,5581991484,5582134793,5584069572,5585724471,5588312812,5588625820,5589491990,5592102428,5592408199,5592408430,5595197911,5595238291,5595241649,5596753106,5597229243,5598121671,5598604034,5598718487,5598921509,5599404146,5599430842,5600807700,5600944001,5601302339,5601407261,5604827229,5604828453,5605259263,5605675396,5608553753,5609341878,5609922209,5610406314,5612812556,5613900227,5616295359,5617153347,5617357126,5617560946,5618303037,5619527905,5620047587,5620070327,5620776237,5620891323,5620891383,5621508639,5621922383,5622264429,5622478028,5622532278,5622837268,5624650559,5624869673,5624983821,5625107183,5625223661,5625227978,5625398582,5625487113,5625836589,5625971457,5626103406,5626445497,5627115043,5627400383,5627416481,5627419082,5627510314,5627740002,5627768068,5628371464,5628688753,5629557118,5629670544,5629713588,5630010461,5630202171,5630498106,5630926258,5631069021,5631098598,5631098862,5631099042,5631522170,5631715415,5631748556,5631899222,5631955125,5632010289,5632010304,5632464370,5632497345,5632645568,5632654007,5632702032,5633307960,5633479388,5633559344,5633620717,5633782264,5633848686,5634184944,5634480439,5634571147,5634602605,5634623455,5634695740,5634696664,5634854126,5635126238,5635158211,5635356428,5636213651,5636227163],"tones":"News","plistaPublicApiKey":"462925f4f131001fd974bebe","isLiveBlog":false,"frontendAssetsFullURL":"https://assets.guim.co.uk/","googleSearchId":"007466294097402385199:m2ealvuxh1i","allowUserGeneratedContent":false,"byline":"Graeme Wearden","authorIds":"profile/graemewearden","webPublicationDate":1609433922000,"omnitureAmpAccount":"guardiangu-thirdpartyapps","isHosted":false,"hasPageSkin":false,"webTitle":"FTSE 100 suffers worst year since 2008 financial crisis","discussionD2Uid":"zHoBy6HNKsk","weatherapiurl":"/weatherapi/city","googleSearchUrl":"//www.google.co.uk/cse/cse.js","optimizeEpicUrl":"https://support.hlcarpenter.com/epic/control/index.html","isSplash":false,"isNumberedList":false,"dcrCouldRender":true},"libs":{"googletag":"//securepubads.g.doubleclick.net/tag/js/gpt.js"},"switches":{"prebidAppnexusUkRow":true,"clickToView":true,"prebidTrustx":true,"scAdFreeBanner":false,"abStickyNavTest":true,"compareVariantDecision":false,"enableSentryReporting":true,"lazyLoadContainers":true,"adFreeStrictExpiryEnforcement":false,"liveblogRendering":true,"remarketing":true,"registerWithPhone":false,"targeting":true,"extendedMostPopularFronts":true,"slotBodyEnd":true,"emailInlineInFooter":true,"adomik":true,"facebookTrackingPixel":true,"serviceWorkerEnabled":false,"iasAdTargeting":true,"extendedMostPopular":true,"prebidAnalytics":true,"imrWorldwide":true,"acast":true,"twitterUwt":true,"prebidAppnexusInvcode":true,"prebidAppnexus":true,"enableDiscussionSwitch":true,"prebidXaxis":false,"interactiveFullHeaderSwitch":false,"discussionAllPageSize":true,"prebidUserSync":true,"audioOnwardJourneySwitch":true,"mobileStickyPrebid":true,"breakingNews":true,"externalVideoEmbeds":true,"simpleReach":true,"abSignInGateCopyOpt":true,"carrotTrafficDriver":true,"geoMostPopular":true,"weAreHiring":true,"relatedContent":true,"thirdPartyEmbedTracking":true,"prebidOzone":true,"prebidAdYouLike":true,"mostViewedFronts":true,"abSignInGateMainControl":true,"ampPrebid":true,"googleSearch":true,"brazeSwitch":true,"consentManagement":true,"commercial":true,"redplanetForAus":true,"prebidSonobi":true,"idProfileNavigation":true,"confiantAdVerification":true,"discussionAllowAnonymousRecommendsSwitch":false,"scrollDepth":true,"permutive":true,"comscore":true,"webFonts":true,"prebidImproveDigital":true,"ophan":true,"crosswordSvgThumbnails":true,"prebidTriplelift":true,"weather":true,"commercialOutbrainNewids":true,"dotcomRendering":true,"abSignInGateMainVariant":true,"hostedVideoAutoplay":true,"abAdblockAsk":true,"prebidPubmatic":true,"serverShareCounts":true,"autoRefresh":true,"abCuratedContent3Carousel":true,"enhanceTweets":true,"prebidIndexExchange":true,"prebidOpenx":true,"idCookieRefresh":true,"sharingComments":true,"discussionPageSize":true,"smartAppBanner":false,"boostGaUserTimingFidelity":false,"historyTags":true,"mobileStickyLeaderboard":true,"abDeeplyReadTest":false,"surveys":true,"remoteBanner":true,"inizio":true},"tests":{},"ophan":{"pageViewId":"","browserId":""}},"polyfilled":false,"adBlockers":{"onDetect":[]},"modules":{"sentry":{}}};window.guardian.queue=[];

FTSE 100 suffers worst year since 2008 financial crisis

This article is more than 2 months old

UK index fell by 14.3% during 2020, the poorest performance among largest international stock index

BA planes
IAG, British Airways’ parent company, slumped by 61% in 2020. Photograph: Hannah McKay/Reuters
IAG, British Airways’ parent company, slumped by 61% in 2020. Photograph: Hannah McKay/Reuters

Last modified on Thu 31 Dec 2020 23.36 EST

Britain’s blue-chip share index has suffered its worst year since the 2008 financial crisis, as the Covid-19 pandemic and Brexit uncertainty hit stocks during a turbulent 12 months for investors.

The FTSE 100 index of top shares listed in London fell by 14.3% during 2020, the poorest performance among the largest international stock indices, and its biggest decline since 2008.

The pound, though, rallied to its highest level against the US dollar in more than two and a half years, amid relief that the UK-EU free trade deal had been agreed.

Having started the year at 7,542 points, the Footsie closed on New Year’s Eve at 6,460 points. Fresh worries over the latest UK’s Covid-19 restrictions helped to drag the market down by almost 1.5% on the final trading session of the year.

The FTSE 100 has suffered from a relative paucity of technology stocks. They surged during 2020 as the pandemic forced office workers to work from home, driving a boom in video-conferencing and online shopping.

The parent company of British Airways, IAG, slumped by 61% during the year, with jet engine manufacturer Rolls-Royce down 52%. Oil companies also had a torrid year, with BP and Royal Dutch Shell dropping by over 40% during 2020.

Banks were also badly hit by the pandemic, as well as fears that the UK and EU might fail to reach a free trade deal. Lloyds Banking Group fell 41% over the last 12 months, with NatWest down 30%.

“The sectors hit the hardest by the pandemic: travel, leisure, general retail, energy and banks, all of which make up a significant proportion of the FTSE 100, encapsulates quite neatly why the FTSE 100 has been hit as hard as it has, and that’s before we even consider that the Brexit transition period comes to an end at the end of this year,” said Michael Hewson of CMC Markets, a spreadbetting firm whose customers bet on market movements.

Scottish Mortgage Investment Trust, which invests in technology companies including Tesla, Amazon and Tencent, was the best-performing FTSE 100 stock as it more than doubled in value during 2020. Ocado, the online grocery business, has gained 78% since last January.

While the FTSE 100 struggled, the US stock market had hit a series of record highs in recent weeks. The S&P 500 closed 16.26% up for the year at a new peak, with the technology-focused Nasdaq surging by 43%.

Germany’s DAX index ended the year up 3.6% and France’s CAC fell by around 7%. Japan’s Nikkei gained 16%, while China’s CSI 300 surged 27% during 2020.

Spain’s IBEX 35 had an even worse year than the FTSE 100, though, dropping 15.5%.

The FTSE 100’s weakness was partly due to the strength of the pound, which erodes the value of multinationals’ overseas earnings. Sterling hit $1.3686, its highest level since 1 May 2018, as the US dollar weakened on the foreign exchange markets.

Many analysts have forecast the FTSE 100 will rebound as the rollout of Covid-19 vaccines spurs an economic recovery. Investment bank UBS has a price target of 7,200 points for the end of 2021.

David Miller, investment director at wealth management firm Quilter Cheviot, said the recovery would take time. “People aren’t suddenly going to regain confidence, get on a plane or go to a packed football stadium. It will take until the second half of 2021, maybe the latter half, before normality returns,” he said.

The FTSE 250 index of medium-sized companies, more focused on the UK economy, fell by 6.4% during 2020, and hit a 10-month high earlier this week.

Despite ending the year lower, the FTSE 100 has rallied since its low point in March, when it briefly fell through 5,000 points.

“Although timing the market is never easy, and can be risky, buying opportunities like that in March come along rarely and successful investors need to grit their teeth and have the courage of their convictions at moments like these,” said Tom Stevenson, investment director for personal investing at Fidelity International. “Even the underperforming UK market has risen by more than 25% since the low point.”

Joshua Mahony, senior market analyst at IG, said investors ended 2020 fretting about the extended period of Covid-19 restrictions, and the “clear uncertainty” of exactly how hard the UK economy would suffer from Brexit.

“With the UK exiting the EU stifled by a blanket of tier 3 and 4 restrictions, stocks are understandably risk averse as we head into the new year,” said Mahony. “However, while short-term uncertainty will bring volatility, the promise of a spring renewal is likely to bring plenty of upside in 2021,” he added.

Key Charts of 2020

Crude oil prices plunged this spring as the Covid-19 pandemic forced economies to lock down. Having started 2020 at $66 (£48) per barrel, Brent crude tumbled below $20 in April before recovering to $51 per barrel this month.

Sterling was badly hit during the early months of the pandemic, as investors sought the safety of the US dollar. But it has strengthened as Brexit uncertainty lifted, hitting a 32-month high this week.

Gold had its best year in a decade, as investors sought a haven asset. Bullion broke through $2,000 per ounce in August amid predictions that central bank stimulus would drive up inflation.