まずは、Visual Studio Codeを起動してプログラムファイルを作成する
Visual Studio Code (VS Code)を起動したら新規ファイル(*.py)を作成して行1-145をコピペします。
ここでは、Jupter NotebookのようにPythonのプログラムをセル単位で実行します。
VS Codeの場合は「#%%」から「#%%」の間がセルになります。
セルを選択したら[Ctrl + Enter」でセルのコードを実行します。
IPythonが起動されて「インタラクティブ」ウィンドウが表示されます。
「インタラクティブ」ウィンドウからはPythonのコードを入力して実行させることができます。
たとえば、「df.info()」を入力して[Shift + Enter」で実行します。
プログラムのソースコードの解説は音声で行っています。
[音声でコードの解説を聞く!]ボタンをクリックして音声が聞こえたら画面をスクロールして該当する行番号に移動してください。
これで、スマホやパソコンでストレスなくソースコードを理解することができます。
* Article.py:
# Daily returns vs Log returns article v00.py
# %%
### Import pandas and matplotlib libraries
import os
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt
from datetime import timedelta
from time import sleep
import yfinance as yf
import warnings
warnings.simplefilter('ignore')
plt.style.use('fivethirtyeight')
pd.set_option('display.max_rows', 10)
# %%
######################################################################################################################################
def load_data(symbol: str, start_date: dt.datetime , end_date: dt.datetime, period='1d', interval='1d', prepost=True) -> pd.DataFrame:
# valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
# fetch data by interval (including intraday if period < 60 days)
# valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
try:
end_date = end_date + timedelta(days=1)
start_date_str = dt.datetime.strftime(start_date, "%Y-%m-%d")
end_date_str = dt.datetime.strftime(end_date, "%Y-%m-%d")
print(f"Loading data for {symbol}: start_date={start_date_str}, end_date={end_date_str}, {period=}, {interval=}")
df = yf.download(symbol, start=start_date_str, end=end_date_str, period=period, interval=interval, prepost=prepost)
# Date Open High Low Close Adj Close Volume Symbol : interval=1d,5d,1wk,1mo,3mo
# Datetime Open High Low Close Adj Close Volume Symbol : interval=1m,2m,5m,15m,30m,60m,90m,1h
# Add symbol
df['symbol'] = symbol
# Reset index
df.reset_index(inplace=True)
# Rename Date or Datetime column name to Date
if interval in '1m,2m,5m,15m,30m,60m,90m,1h':
df.rename(columns={'Datetime': 'Date'}, inplace=True)
else: # interval=1d,5d,1wk,1mo,3mo
df.rename(columns={'Date': 'Date'}, inplace=True)
# Convert column names to lower case
df.columns = df.columns.str.lower()
return df
except:
print('Error loading data for ' + symbol)
return pd.DataFrame()
############################################
def get_data(csv_file: str) -> pd.DataFrame:
print(f"Loading data: {csv_file} ")
df = pd.read_csv(csv_file)
# date,open,high,low,close,adj close,volume,symbol
df['date'] = pd.to_datetime(df['date'])
# df['date'] = pd.to_datetime(df['date'], utc=True)
df.set_index(['date'], inplace=True)
return df
############################
# Main
############################
### Load the crypto data from Yahoo Finance
symbol = 'BTC-USD' # 'BTC-USD', 'ETH-USD', 'LTC-USD','BCH-USD','XRP-USD'
interval = '1d' # 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
csv_file = f"data/csv/log_return({symbol})_{interval}.csv" # data/csv/log_return(BTC_USD)_1d.csv
isFile = os.path.isfile(csv_file)
if not isFile:
if interval in '1m,2m,5m,15m,30m,60m,90m,1h':
end = dt.datetime.now()
start = end - timedelta(days=7)
else: # interval=1d,5d,1wk,1mo,3mo
start = dt.datetime(2014,1,1)
end = dt.datetime.now()
# load_data(symbol: str, start_date: dt.datetime , end_date: dt.datetime, period='1d', interval={'1m'|'1d'}, prepost=True) -> pd.DataFrame:
df = load_data(symbol, start, end, period='1d', interval=interval)
if df.shape[0] > 0:
df.to_csv(csv_file, index=False)
# end of if not isFile:
row_df = get_data(csv_file)
# %%
### Filter close column
df = row_df.filter(['close'])
# %%
### Method1: Daily Returns
# Calculate daily return
df['daily_return'] = df['close'].pct_change(1)
# Calculate cumulative return
df['cumulative_return'] = (1 + df['daily_return']).cumprod() - 1
# Preview the resulting dataframe
print(f"{symbol} Cumulative Return = {df.iloc[-1]['cumulative_return']:.4f}")
# print(f"{symbol} Cumulative Return = {df.iloc[-1]['cumulative_return']:.2%}")
# %%
### Method2: Log Returns
# Calculate log return
df['log_return'] = np.log(df['close'] / df['close'].shift(1))
# Calculate cumulative log return
df['cumulative_log_return'] = np.exp(df['log_return'].cumsum()) - 1
# Preview the resulting dataframe
print(f"{symbol} Cumulative Log Return = {df.iloc[-1]['cumulative_log_return']:.4f}")
# print(f"{symbol} Cumulative LOg Return = {df.iloc[-1]['cumulative_log_return']:.2%}")
# %%
### Plot Cumulative Log Returns
plt.figure(figsize=(10,5))
if interval in '1m,2m,5m,15m,30m,60m,90m,1h':
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
# plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.gcf().autofmt_xdate()
plt.title(f'Cumulative Log Returns : Interval({interval})', fontsize=18)
plt.plot(df['cumulative_log_return'], label=symbol)
plt.xticks(rotation=45)
plt.legend(loc='best')
plt.show()
図1にはVS Codeの画面が表示されています。
次のステップでは「セル」を選択して「セル」単位でPythonのコードを実行します。