Colab Example#

สามารถเข้าไปดูตัวอย่างการใช้งานบน Colab ได้ที่ link ข้างล่างนี้

https://colab.research.google.com/drive/1OQkNa85wNG12Zjofte8YUUxxEGHAyhcL?usp=sharing

ถ้าใช้ python บน Colab ต้องเอา file database ไปวางไว้ที่ Google drive ก่อนและเชื่อม Google drive ตามนี้

from google.colab import drive
drive.mount('/content/drive')

การใช้งานบน Colab ต้อง install ezyquant ใหม่ทุกครั้ง ที่เปิดขึ้นมาใช้งาน

!pip install ezyquant
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

import ezyquant as ez
from ezyquant.backtesting import Context

# ต่อ database
database_path = "/content/drive/MyDrive/"
ez.connect_sqlite(database_path + "ezyquant.db")

# ดึงข้อมูล
start_date = "2020-01-01"
end_date = "2022-05-05"
ssc = ez.SETSignalCreator(
    start_date=start_date,
    end_date=end_date,
    index_list=[],
    symbol_list=["AOT", "BBL", "PTT"],
)

# สร้าง signal
df_close = ssc.get_data("close", "daily")
ema20 = ssc.ta.ema(df_close, 20)
ema100 = ssc.ta.ema(df_close, 100)
signal_df = ema20 > ema100

# สร้าง วิธีการซื้อขาย
def backtest_algorithm(c: Context):
    if c.symbol == "AOT":
        print("Portfolio on ", c.ts)
        print("Port value = cash + total market value")
        print(c.port_value, " = ", c.cash, " + ", c.total_market_value)
        print("Current Position")
        print("Stock  Volume  Profit/loss")

    if c.volume > 0:
        print(
            c.symbol,
            c.volume,
            round(100 * (c.close_price / c.cost_price - 1), 2),
            "%",
        )

    if c.symbol == "PTT":
        print("------------------------------------------")

    if c.signal == True:
        return c.target_pct_port(0.2)
    else:
        return c.target_pct_port(0)


# ส่งเข้า Backtest
result = ez.backtest(
    signal_df=signal_df,
    backtest_algorithm=backtest_algorithm,
    start_date=start_date,
    end_date=end_date,
    initial_cash=1e6,
    pct_commission=0.25,
    pct_buy_slip=0.0,
    pct_sell_slip=0.0,
    price_match_mode="weighted",
    signal_delay_bar=1,
)

# Show Result
print("CAGR:" + str(round(result.cagr["portfolio_with_dividend"] * 100, 2)) + "%")
result.summary_df.plot.line(x="timestamp", y="port_value_with_dividend", color="grey")
print(
    "MaxDD:"
    + str(round(result.pct_maximum_drawdown["portfolio_with_dividend"] * 100, 2))
    + "%"
)
result.drawdown_percent_df.plot.area(y="portfolio_with_dividend", color="red")
print("Win rate:" + str(round(result.pct_win_per_trade * 100, 2)) + "%")
fig, ax = plt.subplots()
N, bins, patches = ax.hist(
    result.summary_trade_df["pct_return"], edgecolor="white", linewidth=1
)

for i in range(0, len(patches)):
    if patches[i].xy[0] <= 0:
        patches[i].set_facecolor("red")
    else:
        patches[i].set_facecolor("green")

return_table = (result.monthly_return_df.loc["portfolio"]).replace(np.nan, 0)
f, ax = plt.subplots(figsize=(20, 6))
sns.heatmap(
    return_table,
    annot=True,
    fmt=".1%",
    linewidths=0.5,
    ax=ax,
    cmap="PiYG",
    vmin=-0.1,
    vmax=0.1,
)

# Save ผลลัพธ์เป็น Excel
result.to_excel("/content/drive/MyDrive/.../results.xlsx")