제퍼넷 로고

금융에서의 Python: Jupyter Notebook 내 실시간 데이터 스트리밍 – KDnuggets

시간

금융 분야의 Python: Jupyter Notebook 내 실시간 데이터 스트리밍
 

이 블로그에서는 즐겨 사용하는 도구인 Jupyter Notebook을 사용하여 실시간 데이터 스트림을 실시간으로 시각화하는 방법을 알아봅니다. 

대부분의 프로젝트에서 Jupyter 노트북 내의 동적 차트는 수동 업데이트가 필요합니다. 예를 들어, 차트를 업데이트하기 위해 새 데이터를 가져오려면 다시 로드를 눌러야 할 수도 있습니다. 이는 금융을 포함하여 빠르게 변화하는 산업에는 적합하지 않습니다. 사용자가 해당 인스턴스에서 다시 로드를 누르지 않았기 때문에 중요한 구매 표시나 사기 경고를 놓치는 것을 고려하십시오.

여기에서는 Jupyter Notebook에서 수동 업데이트에서 스트리밍 또는 실시간 방법으로 전환하여 프로젝트를 보다 효율적이고 반응적으로 만드는 방법을 보여줍니다.

다루는 내용:

  • 실시간 시각화: 눈앞에서 데이터가 매 순간 진화하는 모습을 지켜보며 데이터에 생명을 불어넣는 방법을 배우게 됩니다.
  • Jupyter 노트북 마스터리: 정적 데이터 분석뿐만 아니라 동적 스트리밍 데이터에 대해서도 Jupyter Notebook의 모든 기능을 활용하세요.
  • Quant Finance의 Python 사용 사례: 금융에서 널리 사용되는 실제 데이터를 구현하여 실용적인 금융 애플리케이션을 살펴보세요.
  • 스트림 데이터 처리: 오늘날 빠르게 변화하는 데이터 세계에서 점점 더 중요해지고 있는 기술인 실시간 데이터 처리의 기초와 이점을 이해합니다.

이 블로그가 끝나면 Jupyter Notebook 내에서 아래와 같은 유사한 실시간 시각화를 구축하는 방법을 알게 될 것입니다.

 

금융 분야의 Python: Jupyter Notebook 내 실시간 데이터 스트리밍

우리 프로젝트의 핵심에는 스트림 처리 개념이 있습니다. 

간단히 말해서, 스트림 처리는 데이터가 생성되는 즉시 실시간으로 처리하고 분석하는 것입니다. 출퇴근 시간 운전 중에 실시간으로 교통 정보를 확인하고 즉각적이고 효율적인 경로 변경이 가능한 Google 지도와 같다고 생각해보세요.

흥미롭게도 이번 Forbes의 Goldman Sachs CIO에 따르면 팟 캐스트, 스트림 또는 실시간 데이터 처리로 전환하는 것은 우리가 향하고 있는 중요한 추세 중 하나입니다. 

실시간 데이터 처리 능력을 Jupyter Notebook의 친숙하고 대화형 환경과 결합하는 것입니다. 

그 외에도 Jupyter 노트북은 컨테이너화된 환경에서 잘 작동합니다. 그러므로 우리 프로젝트는 단지 로컬 컴퓨터에만 머물지 않습니다. 동료의 노트북부터 클라우드 서버까지 어디에서나 원활하게 실행할 수 있습니다.

금융에서는 사기 탐지든 거래든 매 순간이 중요합니다. 이것이 바로 스트림 데이터 처리가 필수적인 이유입니다. 여기에 스포트라이트가 켜졌어 볼링 밴드, 금융 거래에 도움이 되는 도구입니다. 이 도구는 다음으로 구성됩니다.

  • 미들 밴드: 이는 지난 20개 기간(예: 고주파 분석의 경우 20분) 동안 평균 주가를 계산하는 20개 기간 이동 평균으로, 최근 가격 추세에 대한 스냅샷을 제공합니다.
  • 외부 밴드: 중간 밴드 위와 아래에 2개의 표준 편차가 있는 이 그래프는 시장 변동성을 나타냅니다. 밴드가 넓을수록 변동성이 크고, 밴드가 좁을수록 변동성이 적음을 나타냅니다.

 

금융 분야의 Python: Jupyter Notebook 내 실시간 데이터 스트리밍
 

볼린저 밴드에서는 이동 평균 가격이 상단 밴드에 닿거나 이를 초과할 때(매도 신호, 종종 빨간색으로 표시됨) 잠재적인 과매수 상태가 신호되고, 가격이 하단 밴드 아래로 하락할 때(매수 신호가 표시됨) 과매도 상태가 표시됩니다. , 일반적으로 녹색으로 표시됨).

알고 트레이더들은 일반적으로 볼린저 밴드를 다른 기술 지표와 결합합니다. 

여기에서는 거래량을 통합하여 볼린저 밴드를 생성하는 동안 필수적인 조정을 수행했습니다. 전통적으로 볼린저 밴드는 거래량을 고려하지 않고 가격 데이터만을 기준으로 계산됩니다.

따라서 우리는 VWAP ± 2 × VWSTD 거리에 볼린저 밴드를 표시했습니다. 

  • VWAP: A 1분 거래량 가중 평균 가격 보다 볼륨에 민감한 관점을 위해.
  • VWSTD: 집중된, 20분 표준편차즉, 시장 변동성의 척도입니다.

기술 구현:

  • 우리는 일시적인 것을 사용합니다 슬라이딩 윈도우 ('pw.temporal.sliding')을 사용하면 실시간으로 데이터 위로 돋보기를 움직이는 것과 유사하게 20분 단위로 데이터를 분석할 수 있습니다.
  • 우리는 고용 감속기 ('pw.reducers')는 각 창 내에서 데이터를 처리하여 각 창에 대한 특정 결과, 즉 이 경우 표준 편차를 생성합니다.
  • 다각형.io: 실시간 및 과거 시장 데이터 제공업체입니다. 라이브 데이터에 API를 사용할 수 있지만, 이 데모에서는 일부 데이터를 CSV 파일에 미리 저장해 두었으므로 API 키 없이도 쉽게 따라할 수 있습니다.
  • 통로 : 빠른 데이터 처리를 위한 오픈 소스 Python 프레임워크입니다. 배치(정적) 데이터와 스트리밍(실시간) 데이터를 모두 처리합니다. 
  • 보케 : 동적 시각화를 만드는 데 이상적인 Bokeh는 매력적인 대화형 차트를 통해 스트리밍 데이터에 생기를 불어넣습니다.
  • 패널: Bokeh와 함께 작업하여 새로운 데이터 스트림이 들어올 때 시각화를 업데이트하는 실시간 대시보드 기능으로 프로젝트를 향상합니다.

여기에는 6단계가 포함됩니다.

  1. 관련 프레임워크에 대해 pip 설치를 수행하고 관련 라이브러리를 가져옵니다.
  2. 샘플 데이터를 가져오는 중
  3. 계산을 위한 데이터 소스 설정
  4. 볼린저 밴드에 필수적인 통계 계산
  5. 보케(Bokeh)와 패널을 활용한 대시보드 생성
  6. 실행 명령을 치면

1. 가져오기 및 설정

먼저 필요한 구성요소를 빠르게 설치해 보겠습니다.

%%capture --no-display
!pip install pathway

 

필요한 라이브러리를 가져오는 것부터 시작하세요. 이러한 라이브러리는 데이터 처리, 시각화 및 대화형 대시보드 구축에 도움이 됩니다.

# Importing libraries for data processing, visualization, and dashboard creation

import datetime
import bokeh.models
import bokeh.plotting
import panel
import pathway as pw

2. 샘플 데이터 가져오기

다음으로 GitHub에서 샘플 데이터를 다운로드합니다. 이 단계는 시각화를 위해 데이터에 액세스하는 데 중요합니다. 여기에서는 Apple Inc(AAPL) 주가를 가져왔습니다.

# Command to download the sample APPLE INC stock prices extracted via Polygon API and stored in a CSV for ease of review of this notebook.

%%capture --no-display
!wget -nc https://gist.githubusercontent.com/janchorowski/e351af72ecd8d206a34763a428826ab7/raw/ticker.csv

 

참고 : 이 튜토리얼에서는 게시된 쇼케이스를 활용합니다. 여기에서 지금 확인해 보세요.

3. 데이터 소스 설정

CSV 파일을 사용하여 스트리밍 데이터 소스를 만듭니다. 이는 라이브 데이터 스트림을 시뮬레이션하여 처음으로 프로젝트를 구축하는 동안 API 키 없이 실시간 데이터로 작업할 수 있는 실용적인 방법을 제공합니다. 

# Creating a streaming data source from a CSV file

fname = "ticker.csv"
schema = pw.schema_from_csv(fname)
data = pw.demo.replay_csv(fname, schema=schema, input_rate=1000)

# Uncommenting the line below will override the data table defined above and switch the data source to static mode, which is helpful for initial testing
# data = pw.io.csv.read(fname, schema=schema, mode="static")

# Parsing the timestamps in the data

data = data.with_columns(t=data.t.dt.utc_from_timestamp(unit="ms"))

 

참고 : 즉시 데이터 처리가 발생하지 않지만 마지막에 실행 명령을 누르면 발생합니다.

4. 볼린저 밴드에 필수적인 통계 계산

여기서는 위에서 논의한 거래 알고리즘을 간략하게 구축하겠습니다. 우리는 Apple Inc. 주식 가격의 더미 스트림을 가지고 있습니다. 이제 볼린저밴드를 만들기 위해 

  1. 가중 20분 표준편차(VWSTD)를 계산하겠습니다.
  2. 1분 가중 이동 평균 가격(VWAP)
  3. 위의 두 가지를 결합하십시오.
# Calculating the 20-minute rolling statistics for Bollinger Bands


minute_20_stats = (
    data.windowby(
        pw.this.t,
        window=pw.temporal.sliding(
            hop=datetime.timedelta(minutes=1),
            duration=datetime.timedelta(minutes=20),
        ),
        behavior=pw.temporal.exactly_once_behavior(),
        instance=pw.this.ticker,
    )
    .reduce(
        ticker=pw.this._pw_instance,
        t=pw.this._pw_window_end,
        volume=pw.reducers.sum(pw.this.volume),
        transact_total=pw.reducers.sum(pw.this.volume * pw.this.vwap),
        transact_total2=pw.reducers.sum(pw.this.volume * pw.this.vwap**2),
    )
    .with_columns(vwap=pw.this.transact_total / pw.this.volume)
    .with_columns(
        vwstd=(pw.this.transact_total2 / pw.this.volume - pw.this.vwap**2)
        ** 0.5
    )
    .with_columns(
        bollinger_upper=pw.this.vwap + 2 * pw.this.vwstd,
        bollinger_lower=pw.this.vwap - 2 * pw.this.vwstd,
    )
)
# Computing the 1-minute rolling statistics

minute_1_stats = (
    data.windowby(
        pw.this.t,
        window=pw.temporal.tumbling(datetime.timedelta(minutes=1)),
        behavior=pw.temporal.exactly_once_behavior(),
        instance=pw.this.ticker,
    )
    .reduce(
        ticker=pw.this._pw_instance,
        t=pw.this._pw_window_end,
        volume=pw.reducers.sum(pw.this.volume),
        transact_total=pw.reducers.sum(pw.this.volume * pw.this.vwap),
    )
    .with_columns(vwap=pw.this.transact_total / pw.this.volume)
)
# Joining the 1-minute and 20-minute statistics for comprehensive analysis

joint_stats = (
    minute_1_stats.join(
        minute_20_stats,
        pw.left.t == pw.right.t,
        pw.left.ticker == pw.right.ticker,
    )
    .select(
        *pw.left,
        bollinger_lower=pw.right.bollinger_lower,
        bollinger_upper=pw.right.bollinger_upper
    )
    .with_columns(
        is_alert=(pw.this.volume > 10000)
        & (
            (pw.this.vwap > pw.this.bollinger_upper)
            | (pw.this.vwap  pw.this.bollinger_lower)
        )
    )
    .with_columns(
        action=pw.if_else(
            pw.this.is_alert,
            pw.if_else(
                pw.this.vwap > pw.this.bollinger_upper, "sell", "buy"
            ),
            "hold",
        )
    )
)
alerts = joint_stats.filter(pw.this.is_alert)

 

수첩을 확인하실 수 있습니다 여기에서 지금 확인해 보세요. 계산에 대한 더 깊은 이해를 위해. 

5. 대시보드 생성

이제 Bokeh 플롯과 패널 테이블 시각화를 통해 분석을 생생하게 표현할 차례입니다. 

# Function to create the statistics plot


def stats_plotter(src):
    actions = ["buy", "sell", "hold"]
    color_map = bokeh.models.CategoricalColorMapper(
        factors=actions, palette=("#00ff00", "#ff0000", "#00000000")
    )

    fig = bokeh.plotting.figure(
        height=400,
        width=600,
        title="20 minutes Bollinger bands with last 1 minute average",
        x_axis_type="datetime",
        y_range=(188.5, 191),
    )
    fig.line("t", "vwap", source=src)
    band = bokeh.models.Band(
        base="t",
        lower="bollinger_lower",
        upper="bollinger_upper",
        source=src,
        fill_alpha=0.3,
        fill_color="gray",
        line_color="black",
    )
    fig.scatter(
        "t",
        "vwap",
        color={"field": "action", "transform": color_map},
        size=10,
        marker="circle",
        source=src,
    )
    fig.add_layout(band)
    return fig


# Combining the plot and table in a Panel Row

viz = panel.Row(
    joint_stats.plot(stats_plotter, sorting_col="t"),
    alerts.select(
        pw.this.ticker, pw.this.t, pw.this.vwap, pw.this.action
    ).show(include_id=False, sorters=[{"field": "t", "dir": "desc"}]),
)
viz

 

이 셀을 실행하면 플롯과 테이블에 대한 자리 표시자 컨테이너가 노트북에 생성됩니다. 계산이 시작되면 실시간 데이터로 채워집니다. 

6. 계산 실행

모든 준비가 완료되었으며 이제 데이터 처리 엔진을 실행할 차례입니다.

# Command to start the Pathway data processing engine
%%capture --no-display
pw.run()

 

대시보드가 ​​실시간으로 업데이트됨에 따라 볼린저 밴드가 어떻게 행동을 촉발하는지 볼 수 있습니다. 녹색은 매수, 빨간색은 매도이며 종종 약간 더 높은 가격에 표시됩니다. 

참고 : 위젯이 초기화되고 표시되면 pw.run()을 수동으로 실행해야 합니다. 이 GitHub 문제에서 자세한 내용을 확인할 수 있습니다. 여기에서 지금 확인해 보세요..

이 블로그에서는 볼린저 밴드를 이해하고 Jupyter Notebook에서 실시간 금융 데이터를 시각화하는 과정을 안내합니다. 우리는 볼린저 밴드(Bollinger Bands)와 오픈 소스 Python 도구를 혼합하여 라이브 데이터 스트림을 실행 가능한 통찰력으로 변환하는 방법을 보여주었습니다.

이 튜토리얼은 데이터 가져오기부터 대화형 대시보드 작성에 이르기까지 엔드투엔드 솔루션을 위해 오픈 소스를 활용하여 실시간 재무 데이터 분석의 실제 사례를 제공합니다. 다음과 같은 방법으로 비슷한 프로젝트를 만들 수 있습니다.

  • Yahoo Finance, Polygon, Kraken 등과 같은 API에서 실시간 주가를 가져와 선택한 주식에 대해 이 작업을 수행합니다.
  • 좋아하는 주식, ETF 등의 그룹에 대해 이 작업을 수행합니다. 
  • 볼린저 밴드 외에 다른 거래 도구를 활용합니다.

이러한 도구를 Jupyter Notebook 내의 실시간 데이터와 통합하면 시장을 분석할 뿐만 아니라 시장이 전개되는 과정을 경험할 수 있습니다. 

즐거운 스트리밍!
 
 

무디트 스리바스타바 Pathway에서 근무 그 전에는 AI Planet의 창립 멤버였으며 LLM 및 실시간 ML 분야에서 활발한 커뮤니티 구축자로 활동하고 있습니다.

spot_img

최신 인텔리전스

spot_img