0Pricing
AI Agents · บทเรียน

เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน

คำนวณผลตอบแทน อัตราส่วน Sharpe และวิเคราะห์การลดลงของมูลค่าผ่านโค้ดที่เอเจนต์เรียกใช้

เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

การวิเคราะห์พอร์ตโฟลิโอในรูปแบบเครื่องมือของเอเจนต์

เอเจนต์วิเคราะห์ทางการเงินจำเป็นต้องมีชุดเครื่องมือคำนวณที่ LLM เรียกใช้ได้ ได้แก่ ผลตอบแทน ตัวชี้วัดความเสี่ยง สหสัมพันธ์ และคำแนะนำการปรับสัดส่วน แต่ละเครื่องมือเป็นฟังก์ชัน Python ที่มีลายเซ็นชัดเจนและส่งคืน JSON ที่มีโครงสร้าง ซึ่งเอเจนต์สามารถนำไปประมวลเหตุผลได้

การคำนวณผลตอบแทนเป็นเปอร์เซ็นต์

นี่คือพื้นฐานของการวิเคราะห์พอร์ตโฟลิโอ pct_change() คำนวณผลตอบแทนรายวันเมื่อเทียบกับวันก่อนหน้า จากนั้นจึงใช้ผลลัพธ์เหล่านี้คำนวณผลตอบแทนสะสมตลอดช่วงเวลาที่วิเคราะห์

import pandas as pd
import yfinance as yf

def calculate_returns(ticker: str, period: str = '1y') -> dict:
    hist = yf.Ticker(ticker).history(period=period)['Close']
    if hist.empty:
        return {'error': f'No data for {ticker}'}

    daily_returns = hist.pct_change().dropna()
    cumulative    = (1 + daily_returns).cumprod() - 1

    return {
        'ticker':            ticker,
        'period':            period,
        'total_return_pct':  round(float(cumulative.iloc[-1]) * 100, 2),
        'avg_daily_return':  round(float(daily_returns.mean()) * 100, 4),
        'best_day_pct':      round(float(daily_returns.max()) * 100, 2),
        'worst_day_pct':     round(float(daily_returns.min()) * 100, 2)
    }

อัตราส่วน Sharpe

อัตราส่วน Sharpe ใช้วัดผลตอบแทนที่ปรับด้วยความเสี่ยง โดยวัดว่าคุณได้รับผลตอบแทนส่วนเกินมากเพียงใดต่อความเสี่ยงหนึ่งหน่วย (ความผันผวน) ค่ายิ่งสูงยิ่งดี ค่า Sharpe สูงกว่า 1.0 ถือว่าดี และสูงกว่า 2.0 ถือว่ายอดเยี่ยม

import numpy as np
import yfinance as yf

def sharpe_ratio(ticker: str, period: str = '1y',
                 risk_free_annual: float = 0.05) -> dict:
    hist = yf.Ticker(ticker).history(period=period)['Close']
    daily_returns = hist.pct_change().dropna()

    risk_free_daily = risk_free_annual / 252  # annualized to daily
    excess_returns  = daily_returns - risk_free_daily

    if daily_returns.std() == 0:
        return {'error': 'Zero volatility — cannot compute Sharpe ratio'}

    sharpe = float(excess_returns.mean() / excess_returns.std() * np.sqrt(252))
    return {
        'ticker': ticker,
        'sharpe_ratio': round(sharpe, 3),
        'interpretation': 'excellent' if sharpe > 2 else 'good' if sharpe > 1 else 'acceptable' if sharpe > 0 else 'poor'
    }

การลดลงสูงสุดจากจุดสูงสุด

การลดลงสูงสุดจากจุดสูงสุด (MDD) คือการลดลงครั้งใหญ่ที่สุดของมูลค่าพอร์ตโฟลิโอจากจุดสูงสุดถึงจุดต่ำสุด ตัวชี้วัดนี้แสดงถึงการขาดทุนในกรณีเลวร้ายที่สุดที่นักลงทุนอาจประสบ หากซื้อที่จุดสูงสุดและขายที่จุดต่ำสุด

import yfinance as yf
import numpy as np

def max_drawdown(ticker: str, period: str = '1y') -> dict:
    hist = yf.Ticker(ticker).history(period=period)['Close']
    if hist.empty:
        return {'error': 'No data'}

    rolling_max = hist.cummax()
    drawdown    = (hist - rolling_max) / rolling_max
    mdd         = float(drawdown.min())
    mdd_date    = str(drawdown.idxmin().date())

    return {
        'ticker':           ticker,
        'max_drawdown_pct': round(mdd * 100, 2),
        'drawdown_date':    mdd_date,
        'interpretation':   'severe' if mdd < -0.30 else 'moderate' if mdd < -0.15 else 'mild'
    }

เมทริกซ์สหสัมพันธ์

เมทริกซ์สหสัมพันธ์แสดงให้เห็นว่าสินทรัพย์ต่าง ๆ เคลื่อนไหวไปด้วยกันอย่างไร สหสัมพันธ์ที่ต่ำหรือเป็นลบระหว่างสินทรัพย์หมายถึงประโยชน์จากการกระจายความเสี่ยง หากสินทรัพย์หนึ่งลดลง อีกสินทรัพย์หนึ่งอาจไม่ลดลงตาม ข้อมูลนี้ช่วยชี้แนวทางการเลือกสินทรัพย์และการตัดสินใจปรับสัดส่วน

import pandas as pd
import yfinance as yf

def correlation_matrix(tickers: list[str], period: str = '1y') -> dict:
    prices = yf.download(tickers, period=period)['Close']
    returns = prices.pct_change().dropna()
    corr = returns.corr().round(3)

    # Convert to JSON-serializable format
    result = {}
    for t1 in tickers:
        result[t1] = {}
        for t2 in tickers:
            if t1 in corr.columns and t2 in corr.index:
                result[t1][t2] = float(corr.loc[t2, t1])
    return {'correlation': result, 'period': period}

ความผันผวนและเบตา

ความผันผวนรายปี (ส่วนเบี่ยงเบนมาตรฐานที่ปรับตามวันซื้อขาย 252 วัน) ใช้วัดความเสี่ยงโดยรวม ส่วนเบตาใช้วัดความเสี่ยงเมื่อเทียบกับตลาด โดยทั่วไปคือ S&P 500: เบตา > 1 หมายถึงผันผวนกว่าตลาด

import numpy as np
import yfinance as yf

def volatility_and_beta(ticker: str, benchmark: str = 'SPY',
                        period: str = '1y') -> dict:
    data = yf.download([ticker, benchmark], period=period)['Close'].pct_change().dropna()

    if ticker not in data.columns or benchmark not in data.columns:
        return {'error': 'Insufficient data'}

    t_ret = data[ticker]
    b_ret = data[benchmark]

    vol_annualized = float(t_ret.std() * np.sqrt(252))

    cov = np.cov(t_ret, b_ret)
    beta = float(cov[0][1] / cov[1][1]) if cov[1][1] != 0 else 0.0

    return {
        'ticker':          ticker,
        'annual_vol_pct':  round(vol_annualized * 100, 2),
        'beta':            round(beta, 3),
        'market_sensitivity': 'high' if beta > 1.3 else 'market' if beta > 0.7 else 'low'
    }

ผลตอบแทนและความเสี่ยงระดับพอร์ตโฟลิโอ

วิเคราะห์พอร์ตโฟลิโอทั้งชุดด้วยการคำนวณผลตอบแทนและความผันผวนแบบถ่วงน้ำหนัก พอร์ตโฟลิโออาจมีความเสี่ยงต่ำกว่าสินทรัพย์แต่ละรายการเนื่องจากการกระจายความเสี่ยง

import pandas as pd, numpy as np
import yfinance as yf

def portfolio_metrics(holdings: dict, period: str = '1y') -> dict:
    tickers  = list(holdings.keys())
    weights  = np.array(list(holdings.values()))
    weights /= weights.sum()  # normalize to 1.0

    prices  = yf.download(tickers, period=period)['Close'].pct_change().dropna()
    port_ret = (prices * weights).sum(axis=1)
    cov_matrix = prices.cov() * 252  # annualized

    port_return  = float(port_ret.mean() * 252)
    port_vol     = float(np.sqrt(weights @ cov_matrix.values @ weights))
    port_sharpe  = port_return / port_vol if port_vol > 0 else 0

    return {
        'annual_return_pct':  round(port_return * 100, 2),
        'annual_vol_pct':     round(port_vol * 100, 2),
        'sharpe_ratio':       round(port_sharpe, 3),
        'holdings':           {t: round(float(w), 3) for t, w in zip(tickers, weights)}
    }

คำแนะนำการปรับสัดส่วน

การเบี่ยงเบนของสัดส่วนพอร์ตเกิดขึ้นเมื่อสินทรัพย์แต่ละรายการเติบโตในอัตราที่ต่างกัน เครื่องมือปรับสัดส่วนจะคำนวณน้ำหนักปัจจุบันเทียบกับน้ำหนักเป้าหมาย และแนะนำการซื้อขายเพื่อคืนสัดส่วนเป้าหมาย

def rebalancing_suggestion(current_values: dict, target_weights: dict) -> dict:
    total_value = sum(current_values.values())
    current_weights = {t: v / total_value for t, v in current_values.items()}
    trades = {}

    for ticker in target_weights:
        current_w = current_weights.get(ticker, 0)
        target_w  = target_weights[ticker]
        diff_w    = target_w - current_w
        diff_usd  = diff_w * total_value

        if abs(diff_w) > 0.01:  # only suggest if drift > 1%
            trades[ticker] = {
                'action':      'BUY' if diff_usd > 0 else 'SELL',
                'amount_usd':  round(abs(diff_usd), 2),
                'from_weight': round(current_w, 4),
                'to_weight':   round(target_w, 4)
            }
    return {'total_portfolio': round(total_value, 2), 'trades': trades}

if __name__ == '__main__':
    current = {'AAPL': 6000, 'BND': 2000, 'VTI': 2000}
    target = {'AAPL': 0.4, 'BND': 0.3, 'VTI': 0.3}
    result = rebalancing_suggestion(current, target)
    print('Total portfolio: $%s' % result['total_portfolio'])
    for ticker, trade in result['trades'].items():
        print(f"  {ticker}: {trade['action']} ${trade['amount_usd']} "
              f"(weight {trade['from_weight']} -> {trade['to_weight']})")

การลงทะเบียนเครื่องมือวิเคราะห์สำหรับ LLM

ลงทะเบียนฟังก์ชันวิเคราะห์แต่ละรายการเป็นเครื่องมือของเอเจนต์ LLM จะเรียกใช้เครื่องมือเหล่านี้ตามลำดับ ได้แก่ ดึงข้อมูลก่อน จากนั้นคำนวณตัวชี้วัด แล้วจึงสร้างคำแนะนำการปรับสัดส่วน

FINANCIAL_TOOLS = [
    {
        'type': 'function',
        'function': {
            'name': 'calculate_returns',
            'description': 'Calculate total and daily returns for a ticker.',
            'parameters': {'type': 'object',
                           'properties': {
                               'ticker': {'type': 'string'},
                               'period': {'type': 'string', 'default': '1y'}
                           }, 'required': ['ticker']}
        }
    },
    {
        'type': 'function',
        'function': {
            'name': 'sharpe_ratio',
            'description': 'Compute the annualized Sharpe ratio.',
            'parameters': {'type': 'object',
                           'properties': {
                               'ticker': {'type': 'string'},
                               'period': {'type': 'string', 'default': '1y'}
                           }, 'required': ['ticker']}
        }
    }
]

if __name__ == '__main__':
    print('Registered financial tools for the LLM:')
    for tool in FINANCIAL_TOOLS:
        fn = tool['function']
        print(f"  {fn['name']}: {fn['description']}")

การสร้างสรุปพอร์ตโฟลิโอด้วยภาษาที่เข้าใจง่าย

หลังจากคำนวณตัวชี้วัดแล้ว ให้ LLM แปลงตัวเลขเป็นภาษาที่นำไปใช้ตัดสินใจได้ ตัวชี้วัดเป็นข้อมูลนำเข้า ส่วนผลลัพธ์สุดท้ายควรอ่านเข้าใจได้สำหรับนักลงทุนที่ไม่ใช่ผู้เชี่ยวชาญเชิงปริมาณ

import openai, json

client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')

def portfolio_narrative(metrics: dict, holdings: dict) -> str:
    prompt = (
        f'Portfolio metrics:\n{json.dumps(metrics, indent=2)}\n\n'
        f'Holdings: {json.dumps(holdings)}\n\n'
        f'Write a 3-sentence plain-language portfolio assessment for a retail investor.\n'
        f'Include: overall performance, main risk, and one recommendation.'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

การแคชตัวชี้วัดที่คำนวณแล้ว

ตัวชี้วัดที่คำนวณจากข้อมูลต้นทางเดียวกันจะเหมือนกันทุกประการ ให้แคชตัวชี้วัดที่คำนวณแล้วไว้ควบคู่กับข้อมูลดิบ เพื่อหลีกเลี่ยงการคำนวณอัตราส่วน Sharpe และการลดลงสูงสุดจากจุดสูงสุดซ้ำในทุกครั้งที่เอเจนต์ทำงาน

import time, hashlib, json

metrics_cache = {}

def cached_metric(func, *args, ttl: int = 3600):
    key = hashlib.md5(f'{func.__name__}:{args}'.encode()).hexdigest()
    entry = metrics_cache.get(key)
    if entry and time.time() - entry['ts'] < ttl:
        return entry['data']
    result = func(*args)
    metrics_cache[key] = {'data': result, 'ts': time.time()}
    return result

# Usage:
# sharpe = cached_metric(sharpe_ratio, 'AAPL', '1y')

if __name__ == '__main__':
    def slow_average(*nums):
        return sum(nums) / len(nums)

    r1 = cached_metric(slow_average, 1, 2, 3)
    r2 = cached_metric(slow_average, 1, 2, 3)
    print('First call result:', r1)
    print('Second call result (served from cache):', r2)
    print('Cache entries:', len(metrics_cache))

อัตราส่วน Sharpe ที่สูงกว่า 2.0 บ่งบอกอะไร

อัตราส่วน Sharpe เป็นตัวชี้วัดมาตรฐานสำหรับเปรียบเทียบผลการดำเนินงานที่ปรับด้วยความเสี่ยงระหว่างพอร์ตโฟลิโอและสินทรัพย์แต่ละรายการ

สรุปเครื่องมือวิเคราะห์พอร์ตโฟลิโอ

ชุดเครื่องมือของเอเจนต์การเงินประกอบด้วย pct_change() สำหรับผลตอบแทน, อัตราส่วน Sharpe สำหรับผลการดำเนินงานที่ปรับด้วยความเสี่ยง, การลดลงสูงสุดจากจุดสูงสุดสำหรับการขาดทุนในกรณีเลวร้ายที่สุด, เมทริกซ์สหสัมพันธ์สำหรับการกระจายความเสี่ยง, เบตาสำหรับความไวต่อตลาด และ คำแนะนำการปรับสัดส่วนสำหรับการดูแลพอร์ตโฟลิโอ

ลงทะเบียนแต่ละรายการเป็นเครื่องมือของเอเจนต์ และแคชผลลัพธ์ที่คำนวณแล้วเพื่อเพิ่มประสิทธิภาพ

คำถามที่พบบ่อย

บทเรียน “เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน”

คำนวณผลตอบแทน อัตราส่วน Sharpe และวิเคราะห์การลดลงของมูลค่าผ่านโค้ดที่เอเจนต์เรียกใช้ คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การผสาน API ข้อมูลตลาด
  2. เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน
  3. กรอบป้องกันความเสี่ยงและการปฏิบัติตามข้อกำหนด
  4. การทดสอบย้อนหลังการตัดสินใจของเอเจนต์
← กลับไปที่ AI Agents