top of page

การคำนวณผลตอบแทนการลงทุนด้วย Python

พื้นฐานของการลงทุนคือผลตอบแทน การหาผลตอบแทนถือว่าเป็นพื้นฐานของการลงทุน วันนี้เราจะมาพาทุกคนมาคำนวณผลตอบแทนด้วย 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)
















ดู 68 ครั้ง0 ความคิดเห็น

โพสต์ล่าสุด

ดูทั้งหมด

Portfolio Insurance

Comments


bottom of page