[실패사례]뉴스 기사를 통한 주식 투자 pool 만들기

소개

다양한 경제 기사를 통해 각국의 정책에 따라 기업의 향방이 결정되나 인사이트 없이 바로 캐치가 힘듦. 메이저언론사에서 다루는 주요 기사를 통해 메이저 기업 또는 시장에서 부상하는 다크호스 기업들을 pool로 묶고 미국 주식 시장에서 투자키 위한 준비 단계를 자동화

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

1.Chat GPT와 자동화의 목적과 배경을 설명, 결과를 얻기 위한 필요한 노드 및 필수 설치 내용을 알려 달라고 요청 (API KEY 등)

📈 뉴스 기반 주식 투자 자동화 프로세스 이 프로세스는 핵심 뉴스가 보도되었을 때 신속하게 관련 기업을 찾아 분석하고 투자 가능성을 평가하는 자동화 시스템을 구축하는 것입니다. 아래 단계별 흐름을 통해 최종적으로 투자 판단을 내릴 수 있도록 구성됩니다.

🛠️ 자동화 프로세스 정리

🔹 1. 뉴스 데이터 수집 (핵심 뉴스 감지) 실시간 뉴스 데이터 수집 (예: Bloomberg, Reuters, Yahoo Finance 등) 특정 키워드 기반으로 시장에 영향을 줄 만한 뉴스 필터링 자연어 처리(NLP)를 활용해 중요한 인사이트가 담긴 뉴스인지 판별

🔹 2. 뉴스 텍스트 변환 & 핵심 키워드 추출 뉴스를 텍스트로 변환 및 요약 AI를 활용해 기사에서 중요한 경제, 산업, 기업 관련 핵심 키워드 추출 예: "일론 머스크, AI칩 기업에 투자 의사 밝힘" → 키워드: "AI칩", "반도체", "일론 머스크"

🔹 3. 관련 기업 검색 (주식 시장 매핑) 키워드와 연결된 기업 탐색 (예: AI칩 → NVIDIA, AMD, TSMC 등) 각 기업이 해당 키워드와 얼마나 직접적인 연관이 있는지 분석

🔹 4. 기업 재무 분석 (투자 가치 평가) 해당 기업들의 재무제표 검색 (매출, 영업이익, 부채비율 등) 주가 변동성 및 장기 성장성 평가 재무적으로 우량한 기업 필터링

🔹 5. 투자 가능성이 높은 기업 추천 정리된 리스트에서 투자 적합성 높은 기업 추천 기업별 투자 포인트 & 리스크 제공

🔹 6. 주식 차트 분석 (진입 타이밍 판단) 선택한 기업의 주가 차트 분석 (기술적 분석 적용) 주요 지지/저항선, 이동평균선, 거래량 분석 과거 패턴을 기반으로 매수/매도 타이밍 예측

⚡ 최종 결과: 1️⃣ 주요 뉴스 발생 → 2️⃣ 핵심 키워드 분석 → 3️⃣ 관련 기업 검색 4️⃣ 재무적으로 우량한 기업 필터링 → 5️⃣ 투자 추천 → 6️⃣ 차트 분석

===

위 시스템을 구축할 수 있도록 각 단계의 n8n 노드 및 외부 프로그램이나 파일 설치를 상세히 설명해 주고, 각 단계가 최종 완료되어 내가 "다음"이라고 말하면 다음 단계로 넘어가줘. 이해했으면 시작해줘.

진행한 work flow

흐름도의 스크린 샷

단계 별 노드를 진행하던 중 httep request 이후 filter를 통해 기사에서 다뤄지는 기업 및 주요 키워드를 추출하려는 filter 노드를 넣었으나 계속되는 에러로, gpt와 의논을 통해 아예 삭제하고 open ai를 통해 주요 기업을 추출하는 프롬프트로, 이후 code를 통해 두 번째 http request1의 finn hub API KEY를 통해 관련 기업의 미국 주식 ticker를 매칭하는 작업을 진행하려했음. 그러나 open ai가 기사에 포함된 기업을 전혀 추출해 내지 못 하는 문제 발생. 여러 방면으로 코드를 수정해 봤으나 지속적인 에러가 발생.

1) open ai 프롬프트

다양한 유형의 정보를 보여주는 화면의 스크린 샷
Analyze the following news articles and extract all company names mentioned in each article.

- Identify and list all company names mentioned in each news article.
- If multiple companies are mentioned, return all of them.
- If no company name is found, try extracting from the title and description.
- Only return the company names, separated by commas.
- Do not include any extra text, explanations, or formatting.

News Articles:
{{ $json.articles.map(article => `Title: ${article.title}, Description: ${article.description}`).join("\n") }}

2) code

정보가 다른 웹 페이지의 스크린 샷
console.log("OpenAI Response:", $json?.choices?.[0]?.message?.content);

// OpenAI 응답이 없을 경우 기본값 설정
const openAIResponse = $json?.choices?.[0]?.message?.content || "Unknown";

if (openAIResponse === "Unknown") {
    console.log("⚠ OpenAI returned 'Unknown', unable to extract companies.");
}

// 뉴스 기사 배열 가져오기
const articles = $json.articles || [];
const companyResponses = openAIResponse ? openAIResponse.split("\n") : [];

const result = [];

articles.forEach((article, index) => {
    const title = article.title || "No Title Available";
    const description = article.description || "No Description Available";

    console.log(`🔹 News [${index}] Title:`, title);
    console.log(`🔹 News [${index}] Description:`, description);

    // OpenAI가 반환한 기업 리스트
    let companies = companyResponses[index] ? companyResponses[index].split(',').map(c => c.trim()) : [];

    // 기업명이 없을 경우 제목에서 다시 추출
    if (companies.length === 0 || companies.includes("Unknown")) {
        console.log(`⚠ OpenAI did not find companies in News [${index}], extracting from title & description...`);
        const companyMatch = (title + " " + description).match(/\b[A-Z][a-zA-Z]+(?:\s[A-Z][a-zA-Z]+)*(?:\s(Inc|Corp|Ltd|Group|Company|Technologies|Enterprises))?\b/g);

        if (companyMatch && companyMatch.length > 0) {
            companies = companyMatch.map(c => c.trim());
            console.log(`✅ Extracted Companies from Title/Description [${index}]:`, companies);
        } else {
            companies = ["Unknown"];
        }
    }

    // 중복 제거
    companies = [...new Set(companies)];

    result.push({
        index,
        title,
        description,
        companies
    });
});

return result;

🛠 현재까지 진행된 n8n 워크플로우 요약


📌 1. 뉴스 기사 데이터 수집

  • HTTP Request Node

    • API: News API 사용

    • 역할: 뉴스 기사 데이터를 가져옴

    • 출력: JSON 형식의 기사 목록 (articles 배열)


📌 2. 기사에서 기업 이름 추출 (OpenAI 활용)

  • OpenAI Node (GPT-4o)

    • 입력: 뉴스 기사(title, description, content)

    • 목표: 기사 내 언급된 모든 기업명을 추출

    • 요청 방식:

      • 명확한 프롬프트 사용 (기업명만 반환)

      • 여러 기사에서 기업명을 추출할 수 있도록 구조 개선

    • 문제점:

      • OpenAI 응답이 Unknown을 반환하는 경우 발생

      • OpenAI가 특정 기사에서 기업명을 감지하지 못하는 경우 존재

    • 개선:

      • Function 노드에서 제목과 설명에서 직접 기업명을 추출하도록 보완


📌 3. OpenAI 응답 보완 및 예외 처리 (Function 노드)

  • Function Node (JavaScript 코드)

    • OpenAI의 응답을 기반으로 기업 리스트 정리

    • OpenAI가 Unknown을 반환하면 제목과 설명에서 직접 기업명을 추출

    • 정규 표현식 (RegEx) 을 사용하여 기업명을 감지하고 리스트화

    • 중복 제거 (Set 활용)

    • 최종적으로 각 뉴스 기사별 기업명을 포함한 JSON 반환


📌 4. 기업명을 기반으로 추가 데이터 조회 (Finnhub API)

  • HTTP Request Node (Finnhub API)

    • 입력: OpenAI 또는 Function에서 추출한 기업명

    • 목표: Finnhub API를 통해 해당 기업의 주식정보 조회

    • 문제점:

      • OpenAI가 기업명을 제대로 추출하지 못하면 Finnhub에서 검색 실패

    • 개선:

      • OpenAI 결과뿐만 아니라 Function에서 추가 기업명을 보완하여 검색


📌 5. 최종 데이터 정리 및 출력

  • Function Node (정리)

    • 각 뉴스 기사와 해당 기업 정보 정리

    • 최종적으로 title, description, companies, stock data 포함한 JSON 생성


🔥 현재 해결해야 할 이슈

  1. OpenAI가 기업명을 제대로 감지하지 못하는 문제 해결

    • 프롬프트를 더욱 개선하여 기업명 감지율을 높이기

    • "Unknown"을 방지하고 최대한 많은 기업명 추출

  2. Function에서 기업명을 제대로 추출할 수 있도록 개선

    • 정규표현식 튜닝 및 다양한 기업명 패턴 반영

    • Inc., Ltd., Group, Technologies 등의 키워드 활용

  3. Finnhub API와 매칭 문제 해결

    • OpenAI 또는 Function에서 기업명을 정확히 반환해야 검색 가능

    • API 호출 실패 시 대체 검색 방법 추가


✅ 현재 워크플로우 흐름

scss

복사편집

1️⃣ HTTP Request (News API) → 기사 수집 2️⃣ OpenAI (기업명 추출) → 기사 내 언급된 기업 분석 3️⃣ Function (기업명 추가 추출) → OpenAI 보완 4️⃣ HTTP Request (Finnhub API) → 주식 데이터 검색 5️⃣ Function (최종 정리) → 뉴스 + 기업 + 주식 데이터 결합


🚀 다음 단계

  • 🔍 OpenAI 프롬프트 추가 개선

  • 🛠 Function에서 기업명 추출 로직 보완

  • ✅ Finnhub 검색 정확도 높이기

🎯 목표: 뉴스 기사 내 모든 기업명 추출 → Finnhub에서 정확한 주식 정보 검색 → 최종 데이터 정리


🛠 다음 액션 플랜

  1. OpenAI 프롬프트를 개선하여 기업명 감지율 향상

  2. Function 노드에서 정규표현식 최적화하여 기업명 감지 보완

  3. Finnhub API 연동 정확도 체크 및 예외 처리 강화

결과와 배운 점

첫 세팅 부분에서부터 지속적인 에러를 해결해 보려 했으나 한계에 직면. 도움을 받고 다음 단계로 진행이 필요함을 절감함. 한 가지 배운 것은 까막눈으로 gpt가 주는 코딩을 복붙하다가 에러에 대해 많은 얘기를 진행하면 로직을 이해할 수 있었고 추후에는 내 의견 또한 말하는 상황이 배운 점. 박정기 초보가 하려니 쉽지가 않네요. 구조적인 문제로 막히는 건지 디테일에서 놓친게 있는지 검토해 주시면 감사하겠습니다!

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

(내용 입력)

1

👉 이 게시글도 읽어보세요