์ฝ๊ฒ ๋ฐ๋ผ ๋ง๋๋ ํ์ด์ฌ ์ฃผ์ ์๋๋งค๋งค ์์คํ
์ฃผ์ ํฌ์์ ๊ด์ฌ์ด ์์ง๋ง ์๊ฐ์ ๋ด๊ธฐ ์ด๋ ค์ด ์ด๋ค์ ์ํด, ์๋์ผ๋ก ๋งค๋งค๋ฅผ ์งํํ๋ ์์คํ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ python์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ฃผ์ ์๋๋งค๋งค ์์คํ ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์๋ดํ๊ฒ ์ต๋๋ค.
์ค๋น ์ฌํญ
ํ์ด์ฌ ์ค์น: ์์คํ ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ๋จผ์ ํ์ด์ฌ์ ์ค์นํด์ผ ํฉ๋๋ค. Python.org์์ ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํ์ฌ ์ค์นํ์ธ์.
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น: ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด
pandas
,numpy
,matplotlib
,yfinance
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์๋์ ๊ฐ์ด pip ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์์ต๋๋ค.pip install pandas numpy matplotlib yfinance
ํธ๋ ์ด๋ฉ API: ์ค์ ๋งค๋งค๋ฅผ ํ๋ ค๋ฉด ๋ธ๋ก์ปค์ API๊ฐ ํ์ํฉ๋๋ค. Alpaca, Interactive Brokers ๋ฑ ๋ค์ํ ์ ํ์ง๊ฐ ์์ผ๋ ๋ณธ์ธ์ด ์ ํธํ๋ ๋ธ๋ก์ปค์ API๋ฅผ ์ฌ์ฉํ์ธ์.
์ฃผ์ ๋ฐ์ดํฐ ์์ง
์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ํด yfinance
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋จํ ์ฝ๋๋ก ํน์ ์ข
๋ชฉ์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
import yfinance as yf
# ํน์ ์ข
๋ชฉ์ ๋ฐ์ดํฐ ๋ค์ด๋ก๋
ticker = 'AAPL' # ์ ํ ์ฃผ์
data = yf.download(ticker, start='2020-01-01', end='2023-01-01', interval='1d')
print(data.head())
์์ ์ฝ๋๋ฅผ ํตํด ์ ํ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ ๋ต ์ค์
์ด์ ๋งค๋งค ์ ๋ต์ ์ค์ ํ ์ฐจ๋ก์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ ํ๊ท ์ ์ด์ฉํ ์ ๋ต์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์งง์ ๊ธฐ๊ฐ์ ์ด๋ ํ๊ท ์ ์ด ๊ธด ๊ธฐ๊ฐ์ ์ด๋ ํ๊ท ์ ์ ์ํฅ ๋ํํ ๋ ๋งค์ํ๊ณ , ํํฅ ๋ํํ ๋ ๋งค๋ํ๋ ์ ๋ต์ ๋๋ค.
# ์ด๋ ํ๊ท ๊ณ์ฐ
data['Short_MA'] = data['Close'].rolling(window=20).mean()
data['Long_MA'] = data['Close'].rolling(window=50).mean()
# ๋งค๋งค ์ ํธ ์์ฑ
data['Signal'] = 0
data['Signal'][20:] = np.where(data['Short_MA'][20:] > data['Long_MA'][20:], 1, 0)
data['Position'] = data['Signal'].diff()
๋งค๋งค ์คํ
์ด์ ์ค๋นํ ์ ๋ต์ ๋ฐ๋ผ ์ค์ ๋งค๋งค๋ฅผ ์คํํด๋ณด๊ฒ ์ต๋๋ค. ์ฃผ์ํ ์ ์ ์ด ์์ ์ฝ๋๋ ๊ฐ์์ ๋งค๋งค๋ฅผ ์ํ ๊ฒ์ด๊ณ , ์ค์ ๊ฑฐ๋๋ฅผ ์งํํ๋ ค๋ฉด ๋ฐ๋์ ์ถฉ๋ถํ ํ ์คํธ์ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
import requests
API_URL = 'https://api.yourbroker.com/v1/orders'
API_KEY = 'your_api_key'
headers = {'Authorization': f'Bearer {API_KEY}'}
for index, row in data.iterrows():
if row['Position'] == 1:
# ๋งค์ ์ฃผ๋ฌธ
order_data = {"symbol": ticker, "qty": 1, "side": "buy", "type": "market"}
response = requests.post(API_URL, json=order_data, headers=headers)
print(f'Buy Order placed: {response.json()}')
elif row['Position'] == -1:
# ๋งค๋ ์ฃผ๋ฌธ
order_data = {"symbol": ticker, "qty": 1, "side": "sell", "type": "market"}
response = requests.post(API_URL, json=order_data, headers=headers)
print(f'Sell Order placed: {response.json()}')
๊ฒฐ๋ก
์ฃผ์ ์๋๋งค๋งค ์์คํ ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ์๊ฐ๋ณด๋ค ๊ฐ๋จํฉ๋๋ค. ์์ ์์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณธ์ธ๋ง์ ์ ๋ต์ ์ถ๊ฐํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฃผ์ ๊ฑฐ๋๋ ๋์ ๋ฆฌ์คํฌ๊ฐ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ ๊ทผํด์ผ ํฉ๋๋ค. ์ ๋ต์ ๊ฐ์ ํ๊ณ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ ์คํธํด๋ณด๋ฉฐ ์ฌ๋ฌ๋ถ๋ง์ ์ฑ๊ณต์ ์ธ ์๋๋งค๋งค ์์คํ ์ ๋ง๋ค์ด ๋ณด์ธ์!
์ด์ ์ฌ๋ฌ๋ถ๋ ์ง์ ํ์ด์ฌ์ผ๋ก ์ฃผ์ ์๋๋งค๋งค ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ต๋๋ค. ํฌ์ ์ํ์ ๋ง์ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.