์ฝ์คํผ200. 2011-01-01 ~ 2021-12-31. ์ ์ ยฑ80. ๋ด์ค๋จ์ด(3000, -3000)
# 2009๋
7์ 15์ผ๋ถํฐ
# 2023๋
9์ 29์ผ๊น์ง
# ๋ถ์ํ ์ ์์!
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def createDataFrame(stock, start, end):
df = stock.history(start=start, end=end)
df["Change"] = df["Close"].pct_change() # ์ ๋ ๋๋น ๋ณํ์จ
df.index = pd.to_datetime(df.index).strftime("%Y-%m-%d") # ๋ ์ง ํ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ธฐ
df2 = pd.read_csv("/Users/ryujonghyeok/Jonghyeok/Sejong/SAI/แแ
กแ
แ
ญแแ
ฉแแ
ณแทแแ
ตแธ2.csv") # ์งํ ๋ฐ์ดํฐ
df = pd.merge(df, df2, on="Date")
df.set_index("Date", inplace=True)
return df
def buy(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ):
if ์ฃผ์๋ณด์ ๋ == 0:
์ฃผ์๋ณด์ ๋ = ํ๊ธ๋ณด์ ๋ // ํ์ฌ์ฃผ๊ฐ
ํ๊ธ๋ณด์ ๋ -= ์ฃผ์๋ณด์ ๋ * ํ์ฌ์ฃผ๊ฐ
# print(f"Bought at {ํ์ฌ์ฃผ๊ฐ} with {์ฃผ์๋ณด์ ๋} stocks")
return ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋
def sell(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ):
if ์ฃผ์๋ณด์ ๋ > 0:
ํ๊ธ๋ณด์ ๋ += ์ฃผ์๋ณด์ ๋ * ํ์ฌ์ฃผ๊ฐ
์ฃผ์๋ณด์ ๋ = 0
# print(f"Sold at {ํ์ฌ์ฃผ๊ฐ} with {์ฃผ์๋ณด์ ๋} stocks")
return ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋
def total_asset(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ):
return ํ๊ธ๋ณด์ ๋ + ์ฃผ์๋ณด์ ๋ * ํ์ฌ์ฃผ๊ฐ
def score_calculate(i):
bullishWords = {'rally': 0.2074, 'rise': 0.1983, 'high': 0.1416, 'gain': 0.0460, 'up': 0.0678, 'recovery': 0.0278, 'soar': 0.0056, 'bull': 0.0010, 'boom': 0.0010} # ์์น ๐ค
bearishWords = {'fall': 0.1103, 'low': 0.0597, 'drop': 0.0465, 'down': 0.0288, 'decline': 0.0243, 'sink': 0.0137, 'recession': 0.0101, 'loss': 0.0061, 'bear': 0.0040} # ํ๋ฝ ๐ค
๋ฌผ๊ฐ์ง์ = df.iloc[i]["๋ฌผ๊ฐ์ง์"]
์ฝ๊ธ๋ฆฌ = df.iloc[i]["์ฝ๊ธ๋ฆฌ"]
ํ์ฌ์ฑ๊ธ๋ฆฌ = df.iloc[i]["ํ์ฌ์ฑ"]
์ฃผํ๋งค๋งค์ง์ = df.iloc[i]["์ฃผํ์ง์"]
๊ตญ๋ฏผ์ด์๋ = df.iloc[i]["GNI"]
๋ด์ค = df.iloc[i]["Title"]
score = (-51.2)*๋ฌผ๊ฐ์ง์ + 306.67*์ฝ๊ธ๋ฆฌ + 40.01*ํ์ฌ์ฑ๊ธ๋ฆฌ + 26.84*์ฃผํ๋งค๋งค์ง์ + 4.35*๊ตญ๋ฏผ์ด์๋ # ๐ค
for word in ๋ด์ค.split():
if word in bullishWords:
score += bullishWords[word] * 3000 # ๐ค
elif word in bearishWords:
score -= bearishWords[word] * 3000 # ๐ค
return score
buyAndHold_plt = []
# ์์์์ ์ ๋งค์ ํ ์ข
๋ฃ์์ ์ ๋งค๋
def strategy_buyAndHold(df):
global buyAndHold_plt
ํ๊ธ๋ณด์ ๋ = 1000000
์ฃผ์๋ณด์ ๋ = 0
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = buy(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, df.iloc[0].Close)
buyAndHold_plt = []
for i in range(1, len(df)-1):
buyAndHold_plt.append(total_asset(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, df.iloc[i].Close))
ํ๊ธ๋ณด์ ๋ += ์ฃผ์๋ณด์ ๋ * df.iloc[-1].Close
print(f"๊ทธ๋ฅ ๊ฐ๋งํ - ํ๊ธ๋ณด์ ๋: {ํ๊ธ๋ณด์ ๋:.2f}, profit: {(ํ๊ธ๋ณด์ ๋-1000000)/1000000*100:.2f}%")
difference_plt = []
# ์ต๊ณ ์ ๋๋น ์ผ์ ๋น์จ ํ๋ฝํ๋ฉด ๋งค๋, ์ต์ ์ ๋๋น ์ผ์ ๋น์จ ์์นํ๋ฉด ๋งค์
def strategy_difference(df):
global difference_plt
ํ๊ธ๋ณด์ ๋ = 1000000
์ฃผ์๋ณด์ ๋ = 0
dif1 = 0.36 # ์ผ์ ๋น์จ ํ๋ฝํ๋ ์ ๋ ๐ค
dif2 = 0.02 # ์ผ์ ๋น์จ ์์นํ๋ ์ ๋ ๐ค
minimum = float('inf')
maximum = float('-inf')
for i in range(2, len(df)):
price = df.iloc[i].Close
if price > maximum:
maximum = price
elif price < minimum:
minimum = price
if ์ฃผ์๋ณด์ ๋ > 0 and price < maximum * (1-dif1):
#print(f"Sold at {price(hist, i)}")
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = sell(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, price)
maximum = float('-inf')
elif ์ฃผ์๋ณด์ ๋ == 0 and price > minimum * (1+dif2):
#print(f"Bought at {price(hist, i)}")
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = buy(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, price)
minimum = float('inf')
difference_plt.append(total_asset(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, price))
ํ๊ธ๋ณด์ ๋ += ์ฃผ์๋ณด์ ๋ * df.iloc[-1].Close
์ฃผ์๋ณด์ ๋ = 0
print(f"๋ณํ์จ ๋น๊ต - ํ๊ธ๋ณด์ ๋: {ํ๊ธ๋ณด์ ๋:.2f}, profit: {(ํ๊ธ๋ณด์ ๋-1000000)/1000000*100:.2f}%")
score_plt = []
# ๋ณตํฉ์ ์ธ ์์๋ฅผ ๋ถ์ํ์ฌ ์ผ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋งค์ ๋ฐ ๋งค๋ ๋ฐ๋ณต
def strategy_score(df):
global score_plt
ํ๊ธ๋ณด์ ๋ = 1000000
์ฃผ์๋ณด์ ๋ = 0
#ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = buy(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, df.iloc[0].Close)
for i in range(len(df)):
# ์ ์ ๊ณ์ฐํ๊ธฐ
score = score_calculate(i)
if i % 500 == 0: # ๋๋ต์ ์ธ 'score'๋ฅผ ํ์
ํ๊ธฐ ์ํด 30์ผ๋ง๋ค 'score' ์ถ๋ ฅ
print(f"{i}์ผ์ฐจ ์ ์: {score}")
ํ์ฌ์ฃผ๊ฐ = df.iloc[i].Close
# ์ ์๊ฐ ์ผ์ ๊ธฐ์ค๋ณด๋ค ํด ๋ ๋งค์ํ๊ธฐ
if score > 80:
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = buy(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ)
# ์ ์๊ฐ ์ผ์ ๊ธฐ์ค๋ณด๋ค ์์ ๋ ๋งค๋ํ๊ธฐ
elif score < -80:
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = sell(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ)
score_plt.append(total_asset(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, ํ์ฌ์ฃผ๊ฐ))
ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋ = sell(ํ๊ธ๋ณด์ ๋, ์ฃผ์๋ณด์ ๋, df.iloc[-1].Close)
print(f"๊ฐ์ค์น ๊ณ์ฐ - ํ๊ธ๋ณด์ ๋: {ํ๊ธ๋ณด์ ๋:.2f} profit: {(ํ๊ธ๋ณด์ ๋-1000000)/1000000*100:.2f}%")
# Stock ์ ์ํ๊ธฐ ๐ค
stock = yf.Ticker("^KS200")
# ๋ฐ์ดํฐํ๋ ์ ๋ง๋ค๊ธฐ ๐ค
start="2010-01-01"
end="2022-12-31"
df = createDataFrame(stock, start, end)
strategy_buyAndHold(df)
strategy_difference(df)
strategy_score(df)
# ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(figsize=(20, 10))
plt.plot(df.index[:-2], buyAndHold_plt, label="buyAndHold", color='grey')
plt.plot(df.index[:-2], difference_plt, label="difference", color='black')
plt.plot(df.index, score_plt, label="score", color='red')
plt.legend()
plt.show()