Statistics
  • 현재 접속자 293 명
  • 오늘 방문자 3,810 명
  • 어제 방문자 4,619 명
  • 최대 방문자 11,031 명
  • 전체 방문자 1,167,219 명
  • 전체 회원수 80 명
  • 전체 게시물 2,859 개
  • 전체 댓글수 5 개
퀀텀 AI 스터디

튜터봇 양자 컴퓨팅 으로 엔비디아 백 테스팅 하는 코딩해줘

작성자 정보

  • 작성자 bryanai
  • 작성일

컨텐츠 정보

  • 조회 1,965

본문

아래는 NVIDIA(엔비디아) 주식 백테스팅을 위한 Python 코드입니다.
이 코드는 백테스팅을 수행하여 단순 이동 평균(SMA) 전략을 평가합니다.
사용된 패키지:

  • yfinance를 사용하여 NVIDIA(NVDA) 주가 데이터를 가져옵니다.
  • backtrader를 이용해 전략을 백테스트합니다.

기능:

SMA(단순 이동 평균) 교차 전략을 사용
200일 이동 평균을 기준으로 매매
매매 시뮬레이션 및 성과 분석


Python 코드 (Backtrader 이용)

!pip install backtrader


import backtrader as bt
import yfinance as yf

# 백테스트를 위한 전략 정의
class SmaCross(bt.Strategy):
    params = (("sma_period", 200),)  # 200일 이동 평균
    
    def __init__(self):
        self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.sma_period)

    def next(self):
        if self.position:  # 이미 포지션이 있다면
            if self.data.close[0] < self.sma[0]:  # 주가가 이동평균보다 낮아지면 매도
                self.close()
        else:
            if self.data.close[0] > self.sma[0]:  # 주가가 이동평균을 상회하면 매수
                self.buy()

import backtrader as bt
import yfinance as yf
import numpy as np

# ... (rest of your code)

# 백테스트 실행 함수
def run_backtest():
    cerebro = bt.Cerebro()
    cerebro.addstrategy(SmaCross)

    # NVIDIA(NVDA) 데이터 다운로드 및 Backtrader에 로드
    df = yf.download("NVDA", start="2020-01-01", end="2024-01-01")
    # Convert the columns to single-level index if they are multi-indexed
    df.columns = [' '.join(col).strip() for col in df.columns.values]  
    
    # Replace infinite or NaN values in volume with 0
    # Check if 'Volume' exists in columns before accessing it
    if 'Volume' in df.columns:
        df['Volume'] = df['Volume'].replace([np.inf, -np.inf], np.nan).fillna(0)
    else:
        # Print column names for debugging if 'Volume' is not found
        print("Column names in DataFrame:", df.columns)

    data = bt.feeds.PandasData(dataname=df)
    cerebro.adddata(data)

    # 초기 자본 설정
    cerebro.broker.set_cash(10000)
    cerebro.addsizer(bt.sizers.FixedSize, stake=10)  # 한 번에 10주씩 거래
    cerebro.broker.setcommission(commission=0.001)  # 수수료 0.1%

    print("초기 자본: {:.2f}".format(cerebro.broker.getvalue()))
    cerebro.run()
    print("최종 자본: {:.2f}".format(cerebro.broker.getvalue()))

    # 결과 시각화
    #cerebro.plot()

if __name__ == "__main__":
    run_backtest()

실행 방법

  1. pip install backtrader yfinance matplotlib 로 필요한 라이브러리 설치
  2. 위 코드를 실행하면 백테스팅 결과와 함께 매매 차트가 출력



!pip install pennylane
import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pennylane as qml
from pennylane.optimize import AdamOptimizer

# NVIDIA 주가 데이터 다운로드
def get_stock_data(ticker="NVDA", start="2020-01-01", end="2024-01-01"):
    stock = yf.download(ticker, start=start, end=end)
    stock["Returns"] = stock["Adj Close"].pct_change()
    stock.dropna(inplace=True)
    return stock

# 데이터 가져오기
data = get_stock_data()

# 데이터 정규화
X = np.array(data.index.factorize()[0], dtype=np.float32)
Y = np.array(data["Adj Close"], dtype=np.float32)
Y = (Y - np.min(Y)) / (np.max(Y) - np.min(Y))  # 정규화

# 양자 회귀 모델 설정
n_qubits = 2
dev = qml.device("default.qubit", wires=n_qubits)

@qml.qnode(dev)
def quantum_model(x, weights):
    qml.AngleEmbedding(x, wires=range(n_qubits))
    qml.StronglyEntanglingLayers(weights, wires=range(n_qubits))
    return qml.expval(qml.PauliZ(0))

# 학습 파라미터 초기화
num_layers = 3
weights = np.random.randn(num_layers, n_qubits, 3, requires_grad=True)

# 손실 함수 정의 (평균 제곱 오차)
def loss(weights, X, Y):
    predictions = np.array([quantum_model(x, weights) for x in X])
    return np.mean((predictions - Y) ** 2)

# 최적화 설정
opt = AdamOptimizer(0.01)
steps = 100

# 학습 진행
for step in range(steps):
    weights = opt.step(lambda w: loss(w, X, Y), weights)
    if step % 10 == 0:
        print(f"Step {step}: Loss = {loss(weights, X, Y):.4f}")

# 예측값 생성
predictions = np.array([quantum_model(x, weights) for x in X])

# 백테스팅 (단순 이동 평균 전략)
data["Predicted"] = predictions * (np.max(data["Adj Close"]) - np.min(data["Adj Close"])) + np.min(data["Adj Close"])
data["Signal"] = np.where(data["Predicted"].shift(1) < data["Predicted"], 1, -1)  # 상승 예측 시 매수, 하락 예측 시 매도
data["Strategy Returns"] = data["Returns"] * data["Signal"]

# 누적 수익률 비교
plt.figure(figsize=(12, 6))
plt.plot(data.index, data["Returns"].cumsum(), label="Buy & Hold", linestyle="dashed")
plt.plot(data.index, data["Strategy Returns"].cumsum(), label="Quantum Strategy", linewidth=2)
plt.legend()
plt.title("NVIDIA Quantum Backtesting")
plt.xlabel("Date")
plt.ylabel("Cumulative Returns")
plt.show()
 

관련자료

댓글 0
등록된 댓글이 없습니다.
Member Rank