test > 자유게시판

본문 바로가기
사이트 내 전체검색

자유게시판

test

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 61회 작성일 24-04-08 16:17

본문

# 필요한 라이브러리와 모듈을 임포트합니다.
import finplot as fplt
from functools import lru_cache
from PyQt6.QtWidgets import QApplication, QGridLayout, QGraphicsView, QComboBox, QLabel
from threading import Thread
import yfinance as yf

# PyQt 애플리케이션을 초기화합니다.
app = QApplication([])
# 메인 윈도우를 생성합니다.
win = QGraphicsView()
win.setWindowTitle('TradingView wannabe') # 윈도우 타이틀 설정
layout = QGridLayout() # 그리드 레이아웃을 사용합니다.
win.setLayout(layout)
win.resize(600, 500) # 윈도우 크기 설정

# 콤보박스를 생성하고, 주식 심볼을 추가합니다.
combo = QComboBox()
combo.setEditable(True)
[combo.addItem(i) for i in 'AMRK META REVG TSLA WMT CT=F GC=F ^GSPC ^FTSE ^N225 EURUSD=X ETH-USD'.split()]
layout.addWidget(combo, 0, 0, 1, 1) # 콤보박스를 레이아웃에 추가합니다.
# 정보를 표시할 라벨을 생성합니다.
info = QLabel()
layout.addWidget(info, 0, 1, 1, 1) # 라벨을 레이아웃에 추가합니다.

# finplot 차트를 생성하고 레이아웃에 추가합니다.
ax = fplt.create_plot(init_zoom_periods=100)
win.axs = [ax] # finplot이 요구하는 프로퍼티 설정
axo = ax.overlay() # 차트 위에 오버레이를 생성합니다.
layout.addWidget(ax.vb.win, 1, 0, 1, 2) # 차트를 레이아웃에 추가합니다.

# yfinance로부터 주식 데이터를 다운로드하는 함수입니다. LRU 캐시를 사용하여 최적화합니다.
@lru_cache(maxsize=15)
def download(symbol):
    return yf.download(symbol, '2019-01-01')

# 주식의 이름을 가져오는 함수입니다. LRU 캐시를 사용하여 최적화합니다.
@lru_cache(maxsize=100)
def get_name(symbol):
    return yf.Ticker(symbol).info.get('shortName') or symbol

# 콤보박스에서 선택된 주식의 차트를 업데이트하는 함수입니다.
def update(txt):
    df = download(txt) # 주식 데이터를 다운로드합니다.
    if len(df) < 20: # 데이터가 충분하지 않은 경우 함수를 종료합니다.
        return
    info.setText('Loading symbol name...') # 라벨에 메시지를 표시합니다.
    price = df['Open Close High Low'.split()] # 가격 데이터를 추출합니다.
    ma20 = df.Close.rolling(20).mean() # 20일 이동 평균선을 계산합니다.
    ma50 = df.Close.rolling(50).mean() # 50일 이동 평균선을 계산합니다.
    volume = df['Open Close Volume'.split()] # 거래량 데이터를 추출합니다.
    ax.reset() # 이전에 표시된 차트를 리셋합니다.
    axo.reset() # 오버레이를 리셋합니다.
    fplt.candlestick_ochl(price) # 캔들스틱 차트를 그립니다.
    fplt.plot(ma20, legend='MA-20') # 20일 이동 평균선을 그립니다.
    fplt.plot(ma50, legend='MA-50') # 50일 이동 평균선을 그립니다.
    fplt.volume_ocv(volume, ax=axo) # 거래량 차트를 오버레이에 그립니다.
    fplt.refresh() # 차트를 새로고침합니다.
    Thread(target=lambda: info.setText(get_name(txt))).start() # 주식 이름을 비동기적으로 불러와 라벨에 표시합니다.

# 콤보박스에서 선택된 텍스트가 변경될 때마다 update 함수를 호출합니다.
combo.currentTextChanged.connect(update)
update(combo.currentText()) # 초기 텍스트로 차트를 업데이트합니다.

# 차트를 준비하고 메인 윈도우를 표시합니다.
fplt.show(qt_exec=False)
win.show()
app.exec() # 이벤트 루프를 시작합니다.
  • 이전글test 24.04.08

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

공지사항

  • 게시물이 없습니다.

접속자집계

오늘
101
어제
130
최대
136
전체
1,507
Copyright © 소유하신 도메인. All rights reserved.