add fed fund rate plot

This commit is contained in:
MuslemRahimi 2024-11-04 21:14:12 +01:00
parent 8ead3b2473
commit 6debdaf00a
4 changed files with 176 additions and 89 deletions

View File

@ -542,6 +542,17 @@ const handleTwitchMessage = (event) => {
>Economic Calendar</a >Economic Calendar</a
> >
</Button> </Button>
<Button
builders={[builder]}
type="submit"
class="w-full bg-[#141417] hover:bg-[#141417]"
>
<a
href="/economic-indicator"
class="text-start w-full text-[1rem] text-white ml-4 mt-4"
>Economic Indicator</a
>
</Button>
<!-- <!--
<Button <Button
@ -1054,6 +1065,11 @@ const handleTwitchMessage = (event) => {
class="text-[1rem] text-white ml-4 mt-4" class="text-[1rem] text-white ml-4 mt-4"
>Economic Calendar</a >Economic Calendar</a
> >
<a
href="/economic-indicator"
class="text-[1rem] text-white ml-4 mt-4"
>Economic Indicator</a
>
<!-- <!--
<a <a
href="/stock-splits-calendar" href="/stock-splits-calendar"

View File

@ -12,8 +12,6 @@ export const load = async ({ locals, setHeaders }) => {
const output = await response.json(); const output = await response.json();
setHeaders({ "cache-control": "public, max-age=3000" });
return output; return output;
}; };

View File

@ -13,7 +13,6 @@
use([LineChart, BarChart, GridComponent, TooltipComponent, CanvasRenderer]); use([LineChart, BarChart, GridComponent, TooltipComponent, CanvasRenderer]);
export let data; export let data;
let cloudFrontUrl = import.meta.env.VITE_IMAGE_URL;
let isLoaded = false; let isLoaded = false;
let rawData; let rawData;
@ -22,6 +21,7 @@
let optionsCPI; let optionsCPI;
let optionsGDP; let optionsGDP;
let optionsInflation; let optionsInflation;
let optionsFedFundRate;
let filterRule = "annual"; let filterRule = "annual";
@ -504,13 +504,92 @@
return options; return options;
} }
async function plotFedFundRate() {
// Get the filtered data based on the selected time period
let dates = [];
let valueList = [];
// Iterate over the data and extract required information
data?.getEconomicIndicator?.fedFundRate?.forEach((item) => {
dates?.push(item?.date);
valueList?.push(item?.value);
});
const options = {
animation: false,
grid: {
left: "2%",
right: "2%",
bottom: "2%",
top: "10%",
containLabel: true,
},
xAxis: {
axisLabel: {
color: "#fff",
formatter: function (value) {
// Assuming dates are in the format 'yyyy-mm-dd'
// Extract the month and day from the date string and convert the month to its abbreviated name
const dateParts = value.split("-");
const year = dateParts[0].substring(2); // Extracting the last two digits of the year
const monthIndex = parseInt(dateParts[1]) - 1; // Months are zero-indexed in JavaScript Date objects
return `${monthNames[monthIndex]} '${year}`;
},
},
data: dates,
type: "category",
},
yAxis: [
{
type: "value",
splitLine: {
show: false, // Disable x-axis grid lines
},
axisLabel: {
color: "#fff", // Change label color to white
},
},
{
type: "value",
splitLine: {
show: false, // Disable x-axis grid lines
},
},
],
series: {
name: "Fed Fund Rate",
data: valueList,
type: "line",
areaStyle: { opacity: 0.2 },
smooth: true,
showSymbol: false,
},
tooltip: {
trigger: "axis",
hideDelay: 100,
},
};
return options;
}
onMount(async () => { onMount(async () => {
rawData = data?.getEconomicIndicator?.treasury ?? {}; rawData = data?.getEconomicIndicator?.treasury ?? {};
// Run the async functions concurrently // Run the async functions concurrently
[optionsData, optionsCPI, optionsGDP, optionsInflation] = await Promise.all( [
[plotData(), plotCPI(), plotGDP(), plotInflation()], optionsData,
); optionsCPI,
optionsGDP,
optionsInflation,
optionsFedFundRate,
] = await Promise.all([
plotData(),
plotCPI(),
plotGDP(),
plotInflation(),
plotFedFundRate(),
]);
tableList = filterEndOfYearDates(rawData); tableList = filterEndOfYearDates(rawData);
tableList?.sort((a, b) => new Date(b?.date) - new Date(a?.date)); tableList?.sort((a, b) => new Date(b?.date) - new Date(a?.date));
@ -551,9 +630,9 @@
</svelte:head> </svelte:head>
<section <section
class="w-full max-w-3xl sm:max-w-screen-2xl overflow-hidden min-h-screen pt-5 pb-40 lg:px-3" class="w-full max-w-screen-2xl overflow-hidden min-h-screen pb-20 pt-5 px-4 lg:px-3"
> >
<div class="text-sm sm:text-[1rem] breadcrumbs ml-4"> <div class="text-sm sm:text-[1rem] breadcrumbs">
<ul> <ul>
<li><a href="/" class="text-gray-300">Home</a></li> <li><a href="/" class="text-gray-300">Home</a></li>
<li class="text-gray-300">US Economic Indicator</li> <li class="text-gray-300">US Economic Indicator</li>
@ -566,71 +645,54 @@
class="relative flex justify-center items-start overflow-hidden w-full" class="relative flex justify-center items-start overflow-hidden w-full"
> >
<main class="w-full lg:w-3/4 lg:pr-5"> <main class="w-full lg:w-3/4 lg:pr-5">
<div <div class="mb-6 border-b-[2px]">
class="w-full m-auto sm:bg-[#27272A] sm:rounded-xl h-auto pl-10 pr-10 pt-5 sm:pb-10 sm:pt-10 mt-3 mb-8" <h1 class="mb-1 text-white text-2xl sm:text-3xl font-bold">
> Economic Indicators
<div class="grid grid-cols-1 sm:grid-cols-2 gap-10"> </h1>
<!-- Start Column -->
<div>
<div class="flex flex-row justify-center items-center">
<h1
class="text-3xl sm:text-4xl text-white text-center font-bold mb-5"
>
Economic Indicators
</h1>
</div>
<span
class="text-white text-md font-medium text-center flex justify-center items-center"
>
The indicators measure economic performance and identify
growth trends.
</span>
</div>
<!-- End Column -->
<!-- Start Column -->
<div
class="hidden sm:block relative m-auto mb-5 mt-5 sm:mb-0 sm:mt-0"
>
<svg
class="w-40 -my-5"
viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="5" result="glow" />
<feMerge>
<feMergeNode in="glow" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<path
fill="#1E40AF"
d="M57.6,-58.7C72.7,-42.6,81.5,-21.3,82,0.5C82.5,22.3,74.7,44.6,59.7,60.1C44.6,75.6,22.3,84.3,0,84.3C-22.3,84.2,-44.6,75.5,-61.1,60.1C-77.6,44.6,-88.3,22.3,-87.6,0.7C-86.9,-20.8,-74.7,-41.6,-58.2,-57.7C-41.6,-73.8,-20.8,-85.2,0.2,-85.4C21.3,-85.6,42.6,-74.7,57.6,-58.7Z"
transform="translate(100 100)"
filter="url(#glow)"
/>
</svg>
<div class="z-1 absolute top-1">
<img
class="w-[80px] ml-10"
src={cloudFrontUrl + "/assets/economic_data_logo.png"}
alt="logo"
loading="lazy"
/>
</div>
</div>
<!-- End Column -->
</div>
</div> </div>
{#if isLoaded} {#if isLoaded}
<div class="w-screen sm:w-full m-auto mt-20 sm:mt-10 p-3"> <div
<h2 class="text-2xl text-gray-200 font-bold"> class="mb-8 w-full text-center sm:text-start sm:flex sm:flex-row sm:items-center m-auto text-gray-100 border border-gray-800 sm:rounded-lg h-auto p-5"
>
<svg
class="w-5 h-5 inline-block sm:mr-2 flex-shrink-0"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 256 256"
><path
fill="#FBCE3C"
d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m-4 48a12 12 0 1 1-12 12a12 12 0 0 1 12-12m12 112a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 0 16"
/></svg
>
We provide real-time and historical data on key economic indicators
like GDP, unemployment, and inflation, essential for tracking economic
performance and growth trends.
</div>
<div class="w-full m-auto mt-20 sm:mt-10">
<h2 class="text-xl sm:text-2xl text-gray-200 font-bold">
Federal Fund Rate
</h2>
<div class="text-[1rem] text-white mt-2 mb-2">
The federal funds rate is the interest rate at which banks lend
to each other overnight to maintain reserve balances. It's a
critical tool for U.S. monetary policy, influencing borrowing
costs for consumers and businesses, economic growth, and
inflation. Changes in the federal funds rate affect everything
from loan interest rates to stock market performance, making it
a key indicator of economic health.
</div>
<Lazy>
<div class="app w-full">
<Chart {init} options={optionsFedFundRate} class="chart" />
</div>
</Lazy>
<h2
class="text-xl sm:text-2xl text-gray-200 font-bold mt-20 sm:mt-10"
>
Consumer Price Index (CPI) Consumer Price Index (CPI)
</h2> </h2>
@ -648,7 +710,9 @@
</div> </div>
</Lazy> </Lazy>
<h2 class="text-2xl text-gray-200 font-bold mt-20 sm:mt-10"> <h2
class="text-xl sm:text-2xl text-gray-200 font-bold mt-20 sm:mt-10"
>
Gross Domestic Product (GDP) Gross Domestic Product (GDP)
</h2> </h2>
@ -666,7 +730,9 @@
</div> </div>
</Lazy> </Lazy>
<h2 class="text-2xl text-gray-200 font-bold mt-20 sm:mt-10"> <h2
class="text-xl sm:text-2xl text-gray-200 font-bold mt-20 sm:mt-10"
>
Unemployment Rate vs Inflation Rate Unemployment Rate vs Inflation Rate
</h2> </h2>
@ -686,7 +752,9 @@
</div> </div>
</Lazy> </Lazy>
<h2 class="text-2xl text-gray-200 font-bold mt-20 sm:mt-10"> <h2
class="text-xl sm:text-2xl text-gray-200 font-bold mt-20 sm:mt-10"
>
Treasury Rates Treasury Rates
</h2> </h2>
@ -917,10 +985,10 @@
<aside class="hidden lg:block relative fixed w-1/4 ml-4"> <aside class="hidden lg:block relative fixed w-1/4 ml-4">
{#if data?.user?.tier !== "Pro" || data?.user?.freeTrial} {#if data?.user?.tier !== "Pro" || data?.user?.freeTrial}
<div <div
on:click={() => goto("/pricing")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer" class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
> >
<div <a
href="/pricing"
class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0" class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"
> >
<div class="w-full flex justify-between items-center p-3 mt-3"> <div class="w-full flex justify-between items-center p-3 mt-3">
@ -932,42 +1000,46 @@
<span class="text-white p-3 ml-3 mr-3"> <span class="text-white p-3 ml-3 mr-3">
Upgrade now for unlimited access to all data and tools. Upgrade now for unlimited access to all data and tools.
</span> </span>
</div> </a>
</div> </div>
{/if} {/if}
<div <div
on:click={() => goto("/analysts")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer" class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
> >
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"> <a
href="/economic-calendar"
class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"
>
<div class="w-full flex justify-between items-center p-3 mt-3"> <div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3"> <h2 class="text-start text-xl font-semibold text-white ml-3">
Wallstreet Analyst Economic Events
</h2> </h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" /> <ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div> </div>
<span class="text-white p-3 ml-3 mr-3"> <span class="text-white p-3 ml-3 mr-3">
Get the latest top Wall Street analyst ratings. Stay updated on upcoming Economic Events worldwide.
</span> </span>
</div> </a>
</div> </div>
<div <div
on:click={() => goto("/politicians")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer" class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
> >
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"> <a
href="/earnings-calendar"
class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"
>
<div class="w-full flex justify-between items-center p-3 mt-3"> <div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3"> <h2 class="text-start text-xl font-semibold text-white ml-3">
Congress Trading Earnings Calendar
</h2> </h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" /> <ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div> </div>
<span class="text-white p-3 ml-3 mr-3"> <span class="text-white p-3 ml-3 mr-3">
Get the latest top Congress trading insights. Get the latest Earnings of companies.
</span> </span>
</div> </a>
</div> </div>
</aside> </aside>
</div> </div>

View File

@ -619,23 +619,24 @@
exportList = await response.json(); exportList = await response.json();
exportList = exportList?.map( exportList = exportList?.map(
({ time, open, high, low, close, date }) => ({ ({ time, open, high, low, close, date, volume }) => ({
date: timePeriod === "max" ? time : date, // Use 'time' if timePeriod is "max", otherwise use 'date' date: timePeriod === "max" ? time : date, // Use 'time' if timePeriod is "max", otherwise use 'date'
open, open,
high, high,
low, low,
close, close,
volume
}), }),
); );
const csvRows = []; const csvRows = [];
// Add headers row // Add headers row
csvRows.push("time,open,high,low,close"); csvRows.push("time,open,high,low,close, volume");
// Add data rows // Add data rows
for (const row of exportList) { for (const row of exportList) {
const csvRow = `${row.date},${row.open},${row.high},${row.low},${row.close}`; const csvRow = `${row.date},${row.open},${row.high},${row.low},${row.close},${row.volume}`;
csvRows.push(csvRow); csvRows.push(csvRow);
} }