พื้นฐานของการลงทุนคือผลตอบแทน การหาผลตอบแทนถือว่าเป็นพื้นฐานของการลงทุน วันนี้เราจะมาพาทุกคนมาคำนวณผลตอบแทนด้วย Python กัน
เราเริ่มต้นจากการดึงข้อมูลตัวอย่างจาก yfinance
import yfinance as yf
start = datetime.datetime(2011, 1, 1)
end = datetime.datetime(2020, 1, 1)
df = yf.download("^SET.BK")
df
หลังจากนั้นเราก็สามารถหาผลตอบแทนได้ด้วยการใช้ .pct_change() สำหรับรายเดือนเราก็สามารถใช้คำสั่ง resample ได้ทันที
df_daily_returns = df['Adj Close'].pct_change()
df_monthly_returns = df['Adj Close'].resample('M').ffill().pct_change()
df_Year_returns = df['Adj Close'].resample('Y').ffill().pct_change()
df_daily_returns.head()
ลอง Plot กันดู
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
ax1.plot(df_monthly_returns)
ax1.set_xlabel("monthly_returns")
ax1.set_ylabel("Percent")
ax1.set_title("df_monthly_returns")
plt.show()
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
df_monthly_returns.plot.hist(bins = 4)
ax1.set_xlabel("Daily returns %")
ax1.set_ylabel("Percent")
ax1.set_title("monthly returns data")
plt.show()
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
df_monthly_returns.plot.hist(bins = 60)
ax1.set_xlabel("Daily returns %")
ax1.set_ylabel("Percent")
ax1.set_title("monthly returns data")
plt.show()
หากเราลงทุนไปหนึ่งบาทผลตอบแทนจะเป็นเท่าใหร่ก็สามารถคำนวณได้เลย
cum_returns = (df_daily_returns + 1).cumprod()
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
cum_returns.plot()
ax1.set_xlabel("Date")
ax1.set_ylabel("Growth of $1 investment")
ax1.set_title("daily cumulative returns data")
plt.show()
หรือเราอย่างเป็นเป็นฟังชั่นอย่างนี้ก็ได้
def total_return(prices):
return prices.iloc[-1] / prices.iloc[0] - 1
วิธีที่ 2
import numpy as np
def calculate_annual_return(daily_returns):
N = 252 # number of trading days in a year
# Add 1 to daily returns because we are compounding
daily_returns = np.array(daily_returns) + 1
# Calculate the geometric mean
geometric_mean = np.prod(daily_returns)**(1/len(daily_returns))
# Calculate annual return
annual_return = geometric_mean**N - 1
return annual_return
# example daily returns
daily_returns = [0.01, -0.005, 0.02, -0.01, 0.015, -0.02, 0.01, -0.005, 0.015, -0.01]
calculate_annual_return(daily_returns)
วิธีที่ 3
approach3 = prices.asfreq('BM')\
.set_index(['year', 'month'])\
.close\
.pct_change()
approach3.tail(12)
Comments