-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScript2.py
More file actions
88 lines (62 loc) · 3.78 KB
/
Script2.py
File metadata and controls
88 lines (62 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
def _close_prices_dataset(ticker):
data = yf.download(ticker, start='2020-01-01', end='2024-12-31')
df = pd.DataFrame(data)
close_df = df[["Close"]].copy()
close_df.reset_index(inplace=True)
close_df.columns = close_df.columns.get_level_values(-1)
close_df.rename(columns={'Date': 'date', ticker: 'close'}, inplace=True)
close_df.columns = close_df.columns.get_level_values(-1)
close_df.rename(columns={'': 'date'}, inplace=True)
close_df["returns"] = np.log(close_df["close"]).diff()
close_df["returns"] = close_df["returns"].shift(-1)
return close_df
#data_df = close_prices_dataset(ticker='BTC-USD')
def _sma_dataset(stock_prices_dataset, long_sma = 200, short_sma = 50):
stock_prices_dataset[f"{long_sma}_day_sma"] = stock_prices_dataset["close"].rolling(long_sma).mean()
stock_prices_dataset[f"{short_sma}_day_sma"] = stock_prices_dataset["close"].rolling(short_sma).mean()
stock_prices_dataset = stock_prices_dataset.dropna()
stock_prices_dataset = stock_prices_dataset.reset_index(drop=True)
return stock_prices_dataset
#sma_df = _sma_dataset(data_df, long_sma=200, short_sma=50)
def _sma_crossover_dataset(sma_stock_prices_dataset, long_sma = 200, short_sma = 50):
sma_crossover_datalist = []
sma_stock_prices_dataset["crossover_signal"] = np.where(sma_stock_prices_dataset[f"{short_sma}_day_sma"] >= sma_stock_prices_dataset[f"{long_sma}_day_sma"], 1, 0)
sma_stock_prices_dataset["prev_crossover_signal"] = sma_stock_prices_dataset["crossover_signal"].shift(1, fill_value=0)
sma_stock_prices_dataset["buy"] = (sma_stock_prices_dataset["crossover_signal"] == 1) & (sma_stock_prices_dataset["prev_crossover_signal"] == 0)
sma_stock_prices_dataset["buy"] = sma_stock_prices_dataset["buy"] .replace({True: 1, False: 0})
sma_stock_prices_dataset["sell"] = (sma_stock_prices_dataset["crossover_signal"] == 0) & (sma_stock_prices_dataset["prev_crossover_signal"] == 1)
sma_stock_prices_dataset["sell"] = sma_stock_prices_dataset["sell"] .replace({True: 1, False: 0})
holding = False
for sma_stock_prices in sma_stock_prices_dataset.to_dict("records"):
if holding and sma_stock_prices.get("sell") == 1:
holding = False
if not holding and sma_stock_prices.get("buy") == 1:
holding = True
sma_stock_prices["hold"] = holding
sma_crossover_datalist.append(sma_stock_prices)
sma_crossover_dataset = pd.DataFrame(sma_crossover_datalist)
return sma_crossover_dataset
def _sma_returns_data(sma_crossover_dataset):
sma_crossover_dataset["algo_returns"] = sma_crossover_dataset["returns"] * sma_crossover_dataset["hold"]
sma_return = round(sma_crossover_dataset["algo_returns"].sum() * 100, 3)
buy_and_hold_return = round(sma_crossover_dataset["returns"].sum() * 100, 3)
total_entries = sma_crossover_dataset["buy"].sum()
return sma_return, buy_and_hold_return, total_entries
def sma_handler(ticker, long_sma = 200, short_sma = 50):
stock_prices_dataset = _close_prices_dataset(ticker)
start_date = stock_prices_dataset.iloc[0]['date']
sma_stock_prices_dataset = _sma_dataset(stock_prices_dataset, long_sma, short_sma)
sma_crossover_dataset = _sma_crossover_dataset(sma_stock_prices_dataset, long_sma, short_sma)
sma_return, buy_and_hold_return, total_entries = _sma_returns_data(sma_crossover_dataset)
print(f"Ticker: {ticker}")
print(f"Start Date: {start_date}")
print(f"SMA Return: {sma_return}")
print(f"Buy and Hold Return: {buy_and_hold_return}")
print(f"Total Entries: {total_entries}")
tickers = ["BTC-USD", "ETH-USD", "SOL-USD", "ADA-USD", "XRP-USD", "DOGE-USD",]
for t in tickers:
sma_handler(t)