@@ -68,7 +68,7 @@ export default function ModelMetadata({ metadata }: ModelMetadataProps) {
Mean Absolute Error (MAE)
-
${metadata.maeScore.toFixed(2)}
+
{metadata.maeScore.toFixed(5)}
Average error in price predictions
diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx
index 67c239b..b8d2a41 100644
--- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx
+++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx
@@ -15,6 +15,7 @@ import StockDataTable from "./stock-data-table"
import ModelMetadata from "./model-metadata"
//import {getStockData, getPredictionData, getModelMetadata} from "@/lib/data"
import {exportToCSV} from "@/lib/export"
+import {BACKEND_BASE_URL} from "@/lib/const"
import {PredictionData, StockData, ModelMetadataType} from "@/lib/types/stock_prediction";
// import { number } from "zod"
@@ -32,13 +33,13 @@ const formatDate = (date: Date) => {
return date.toLocaleDateString("en-CA"); // "YYYY-MM-DD" format
};
-const BASE_URL = process.env.NEXT_PUBLIC_BACKEND_BASE_URL || "http://localhost:8000";
+const BASE_URL = BACKEND_BASE_URL
export default function StockDashboard() {
const [selectedCompany, setSelectedCompany] = useState
("")
const [dateRange, setDateRange] = useState({
- from: new Date(new Date().setDate(new Date().getDate() - 30)),
- to: new Date(),
+ from: new Date(new Date().setDate(new Date().getDate() - 31)),
+ to: new Date(new Date().setDate(new Date().getDate() - 1)),
})
const [stockData, setStockData] = useState(null)
const [predictionData, setPredictionData] = useState(null)
@@ -46,6 +47,9 @@ export default function StockDashboard() {
const [activeTab, setActiveTab] = useState("overview")
const [sevchange, setSevchange] = useState(null)
const [isLoading, setIsLoading] = useState(false);
+ const [isPredicting,setPredicting] = useState(false);
+ const [error,setError] = useState(null);
+ const [dataerror,setDataerror] = useState(null);
const [companies, setCompanies] = useState([]);
@@ -53,12 +57,22 @@ export default function StockDashboard() {
useEffect(() => {
const fetchCompanies = async () => {
try {
+ setIsLoading(true);
+ console.log(`${BASE_URL}/get-active-symbols`)
const response = await fetch(`${BASE_URL}/get-active-symbols`);
- const data = await response.json();
- setCompanies(data.symbols);
- setSelectedCompany(data.symbols[0].value);
- } catch (error) {
- console.error("Error fetching company symbols:", error);
+ if(response.ok){
+ const data = await response.json();
+ setCompanies(data.symbols);
+ setSelectedCompany(data.symbols[0].value);
+ // if(companies.length == 0){
+ // setError("No active symbols")
+ // }
+ }else{
+ setError("cannot get stock symbols")
+ }
+ setIsLoading(false)
+ } catch {
+ setError("Error fetching company symbols");
}
};
@@ -70,7 +84,7 @@ export default function StockDashboard() {
// Fetch stock data based on selected company and date range
const fetchStockData = async () => {
- setIsLoading(true); // Show loading popup
+ setPredicting(true); // Show loading popup
try {
const response = await fetch(`${BASE_URL}/V2/get-predicted-prices`, {
method: "POST",
@@ -83,20 +97,29 @@ export default function StockDashboard() {
ticker_symbol: selectedCompany,
}),
});
- const data = await response.json();
- setStockData(data.stockData);
- setModelMetadata(data.modelMetadata);
- setPredictionData(data.predictionData)
- if (data.predictionData && data.stockData && data.stockData.history.length > 0 && data.predictionData.predictions.length > 0) {
- const lastPrediction = data.predictionData.predictions[data.predictionData.predictions.length - 1].predicted;
- const lastPrice = data.stockData.history[data.stockData.history.length - 1].price;
- const percentageChange = ((lastPrediction - lastPrice) / lastPrice) * 100;
- setSevchange(percentageChange);
+ if(response.ok){
+ const data = await response.json();
+ setStockData(data.stockData);
+ setModelMetadata(data.modelMetadata);
+ setPredictionData(data.predictionData)
+ if (data.predictionData && data.stockData && data.stockData.history.length > 0 && data.predictionData.predictions.length > 0) {
+ const lastPrediction = data.predictionData.predictions[data.predictionData.predictions.length - 1].predicted;
+ const lastPrice = data.stockData.history[data.stockData.history.length - 1].price;
+ const percentageChange = ((lastPrediction - lastPrice) / lastPrice) * 100;
+ setSevchange(percentageChange);
+ }
+
}
- } catch (error) {
- console.error("Error fetching stock data:", error);
+ else{
+ const result = await response.json();
+ setDataerror(result.detail || "Resource not found");
+ return;
+ }
+
+ } catch {
+ console.error("Error fetching stock data");
} finally {
- setIsLoading(false); // Hide loading popup
+ setPredicting(false); // Hide loading popup
}
};
@@ -114,20 +137,47 @@ export default function StockDashboard() {
const handleExport = () => {
exportToCSV(predictionData, `${selectedCompany}_predictions`)
}
+ if(error){
+ return (
+
- return (
-
- {isLoading && (
-
-
+ )
+
+ }
+ if (isLoading) {
+ return (
+
+ )
+ }
+ else if (isPredicting) {
+ return (
+
+
+
+
+
Predicting stock close prices...
- )}
+
+
+ )
+ }
+ else {
+ return (
+
Stock Prediction Dashboard
@@ -159,8 +209,15 @@ export default function StockDashboard() {
+ {dataerror && (
+
+
-
+
)}
+
+ {!dataerror && (
@@ -205,16 +262,16 @@ export default function StockDashboard() {
${predictionData?.nextWeek.predicted.toFixed(2)}
- {/*
+
Confidence: {predictionData?.nextWeek.confidenceLow.toFixed(2)} -{" "}
{predictionData?.nextWeek.confidenceHigh.toFixed(2)}
-
*/}
+
-
+ )}
-
+ {!dataerror && (
Overview
Predictions
@@ -275,7 +332,7 @@ export default function StockDashboard() {
{modelMetadata && }
-
+ )}
)
-}
+}}
diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx
index e490e7e..b5d6d49 100644
--- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx
+++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx
@@ -17,6 +17,7 @@ export default function StockDataTable({data}: StockDataTableProps) {
Date
Predicted Price
+ Confidence Interval
Change
@@ -25,9 +26,9 @@ export default function StockDataTable({data}: StockDataTableProps) {
{format(new Date(item.date), "MMM dd, yyyy")}
${item.predicted.toFixed(2)}
- {/*
+
${item.confidenceLow.toFixed(2)} - ${item.confidenceHigh.toFixed(2)}
- */}
+
0 ? "success" : "destructive"}>
{item.change > 0 ? "+" : ""}
diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx
index 503a022..bacb8af 100644
--- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx
+++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx
@@ -15,8 +15,8 @@ interface ChartDataItem {
formattedDate: string
price: number | null
predicted: number | null
- // confidenceLow: number | null
- // confidenceHigh: number | null
+ confidenceLow: number | null
+ confidenceHigh: number | null
}
export default function StockPredictionChart({historicalData, predictionData}: StockPredictionChartProps) {
@@ -28,8 +28,8 @@ export default function StockPredictionChart({historicalData, predictionData}: S
...item,
formattedDate: format(new Date(item.date), "MMM dd"),
predicted: null,
- // confidenceLow: null,
- // confidenceHigh: null,
+ confidenceLow: null,
+ confidenceHigh: null,
}))
const predictions = predictionData.map((item) => ({
@@ -37,8 +37,8 @@ export default function StockPredictionChart({historicalData, predictionData}: S
formattedDate: format(new Date(item.date), "MMM dd"),
price: null, // No actual price for future dates
predicted: item.predicted,
- // confidenceLow: item.confidenceLow,
- // confidenceHigh: item.confidenceHigh,
+ confidenceLow: item.confidenceLow,
+ confidenceHigh: item.confidenceHigh,
}))
// Combine the data sets
diff --git a/src/lib/types/stock_prediction.ts b/src/lib/types/stock_prediction.ts
index 71066da..cdd8c9f 100644
--- a/src/lib/types/stock_prediction.ts
+++ b/src/lib/types/stock_prediction.ts
@@ -19,8 +19,8 @@ export interface StockData {
export interface PredictionItem {
date: string;
predicted: number;
- // confidenceLow: number;
- // confidenceHigh: number;
+ confidenceLow: number;
+ confidenceHigh: number;
change: number;
}
@@ -39,5 +39,5 @@ export interface ModelMetadataType {
maeScore: number;
// features: string[];
lastUpdated: string;
- // trainingDataPoints: number;
+ trainingDataPoints: number;
}
\ No newline at end of file