소문에 사고 뉴스에 팔아라? 뷰직스 뉴스 이벤트 표시 차트

뷰직스 주가 차트 포스트 이미지

뷰직스 주가 전망 포스트에 이어
이번에는 뷰직스 뉴스 이벤트 날짜를 차트에 찍고(수직선 + 라벨),
그 전후 수익률을 표로 뽑아서 변곡점을 기준으로
뷰직스 주가 변동 스토리로 읽어 보도록 하겠습니다.
소문에 사고 뉴스에 팔아라는 말이 진짜일지 살펴보겠습니다.

어떤 “뷰직스 뉴스 이벤트”를 찍을까? (최근 5년 핵심 예시)

차트에 너무 많이 찍으면 지저분해져서, 보통 6~10개 정도가 읽기 좋아요. 아래는 “변곡점 후보”로 쓰기 좋은 공식 발표/실적 이벤트들입니다.

“변곡점 읽기”의 핵심: 이벤트 전후 5거래일 비교

아래 코드는 자동으로

  • 차트에 이벤트 수직선/라벨을 찍고
  • 각 이벤트마다 이벤트 전 5거래일 수익률 / 후 5거래일 수익률 / 이벤트 당일 수익률을 계산해서
  • 구텐베르크 표 블록에 바로 붙여넣기 좋은(탭 구분) 표까지 출력합니다.

完整的 Python 代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf


# ----------------------------
# 1) 데이터 가져오기
# ----------------------------
def fetch_data(ticker: str, years: int = 5) -> pd.DataFrame:
    end = pd.Timestamp.today().normalize()
    start = end - pd.DateOffset(years=years)

    df = yf.download(ticker, start=start.date(), end=end.date(), progress=False)
    if df is None or df.empty:
        raise ValueError("Failed to fetch data from yfinance. Try again later or use CSV fallback.")
    df = df.dropna()
    return df


# ----------------------------
# 2) 뷰직스 뉴스 이벤트 리스트(최근 5년 예시)
# ----------------------------
def build_events() -> list[dict]:
    """
    NOTE:
    - 날짜는 '공식 보도자료/IR' 기준으로 넣었습니다.
    - 차트가 복잡하면 events에서 일부를 주석 처리하거나 지우세요.
    """
    events = [
        {"date": "2021-11-11", "label": "CES 2022 Innovation Awards (PR)", "tag": "Product"},
        {"date": "2022-01-05", "label": "CES 2022: Shield showcased (PR)", "tag": "Product"},
        {"date": "2022-05-18", "label": "Color microLED agreements (PR)", "tag": "Tech"},
        {"date": "2023-11-15", "label": "Quanta partnership (PR)", "tag": "Partnership"},
        {"date": "2024-03-27", "label": "10-K filing delayed (PR)", "tag": "Financial"},
        {"date": "2024-04-08", "label": "Shield online sales expanded (PR)", "tag": "Sales"},
        {"date": "2024-09-03", "label": "Quanta strategic investment (PR)", "tag": "Funding"},
        {"date": "2025-04-29", "label": "Waveguide R&D facility acquisition (PR)", "tag": "M&A"},
        {"date": "2025-09-23", "label": "TCL CSOT partnership expanded (PR)", "tag": "Partnership"},
        {"date": "2025-11-28", "label": "Shipments to global online retailer (~$1M) (PR)", "tag": "Sales"},
        {"date": "2025-12-19", "label": "Collins Aerospace defense collaboration (PR)", "tag": "Defense"},
    ]
    return events


# ----------------------------
# 3) 뷰직스 뉴스 이벤트 날짜를 실제 거래일로 맞추기
# ----------------------------
def align_to_trading_day(index: pd.DatetimeIndex, event_date: str) -> pd.Timestamp | None:
    """
    event_date가 휴일/주말이면 '다음 거래일'로 맞춥니다.
    """
    d = pd.Timestamp(event_date)
    if d in index:
        return d

    # 다음 거래일 찾기
    pos = index.searchsorted(d)
    if pos >= len(index):
        return None
    return index[pos]


# ----------------------------
# 4) 뷰직스 뉴스 이벤트 전후 수익률 계산
# ----------------------------
def compute_event_impacts(df: pd.DataFrame, events: list[dict], pre_days: int = 5, post_days: int = 5) -> pd.DataFrame:
    close = df["Close"].astype(float)
    idx = close.index

    rows = []
    for e in events:
        d0 = align_to_trading_day(idx, e["date"])
        if d0 is None:
            continue

        i0 = idx.get_loc(d0)

        # 경계 처리
        i_pre = max(0, i0 - pre_days)
        i_post = min(len(idx) - 1, i0 + post_days)

        p_pre = float(close.iloc[i_pre])
        p0_prev = float(close.iloc[max(0, i0 - 1)])
        p0 = float(close.iloc[i0])
        p_post = float(close.iloc[i_post])

        pre_ret = (p0 / p_pre - 1.0) * 100.0 if p_pre != 0 else np.nan
        event_day_ret = (p0 / p0_prev - 1.0) * 100.0 if p0_prev != 0 else np.nan
        post_ret = (p_post / p0 - 1.0) * 100.0 if p0 != 0 else np.nan

        rows.append({
            "Date": d0.strftime("%Y-%m-%d"),
            "Event": e["label"],
            "Tag": e.get("tag", ""),
            f"Pre{pre_days}D_%": pre_ret,
            "EventDay_%": event_day_ret,
            f"Post{post_days}D_%": post_ret,
            "Close@Event": p0,
        })

    out = pd.DataFrame(rows)
    return out


# ----------------------------
# 5) 구텐베르크 표 블록용(탭 구분 텍스트) 출력
# ----------------------------
def print_gutenberg_table_event_impacts(impact_df: pd.DataFrame):
    """
    워드프레스 구텐베르크 '표' 블록에 붙여넣기 좋게,
    탭(\t)으로 구분된 형태로 출력합니다. (헤더는 한글)
    """
    header_ko = ["날짜", "이벤트", "구분", "이벤트전(%)", "당일(%)", "이벤트후(%)", "이벤트종가"]
    print("\t".join(header_ko))

    # 컬럼명 유연 처리(Pre/Post 일수 바뀌어도 동작)
    pre_col = [c for c in impact_df.columns if c.startswith("Pre") and c.endswith("D_%")][0]
    post_col = [c for c in impact_df.columns if c.startswith("Post") and c.endswith("D_%")][0]

    for _, r in impact_df.iterrows():
        print(
            f"{r['Date']}\t"
            f"{r['Event']}\t"
            f"{r['Tag']}\t"
            f"{r[pre_col]:.2f}\t"
            f"{r['EventDay_%']:.2f}\t"
            f"{r[post_col]:.2f}\t"
            f"{r['Close@Event']:.4f}"
        )


# ----------------------------
# 6) 뷰직스 뉴스 이벤트 마킹 차트
# ----------------------------
def plot_price_with_events(
    df: pd.DataFrame,
    events: list[dict],
    title: str = "Vuzix (VUZI): Price with News Event Markers",
    max_events_to_label: int = 10,
):
    close = df["Close"].astype(float)
    idx = close.index

    fig, ax = plt.subplots(figsize=(13, 6))
    ax.plot(idx, close.values, linewidth=2, label="Close")

    # 라벨이 너무 많으면 겹치니, 일부만 라벨 처리
    # (필요하면 max_events_to_label 늘리세요)
    labeled = 0
    y_top = close.max()
    y_positions = [y_top * 0.98, y_top * 0.92, y_top * 0.86, y_top * 0.80]  # 라벨 높이 번갈아
    yp_i = 0

    for e in events:
        d0 = align_to_trading_day(idx, e["date"])
        if d0 is None:
            continue

        ax.axvline(d0, color="gray", linestyle="--", linewidth=1, alpha=0.5)

        if labeled < max_events_to_label:
            ax.text(
                d0,
                y_positions[yp_i],
                e["label"],
                rotation=90,
                va="top",
                ha="right",
                fontsize=8,
                alpha=0.85,
            )
            yp_i = (yp_i + 1) % len(y_positions)
            labeled += 1

    ax.set_title(title)
    ax.set_xlabel("Date")
    ax.set_ylabel("Price (USD)")
    ax.grid(alpha=0.25)
    ax.legend()
    plt.tight_layout()
    plt.show()


# ----------------------------
# 실행 파트
# ----------------------------
if __name__ == "__main__":
    ticker = "VUZI"
    years = 5
    pre_days = 5
    post_days = 5

    df = fetch_data(ticker, years=years)
    events = build_events()

    # 1) 이벤트 마킹 차트
    plot_price_with_events(
        df,
        events,
        title="Vuzix (VUZI): Price with News Event Markers",
        max_events_to_label=10,
    )

    # 2) 이벤트 전후 영향 표(콘솔)
    impact = compute_event_impacts(df, events, pre_days=pre_days, post_days=post_days)

    print("\n[Event Impact Summary: Pre/Post Window Returns]")
    print(impact.to_string(index=False))

    # 3) 구텐베르크 표 블록에 붙여넣기용(탭 구분)
    print("\n[구텐베르크 표 블록에 붙여넣기용(탭 구분)]")
    print_gutenberg_table_event_impacts(impact)

뉴스 이벤트 마커가 보여주는 뷰직스 주가의 ‘변곡점 지도’

뷰직스 뉴스 이벤트 표시 차트

생성한 차트를 보면, 뷰직스 주가는 지난 5년 동안 큰 흐름(장기 추세) 이 먼저 있고, 그 위에 뉴스 이벤트(수직선) 가 단기 파동을 얹는 구조입니다.

① 2021년 급등 구간: “테마(AR/스마트글래스) 기대가 먼저, 이벤트는 뒤따름”

차트 초반(2021년)에는 주가가 대략 8달러 수준에서 30달러대까지 급등한 뒤, 빠르게 변동하며 내려오는 모습이 강합니다. 이 구간은 특정 이벤트 한 번이 주가를 만들었다기보다, 시장 전반의 테마 기대(AR/메타버스/성장주 선호) 가 주가를 끌어올리고, 이후 기대가 식으며 조정이 진행된 전형적인 모양입니다.

② 2021년 말~2022년: CES/제품 노출·기술 발표에도 ‘추세 반전’은 못 만들었음

  • CES 2022 관련 마커(2021-11, 2022-01) 주변에서 단기 반등/흔들림은 보이지만, 큰 흐름은 하락 추세를 유지用于以下方面
  • 2022년 중반 microLED/기술 관련 마커도 비슷하게, “하락 추세 속 단기 파동”으로 남는 모습입니다.

즉 이 구간의 메시지는 간단합니다. 좋은 뉴스가 있어도, 시장의 큰 방향(리스크 선호/금리/성장주 환경)이 꺾이면 주가가 오래 버티기 어렵다는 것.

③ 2023~2024년: 파트너십/투자/재무 이슈 마커는 ‘바닥권 체류’를 설명

2023년 말(Quanta 파트너십)부터 2024년(10-K 지연, 온라인 판매 확대, 전략적 투자 등) 마커가 촘촘해지는 구간은 주가가 2달러 아래~1달러대까지 내려가며 바닥권에서 횡보用于以下方面
特别是 10-K 지연 마커가 찍힌 시기는 차트상으로도 주가가 약해진 흐름과 맞물려 보여, 투자자 심리가 “좋은 제품 뉴스”보다 재무/신뢰/지배구조 신호에 더 민감해질 수 있음을 암시합니다.

④ 2025년: 바닥 이후 ‘한 번의 반등(스파이크)’과 재조정, 그리고 완만한 회복 시도

2025년 초에는 차트상 단기 급등(대략 5달러 부근까지) 이 나타났다가 다시 내려옵니다. 흥미로운 점은 이 급등이 마커로 표시된 특정 뉴스 직후라기보다, 시장/수급 요인(섹터 모멘텀, 쇼트커버, 테마 순환 등)과 함께 나타난 “파동”처럼 보인다는 점입니다.
그 후 2025년 중후반(웨이브가이드 R&D 시설 인수, TCL CSOT 협력 확대, 출하 뉴스 등) 마커 구간에서는 주가가 2달러대에서 3~4달러대로 올라오는 완만한 회복 시도가 관찰됩니다. 이건 ‘단발성 급등’보다 더 건설적인 신호로 해석될 여지가 있어요(물론 확정은 불가)

“소문에 사서 뉴스에 팔아라”?

날짜이벤트分离이벤트전(%)당일(%)이벤트후(%)이벤트종가
2021-11-11CES 2022 Innovation AwardsProduct+0.08%+4.22%+4.29%$12.83
2022-01-05CES 2022: Shield showcasedProduct+4.19%-8.13%-6.78%$8.70
2022-05-18Color microLED agreementsTech+34.62%-6.08%+2.16%$5.56
2023-11-15Quanta partnershipPartnership-20.61%+10.08%-16.79%$2.62
2024-03-2710-K filing delayedFinancial-0.75%+6.40%+5.26%$1.33
2024-04-08Shield online sales expandedSales+30.58%+11.27%-22.15%$1.58
2024-09-03Quanta strategic investmentFunding+5.81%+5.81%+4.40%$0.91
2025-04-29Waveguide R&D facility acquisitionM&A+18.07%+0.51%-7.14%$1.96
2025-09-23TCL CSOT partnership expandedPartnership+47.09%-2.96%-4.57%$3.28
2025-11-28Shipments to global online retailer (~$1M)Sales+31.22%+13.03%+2.97%$2.69
2025-12-19Collins Aerospace defense collaborationDefense+13.28%-2.54%+15.64%$3.07


결론부터 말하면, 부분적으로는 보이지만 “일관된 규칙”처럼 반복되지는 않습니다.

적용되는 듯 보이는 구간(가능성)

  • 2021년 말~2022년 초(CES/제품 노출 마커) 근처는 “이벤트 전후로 흔들리지만, 발표 이후에는 추세가 하락으로 이어지는” 모습이어서
    ‘기대(소문/프리미엄) → 발표(뉴스) 이후 차익실현’ 패턴으로 읽힐 여지가 있습니다.
    다만 이 시기는 시장 전반이 성장주 조정으로 들어가던 환경과도 겹칠 수 있어, 뉴스만으로 원인을 단정하긴 어렵습니다.

덜 적용되는 구간(또는 반대처럼 보이는 구간)

  • 2025년 후반(협력 확대/출하 마커) 구간은, 차트상으로는 뉴스 이후 바로 무너진다기보다 완만한 회복 흐름이 일부 보여서 “뉴스에 팔기”가 항상 정답이라고 보긴 어렵습니다.

✅ 한 줄 정리:
“소문에 사서 뉴스에 팔아라”는 특정 이벤트에서 자주 등장하는 시장 심리지만, 뷰직스 주가 차트에서는 ‘때때로’ 보일 뿐 ‘항상’은 아닙니다.
그래서 이 문장을 전략으로 쓰려면, 차트만 보지 말고 우리가 만든 이벤트 전/후 5거래일 수익률 표(Pre/Post) 로 “진짜로 뉴스 직후 수익률이 꺾였는지”를 함께 확인하는 게 가장 깔끔합니다.

면책 고지

이벤트 마킹 및 전후 수익률 분석은 교육·정보 제공 목적이며, 투자 자문이 아닙니다. 과거 반응이 미래를 보장하지 않습니다.

类似文章