이 기사에서는 Node.js, Express 및 OpenAI API를 사용하여 전문가 수준의 주식 보고서 생성기를 만드는 방법을 살펴보겠습니다. 우리는 OpenAI API 상호 작용에 사용되는 프롬프트 메시지의 무결성을 유지하면서 고품질의 유지 관리 가능한 코드를 작성하는 데 중점을 둘 것입니다. 이 애플리케이션은 주식 데이터를 가져오고, 정서 및 업계 분석을 수행하고, 종합적인 투자 보고서를 생성합니다.
목차
- 사업개요
- 환경설정
- 익스프레스 서버 생성
- 데이터 가져오기 및 처리
- OpenAI API와 통합
- 최종 보고서 생성
- 애플리케이션 테스트
- 결론
프로젝트 개요
우리의 목표는 특정 주식 시세 표시기에 대한 자세한 투자 보고서를 생성하는 API 엔드포인트를 구축하는 것입니다. 보고서에는 다음이 포함됩니다.
- 회사개요
- 재무실적
- 경영토론 및 분석(MDA)
- 감성분석
- 업계분석
- 위험과 기회
- 투자추천
외부 API에서 주식 데이터를 가져오고 고급 분석을 위해 OpenAI API를 사용하여 프롬프트 메시지가 정확하게 보존되도록 할 것입니다.
환경 설정
전제 조건
- Node.js가 컴퓨터에 설치되어 있습니다
- OpenAI API Key (없으면 OpenAI에서 가입하세요)
프로젝트 초기화
새 디렉토리를 생성하고 Node.js 프로젝트를 초기화합니다.
mkdir stock-report-generator cd stock-report-generator npm init -y
필요한 종속성을 설치합니다.
npm install express axios
프로젝트 구조 설정:
mkdir routes utils data touch app.js routes/report.js utils/helpers.js
익스프레스 서버 생성
app.js 설정
// app.js const express = require('express'); const reportRouter = require('./routes/report'); const app = express(); app.use(express.json()); app.use('/api', reportRouter); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
- Express 초기화: Express를 가져와서 애플리케이션을 초기화합니다.
- 미들웨어: express.json()을 사용하여 JSON 요청 본문을 구문 분석합니다.
- 라우팅: /api 경로에 보고서 라우터를 마운트합니다.
- Server Listening: 지정된 포트에서 서버를 시작합니다.
데이터 가져오기 및 처리
도우미 함수 만들기
utils/helpers.js에서 데이터 가져오기 및 처리를 위한 유틸리티 함수를 정의합니다.
mkdir stock-report-generator cd stock-report-generator npm init -y
- getLastYearDates: 전년도의 시작 날짜와 종료 날짜를 계산합니다.
- objectToString: 지정된 키를 제외하고 객체를 읽을 수 있는 문자열로 변환합니다.
- fetchData: 외부 API에 대한 GET 요청을 처리하여 데이터 또는 기본값을 반환합니다.
- readLocalJson: 로컬 JSON 파일에서 데이터를 읽습니다.
주식 데이터 가져오기 구현
routes/report.js에서 주식 데이터를 가져오는 함수를 정의합니다.
npm install express axios
- fetchStockData: 동시에 여러 데이터 포인트를 가져와 결과를 처리합니다.
- 데이터 처리: 이후 사용을 위해 데이터의 형식을 지정하고 변환합니다.
- 오류 처리: 오류를 기록하고 더 높은 수준의 처리를 위해 다시 발생시킵니다.
OpenAI API와 통합
OpenAI API 상호작용 기능
mkdir routes utils data touch app.js routes/report.js utils/helpers.js
- analyzeWithOpenAI: OpenAI API와의 통신을 처리합니다.
- API 구성: 모델, 온도 등의 매개변수를 설정합니다.
- 오류 처리: 업스트림 처리에 대한 오류를 기록하고 발생시킵니다.
감정 분석 수행
// app.js const express = require('express'); const reportRouter = require('./routes/report'); const app = express(); app.use(express.json()); app.use('/api', reportRouter); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
- performSentimentAnalytic: 프롬프트 메시지를 구성하고 분석을 위해 OpenAI API를 호출합니다.
- 프롬프트 디자인: 프롬프트 메시지가 명확하고 필요한 맥락을 포함하는지 확인합니다.
업계 분석
// utils/helpers.js const axios = require('axios'); const fs = require('fs'); const path = require('path'); const BASE_URL = 'https://your-data-api.com'; // Replace with your actual data API /** * Get the start and end dates for the last year. * @returns {object} - An object containing `start` and `end` dates. */ function getLastYearDates() { const now = new Date(); const end = now.toISOString().split('T')[0]; now.setFullYear(now.getFullYear() - 1); const start = now.toISOString().split('T')[0]; return { start, end }; } /** * Convert an object to a string, excluding specified keys. * @param {object} obj - The object to convert. * @param {string[]} excludeKeys - Keys to exclude. * @returns {string} - The resulting string. */ function objectToString(obj, excludeKeys = []) { return Object.entries(obj) .filter(([key]) => !excludeKeys.includes(key)) .map(([key, value]) => `${key}: ${value}`) .join('\n'); } /** * Fetch data from a specified endpoint with given parameters. * @param {string} endpoint - API endpoint. * @param {object} params - Query parameters. * @param {any} defaultValue - Default value if the request fails. * @returns {Promise<any>} - The fetched data or default value. */ async function fetchData(endpoint, params = {}, defaultValue = null) { try { const response = await axios.get(`${BASE_URL}${endpoint}`, { params }); return response.data || defaultValue; } catch (error) { console.error(`Error fetching data from ${endpoint}:`, error.message); return defaultValue; } } /** * Read data from a local JSON file. * @param {string} fileName - Name of the JSON file. * @returns {any} - The parsed data. */ function readLocalJson(fileName) { const filePath = path.join(__dirname, '../data', fileName); const data = fs.readFileSync(filePath, 'utf-8'); return JSON.parse(data); } module.exports = { fetchData, objectToString, getLastYearDates, readLocalJson, }; </any>
- analyzeIndustry: 감정 분석과 유사하지만 더 넓은 업계 상황에 중점을 둡니다.
- 프롬프트 보존: 원래 프롬프트 메시지의 무결성을 유지합니다.
최종 보고서 생성
모든 데이터 컴파일
// routes/report.js const express = require('express'); const { fetchData, objectToString, getLastYearDates, readLocalJson, } = require('../utils/helpers'); const router = express.Router(); /** * Fetches stock data including historical prices, financials, MDA, and main business info. * @param {string} ticker - Stock ticker symbol. * @returns {Promise<object>} - An object containing all fetched data. */ async function fetchStockData(ticker) { try { const dates = getLastYearDates(); const [historicalData, financialData, mdaData, businessData] = await Promise.all([ fetchData('/stock_zh_a_hist', { symbol: ticker, period: 'weekly', start_date: dates.start, end_date: dates.end, }, []), fetchData('/stock_financial_benefit_ths', { code: ticker, indicator: '按年度', }, [{}]), fetchData('/stock_mda', { code: ticker }, []), fetchData('/stock_main_business', { code: ticker }, []), ]); const hist = historicalData[historicalData.length - 1]; const currentPrice = (hist ? hist['开盘'] : 'N/A') + ' CNY'; const historical = historicalData .map((item) => objectToString(item, ['股票代码'])) .join('\n----------\n'); const zsfzJson = readLocalJson('zcfz.json'); const balanceSheet = objectToString(zsfzJson.find((item) => item['股票代码'] === ticker)); const financial = objectToString(financialData[0]); const mda = mdaData.map(item => `${item['报告期']}\n${item['内容']}`).join('\n-----------\n'); const mainBusiness = businessData.map(item => `主营业务: ${item['主营业务']}\n产品名称: ${item['产品名称']}\n产品类型: ${item['产品类型']}\n经营范围: ${item['经营范围']}` ).join('\n-----------\n'); return { currentPrice, historical, balanceSheet, mda, mainBusiness, financial }; } catch (error) { console.error('Error fetching stock data:', error.message); throw error; } } </object>
- provideFinalAnalytic: 수집된 모든 데이터를 통합하여 프롬프트 메시지를 신중하게 작성합니다.
- 프롬프트 무결성: 원본 프롬프트 메시지가 변경되거나 손상되지 않도록 합니다.
애플리케이션 테스트
경로 처리기 정의
routes/report.js에 경로 핸들러를 추가합니다.
const axios = require('axios'); const OPENAI_API_KEY = 'your-openai-api-key'; // Replace with your OpenAI API key /** * Interacts with the OpenAI API to get completion results. * @param {array} messages - Array of messages, including system prompts and user messages. * @returns {Promise<string>} - The AI's response. */ async function analyzeWithOpenAI(messages) { try { const headers = { 'Authorization': `Bearer ${OPENAI_API_KEY}`, 'Content-Type': 'application/json', }; const requestData = { model: 'gpt-4', temperature: 0.3, messages: messages, }; const response = await axios.post( 'https://api.openai.com/v1/chat/completions', requestData, { headers } ); return response.data.choices[0].message.content.trim(); } catch (error) { console.error('Error fetching analysis from OpenAI:', error.message); throw error; } } </string>
- 입력 검증: 티커 기호가 제공되는지 확인합니다.
- 데이터 수집: 주식 데이터를 동시에 가져오고 분석을 수행합니다.
- 오류 처리: 오류를 기록하고 실패할 경우 500 응답을 보냅니다.
서버 시작
app.js 및 Routes/report.js가 올바르게 설정되었는지 확인한 후 서버를 시작하세요.
/** * Performs sentiment analysis on news articles using the OpenAI API. * @param {string} ticker - Stock ticker symbol. * @returns {Promise<string>} - Sentiment analysis summary. */ async function performSentimentAnalysis(ticker) { const systemPrompt = `You are a sentiment analysis assistant. Analyze the sentiment of the given news articles for ${ticker} and provide a summary of the overall sentiment and any notable changes over time. Be measured and discerning. You are a skeptical investor.`; const tickerNewsResponse = await fetchData('/stock_news_specific', { code: ticker }, []); const newsText = tickerNewsResponse .map(item => `${item['文章来源']} Date: ${item['发布时间']}\n${item['新闻内容']}`) .join('\n----------\n'); const messages = [ { role: 'system', content: systemPrompt }, { role: 'user', content: `News articles for ${ticker}:\n${newsText || 'N/A'}\n----\nProvide a summary of the overall sentiment and any notable changes over time.`, }, ]; return await analyzeWithOpenAI(messages); } </string>
테스트 요청 보내기
curl 또는 Postman을 사용하여 POST 요청 보내기:
mkdir stock-report-generator cd stock-report-generator npm init -y
- 응답: 서버는 생성된 보고서가 포함된 JSON 개체를 반환해야 합니다.
결론
저희는 다음 기능을 갖춘 고품질 주식 보고서 생성기를 구축했습니다.
- 외부 API에서 주식 데이터를 가져와 처리
- OpenAI API를 사용하여 고급 분석을 수행합니다.
- 포괄적인 투자 보고서를 생성하는 동시에 프롬프트 메시지의 무결성을 보장합니다.
개발 과정 전반에 걸쳐 전문적이고 유지 관리가 가능한 코드를 작성하는 데 중점을 두고 자세한 설명과 주석을 제공했습니다.
구현된 모범 사례
- 모듈형 코드 구조: 재사용성과 명확성을 위해 함수가 모듈화되었습니다.
- 비동기 작업: 효율적인 비동기 프로그래밍을 위해 async/await 및 Promise.all을 사용했습니다.
- 오류 처리: 포괄적인 try-catch 블록 및 오류 메시지.
- API 추상화: 더 나은 유지 관리를 위해 API 상호 작용 논리를 분리했습니다.
- 프롬프트 엔지니어링: 원하는 결과를 얻을 수 있도록 OpenAI API용 프롬프트 메시지를 세심하게 디자인했습니다.
- 입력 유효성 검사: 불필요한 오류를 방지하기 위해 필수 입력 매개변수를 확인합니다.
- 코드 문서: 더 나은 이해와 유지 관리를 위해 JSDoc 주석을 추가했습니다.
다음 단계
- 캐싱: 중복 API 호출을 줄이기 위해 캐싱 메커니즘을 구현합니다.
- 인증: 인증 및 속도 제한으로 API 엔드포인트를 보호합니다.
- 프런트엔드 개발: 애플리케이션과 상호작용하기 위한 사용자 인터페이스를 구축합니다.
- 추가 분석: 기술적 분석이나 기타 재무 모델을 통합합니다.
참고자료
- Node.js 문서
- Express.js 문서
- Axios 문서
- OpenAI API 참고자료
면책조항: 이 애플리케이션은 교육 목적으로만 사용됩니다. 모든 API 서비스 약관을 준수하고 민감한 데이터를 적절하게 처리하십시오.
위 내용은 Node.js, Express 및 OpenAI API를 사용하여 고품질 주식 보고서 생성기 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는
