ในโลกของการซื้อขายออปชันเชิงปริมาณ (Quantitative Options Trading) ข้อมูล Greeks จาก Deribit ถือเป็นหัวใจสำคัญสำหรับการวิเคราะห์ความอ่อนไหวของราคา การสร้าง стратегия และการทำ Backtesting ที่แม่นยำ บทความนี้จะพาคุณสร้าง Production-Grade Pipeline ที่ใช้ HolySheep AI เป็น AI Gateway เพื่อ接入 Tardis Exchange Data API โดยเน้นสถาปัตยกรรมที่เหมาะสม การปรับแต่งประสิทธิภาพ และ Best Practices จากประสบการณ์ตรงในการ deploy ระบบจริง

ทำไมต้องใช้ HolySheep สำหรับ Deribit Greeks Data

การดึงข้อมูล Greeks จาก Tardis สำหรับ Deribit Futures & Options นั้น ปกติแล้วต้องผ่านหลายขั้นตอน: เชื่อมต่อ WebSocket, Parse ข้อมูล, คำนวณ Greeks ด้วยตัวเอง หรือใช้ OpenAI/Claude API ช่วยในการ Interpret ผลลัพธ์ ซึ่งมีค่าใช้จ่ายสูงและ Latency ที่ไม่เสถียร

HolySheep AI เสนอทางออกที่เหมาะสมด้วยอัตราแลกเปลี่ยน ¥1=$1 ทำให้ประหยัดได้ถึง 85%+ เมื่อเทียบกับการใช้ OpenAI โดยตรง รองรับ GPT-4.1 ($8/MTok), Claude Sonnet 4.5 ($15/MTok), Gemini 2.5 Flash ($2.50/MTok) และ DeepSeek V3.2 ($0.42/MTok) พร้อมความเร็วตอบสนองต่ำกว่า 50ms

สถาปัตยกรรมระบบ Pipeline

ระบบที่เราจะสร้างประกอบด้วย 4 ชั้นหลัก:

การตั้งค่า Environment และ Dependencies

# requirements.txt

Core Data Handling

tardis-client==2.0.0 pandas==2.1.4 numpy==1.26.3 pyarrow==14.0.2

AI Integration via HolySheep

httpx==0.26.0 aiohttp==3.9.1

Options Pricing & Greeks

scipy==1.11.4 quantlib==1.31

Backtesting Framework

backtrader==1.9.78.123 vectorbt==0.25.8

Utilities

pydantic==2.5.2 msgpack==1.0.7 uvloop==0.19.0
# config.py
import os
from dataclasses import dataclass
from typing import Literal

@dataclass
class Config:
    # HolySheep API Configuration (Required: Use ONLY HolySheep)
    HOLYSHEEP_BASE_URL: str = "https://api.holysheep.ai/v1"
    HOLYSHEEP_API_KEY: str = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
    HOLYSHEEP_MODEL: Literal["gpt-4.1", "claude-sonnet-4.5", "gemini-2.5-flash", "deepseek-v3.2"] = "deepseek-v3.2"
    
    # Tardis Exchange Configuration
    TARDIS_API_KEY: str = os.getenv("TARDIS_API_KEY", "")
    TARDIS_EXCHANGE: str = "deribit"
    TARDIS_MARKET: str = "options"
    
    # Deribit Specific
    DERIBIT_WS_URL: str = "wss://test.deribit.com/wsapi/v2"
    INSTRUMENTS: list = None  # e.g., ["BTC-28MAR25-95000-C", "BTC-28MAR25-95000-P"]
    
    # Storage
    DATA_DIR: str = "./data/deribit_greeks"
    CHECKPOINT_DIR: str = "./checkpoints"
    
    # Performance Tuning
    BATCH_SIZE: int = 100
    MAX_CONCURRENT_REQUESTS: int = 10
    REQUEST_TIMEOUT: int = 30
    RETRY_ATTEMPTS: int = 3
    
    def __post_init__(self):
        if self.INSTRUMENTS is None:
            self.INSTRUMENTS = [
                "BTC-PERPETUAL",
                "BTC-28MAR25-95000-C",
                "BTC-28MAR25-95000-P",
            ]
        os.makedirs(self.DATA_DIR, exist_ok=True)
        os.makedirs(self.CHECKPOINT_DIR, exist_ok=True)

config = Config()

HolySheep API Client สำหรับ Options Analysis

# holy_sheep_client.py
import httpx
import asyncio
import json
from typing import Optional, Dict, Any, List
from dataclasses import dataclass
from datetime import datetime
import time

@dataclass
class GreeksAnalysis:
    """โครงสร้างผลลัพธ์การวิเคราะห์ Greeks จาก AI"""
    iv_analysis: str
    delta_hedge_recommendation: str
    vega_exposure: float
    gamma_risk: str
    strategy_signal: str
    confidence_score: float
    processing_time_ms: float

class HolySheepOptionsClient:
    """
    HolySheep AI Client สำหรับ Options Greeks Analysis
    ใช้ base_url: https://api.holysheep.ai/v1 เท่านั้น
    """
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self._semaphore = asyncio.Semaphore(10)  # Concurrent request limit
        self._request_count = 0
        self._total_tokens = 0
    
    async def analyze_greeks(
        self,
        greeks_data: Dict[str, Any],
        model: str = "deepseek-v3.2"
    ) -> GreeksAnalysis:
        """
        วิเคราะห์ Greeks Data ด้วย HolySheep AI
        ใช้ DeepSeek V3.2 สำหรับ Cost Efficiency สูงสุด ($0.42/MTok)
        """
        start_time = time.perf_counter()
        
        prompt = f"""คุณเป็น Quantitative Analyst ผู้เชี่ยวชาญด้าน Options Trading

วิเคราะห์ Greeks Data ต่อไปนี้และให้คำแนะนำ:

**Greeks Data:**
- Delta: {greeks_data.get('delta', 'N/A')}
- Gamma: {greeks_data.get('gamma', 'N/A')}
- Vega: {greeks_data.get('vega', 'N/A')}
- Theta: {greeks_data.get('theta', 'N/A')}
- Rho: {greeks_data.get('rho', 'N/A')}
- IV: {greeks_data.get('iv', 'N/A')}%

**ตลาด:**
- Instrument: {greeks_data.get('instrument_name', 'N/A')}
- Underlying Price: {greeks_data.get('underlying_price', 'N/A')}
- Mark Price: {greeks_data.get('mark_price', 'N/A')}
- Best Bid: {greeks_data.get('best_bid_price', 'N/A')}
- Best Ask: {greeks_data.get('best_ask_price', 'N/A')}

กรุณาตอบเป็น JSON ดังนี้:
{{
  "iv_analysis": "การวิเคราะห์ Implied Volatility",
  "delta_hedge_recommendation": "คำแนะนำ Delta Hedging",
  "vega_exposure": ค่า vega exposure เป็นตัวเลข,
  "gamma_risk": "การประเมิน Gamma Risk",
  "strategy_signal": "สัญญาณกลยุทธ์ (BUY/SELL/HOLD)",
  "confidence_score": ความมั่นใจ 0.0-1.0
}}"""
        
        async with self._semaphore:
            async with httpx.AsyncClient(timeout=30.0) as client:
                response = await client.post(
                    f"{self.base_url}/chat/completions",
                    headers={
                        "Authorization": f"Bearer {self.api_key}",
                        "Content-Type": "application/json"
                    },
                    json={
                        "model": model,
                        "messages": [
                            {"role": "system", "content": "You are a professional Quantitative Options Analyst."},
                            {"role": "user", "content": prompt}
                        ],
                        "temperature": 0.3,
                        "max_tokens": 1000
                    }
                )
                response.raise_for_status()
                result = response.json()
                
                self._request_count += 1
                self._total_tokens += result.get('usage', {}).get('total_tokens', 0)
                
                content = result['choices'][0]['message']['content']
                # Parse JSON response
                analysis_data = json.loads(content)
                
                processing_time = (time.perf_counter() - start_time) * 1000
                
                return GreeksAnalysis(
                    iv_analysis=analysis_data.get('iv_analysis', ''),
                    delta_hedge_recommendation=analysis_data.get('delta_hedge_recommendation', ''),
                    vega_exposure=analysis_data.get('vega_exposure', 0.0),
                    gamma_risk=analysis_data.get('gamma_risk', ''),
                    strategy_signal=analysis_data.get('strategy_signal', 'HOLD'),
                    confidence_score=analysis_data.get('confidence_score', 0.5),
                    processing_time_ms=processing_time
                )
    
    async def batch_analyze(
        self,
        greeks_batch: List[Dict[str, Any]],
        model: str = "deepseek-v3.2"
    ) -> List[GreeksAnalysis]:
        """ประมวลผล Batch ของ Greeks Data พร้อมกัน"""
        tasks = [self.analyze_greeks(g, model) for g in greeks_batch]
        return await asyncio.gather(*tasks, return_exceptions=True)
    
    def get_usage_stats(self) -> Dict[str, Any]:
        """ดูสถิติการใช้งาน API"""
        cost_per_mtok = 0.42  # DeepSeek V3.2
        estimated_cost = (self._total_tokens / 1_000_000) * cost_per_mtok
        return {
            "total_requests": self._request_count,
            "total_tokens": self._total_tokens,
            "estimated_cost_usd": round(estimated_cost, 4),
            "cost_savings_vs_openai": round(
                estimated_cost / 8.0 * 100, 2  # GPT-4o = $8/MTok
            )
        }

Tardis Deribit Greeks Fetcher

# tardis_greeks_fetcher.py
import asyncio
import json
import msgpack
from datetime import datetime
from typing import Dict, Any, List, Optional, Callable
from dataclasses import dataclass, asdict
import aiohttp
from pathlib import Path
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@dataclass
class DeribitGreeks:
    """โครงสร้างข้อมูล Greeks จาก Deribit"""
    timestamp: datetime
    instrument_name: str
    underlying_price: float
    mark_price: float
    best_bid_price: float
    best_ask_price: float
    delta: float
    gamma: float
    vega: float
    theta: float
    iv: float  # Implied Volatility
    spot_iv: Optional[float] = None
    rf_rate: Optional[float] = None  # Risk-free rate

class TardisDeribitFetcher:
    """
    Fetcher สำหรับ Deribit Greeks ผ่าน Tardis API
    รองรับ both REST (historical) และ WebSocket (real-time)
    """
    
    # Tardis Exchange ID สำหรับ Deribit
    TARDIS_EXCHANGE_ID = "deribit"
    
    def __init__(
        self,
        api_key: str,
        data_dir: str = "./data/deribit_greeks"
    ):
        self.api_key = api_key
        self.data_dir = Path(data_dir)
        self.data_dir.mkdir(parents=True, exist_ok=True)
        self._ws_connection: Optional[aiohttp.ClientWebSocketResponse] = None
        self._session: Optional[aiohttp.ClientSession] = None
        self._reconnect_delay = 1.0
        self._max_reconnect_delay = 60.0
        self._is_connected = False
    
    async def fetch_historical_greeks(
        self,
        instrument: str,
        start_date: datetime,
        end_date: datetime,
        resolution: str = "1"
    ) -> List[DeribitGreeks]:
        """
        ดึง Historical Greeks Data จาก Tardis REST API
        
        Args:
            instrument: ชื่อ instrument เช่น "BTC-28MAR25-95000-C"
            start_date: วันที่เริ่มต้น
            end_date: วันที่สิ้นสุด
            resolution: ความละเอียดในหน่วยวินาที (1, 60, 300, 900)
        """
        logger.info(f"Fetching historical Greeks for {instrument}")
        
        url = f"https://api.tardis.dev/v1/exchanges/{self.TARDIS_EXCHANGE_ID}/historical-custom-data"
        
        params = {
            "api_key": self.api_key,
            "symbol": instrument,
            "from": start_date.isoformat(),
            "to": end_date.isoformat(),
            "resolution": resolution,
            "has_greeks": "true"
        }
        
        async with aiohttp.ClientSession() as session:
            async with session.get(url, params=params) as response:
                if response.status == 429:
                    # Rate Limited - ใช้ Exponential Backoff
                    retry_after = int(response.headers.get('Retry-After', 60))
                    logger.warning(f"Rate limited. Waiting {retry_after}s")
                    await asyncio.sleep(retry_after)
                    return await self.fetch_historical_greeks(
                        instrument, start_date, end_date, resolution
                    )
                
                response.raise_for_status()
                data = await response.json()
                
                results = []
                for record in data.get('data', []):
                    greeks = self._parse_greeks_record(record)
                    if greeks:
                        results.append(greeks)
                
                # Save to disk
                await self._save_to_parquet(results, instrument)
                logger.info(f"Fetched {len(results)} records for {instrument}")
                return results
    
    async def _parse_greeks_record(self, record: Dict) -> Optional[DeribitGreeks]:
        """Parse ข้อมูล Greeks จาก Tardis response"""
        try:
            return DeribitGreeks(
                timestamp=datetime.fromisoformat(record['timestamp'].replace('Z', '+00:00')),
                instrument_name=record['symbol'],
                underlying_price=float(record['underlying_price']),
                mark_price=float(record.get('mark_price', 0)),
                best_bid_price=float(record.get('best_bid_price', 0)),
                best_ask_price=float(record.get('best_ask_price', 0)),
                delta=float(record.get('greeks', {}).get('delta', 0)),
                gamma=float(record.get('greeks', {}).get('gamma', 0)),
                vega=float(record.get('greeks', {}).get('vega', 0)),
                theta=float(record.get('greeks', {}).get('theta', 0)),
                iv=float(record.get('greeks', {}).get('iv', 0)),
                spot_iv=float(record.get('greeks', {}).get('spot_iv', 0)),
                rf_rate=float(record.get('greeks', {}).get('rf_rate', 0))
            )
        except (KeyError, ValueError, TypeError) as e:
            logger.warning(f"Failed to parse record: {e}")
            return None
    
    async def connect_websocket(
        self,
        instruments: List[str],
        on_greeks: Callable[[DeribitGreeks], None]
    ):
        """
        เชื่อมต่อ WebSocket สำหรับ Real-time Greeks
        รองรับ Auto-reconnect ด้วย Exponential Backoff
        """
        ws_url = "wss://api.tardis.dev/v1/feed"
        
        while True:
            try:
                self._session = aiohttp.ClientSession()
                self._ws_connection = await self._session.ws_connect(
                    ws_url,
                    timeout=aiohttp.ClientTimeout(total=30)
                )
                
                # Subscribe to instruments
                subscribe_msg = {
                    "type": "subscribe",
                    "exchange": self.TARDIS_EXCHANGE_ID,
                    "channels": ["greeks"],
                    "symbols": instruments
                }
                await self._ws_connection.send_json(subscribe_msg)
                
                logger.info(f"WebSocket connected for {len(instruments)} instruments")
                self._reconnect_delay = 1.0  # Reset delay on successful connection
                self._is_connected = True
                
                async for msg in self._ws_connection:
                    if msg.type == aiohttp.WSMsgType.TEXT:
                        data = json.loads(msg.data)
                        greeks = self._parse_greeks_record(data)
                        if greeks:
                            await on_greeks(greeks)
                    elif msg.type == aiohttp.WSMsgType.CLOSED:
                        logger.warning("WebSocket closed by server")
                        break
                    elif msg.type == aiohttp.WSMsgType.ERROR:
                        logger.error(f"WebSocket error: {msg.data}")
                        break
                        
            except aiohttp.ClientError as e:
                logger.error(f"WebSocket error: {e}")
            finally:
                self._is_connected = False
                if self._session:
                    await self._session.close()
                
                # Exponential backoff
                logger.info(f"Reconnecting in {self._reconnect_delay}s...")
                await asyncio.sleep(self._reconnect_delay)
                self._reconnect_delay = min(
                    self._reconnect_delay * 2,
                    self._max_reconnect_delay
                )
    
    async def _save_to_parquet(self, records: List[DeribitGreeks], instrument: str):
        """Save Greeks data เป็น Parquet format"""
        import pandas as pd
        
        if not records:
            return
        
        df = pd.DataFrame([asdict(r) for r in records])
        filepath = self.data_dir / f"{instrument.replace('-', '_')}.parquet"
        df.to_parquet(filepath, engine='pyarrow', compression='snappy')
        logger.info(f"Saved {len(records)} records to {filepath}")

Volatility Strategy Backtesting Engine

# volatility_backtester.py
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from enum import Enum
import json
import asyncio
from pathlib import Path

from holy_sheep_client import HolySheepOptionsClient, GreeksAnalysis
from tardis_greeks_fetcher import DeribitGreeks, TardisDeribitFetcher

class StrategyType(Enum):
    VOLATILITY_TREND = "volatility_trend"
    IV_RANK = "iv_rank"
    SKEW_TRADE = "skew_trade"
    GAMMA_SCALP = "gamma_scalp"
    VEGA_CAPTURE = "vega_capture"

@dataclass
class BacktestResult:
    strategy_name: str
    total_trades: int
    win_rate: float
    total_pnl: float
    max_drawdown: float
    sharpe_ratio: float
    sortino_ratio: float
    avg_trade_duration_hours: float
    holy_sheep_cost_usd: float
    ai_signals_used: int

class VolatilityBacktester:
    """
    Backtesting Engine สำหรับ Volatility Strategies
    รวม HolySheep AI สำหรับ Signal Generation
    """
    
    def __init__(
        self,
        holy_sheep_client: HolySheepOptionsClient,
        initial_capital: float = 100_000.0
    ):
        self.client = holy_sheep_client
        self.initial_capital = initial_capital
        self.current_capital = initial_capital
        self.positions: List[Dict] = []
        self.trade_history: List[Dict] = []
        self.ai_signals: List[GreeksAnalysis] = []
        self.total_ai_cost = 0.0
    
    async def run_backtest(
        self,
        greeks_data: pd.DataFrame,
        strategy_type: StrategyType = StrategyType.VOLATILITY_TREND,
        use_ai_signals: bool = True
    ) -> BacktestResult:
        """
        Run Backtest บน Historical Greeks Data
        
        Args:
            greeks_data: DataFrame ที่มี columns: timestamp, delta, gamma, vega, theta, iv
            strategy_type: ประเภทกลยุทธ์
            use_ai_signals: จะใช้ HolySheep AI ช่วยวิเคราะห์หรือไม่
        """
        print(f"Starting backtest: {strategy_type.value}")
        print(f"Data points: {len(greeks_data)}")
        
        for idx, row in greeks_data.iterrows():
            greeks_dict = row.to_dict()
            
            # ส่ง Greeks ไปวิเคราะห์ด้วย HolySheep
            if use_ai_signals:
                try:
                    analysis = await self.client.analyze_greeks(greeks_dict)
                    self.ai_signals.append(analysis)
                    self.total_ai_cost += 0.42 / 1_000_000 * 1000  # ~$0.00042 per call
                    
                    # Execute strategy based on AI signal
                    await self._execute_signal(
                        analysis,
                        greeks_dict,
                        strategy_type
                    )
                except Exception as e:
                    print(f"AI Analysis failed: {e}")
                    # Fallback to rule-based
                    await self._execute_rule_based(
                        greeks_dict,
                        strategy_type
                    )
            else:
                await self._execute_rule_based(greeks_dict, strategy_type)
            
            # Update portfolio
            self._update_portfolio(greeks_dict)
        
        return self._calculate_metrics(strategy_type.value, use_ai_signals)
    
    async def _execute_signal(
        self,
        analysis: GreeksAnalysis,
        greeks: Dict,
        strategy_type: StrategyType
    ):
        """Execute ตาม AI Signal"""
        signal = analysis.strategy_signal.upper()
        position_size = self.current_capital * 0.1  # 10% per trade
        
        if signal == "BUY" and not self._has_position(greeks['instrument_name']):
            self._open_position(
                instrument=greeks['instrument_name'],
                direction="LONG",
                size=position_size,
                entry_price=greeks['mark_price'],
                greeks=greeks
            )
        elif signal == "SELL" and not self._has_position(greeks['instrument_name']):
            self._open_position(
                instrument=greeks['instrument_name'],
                direction="SHORT",
                size=position_size,
                entry_price=greeks['mark_price'],
                greeks=greeks
            )
        elif signal == "HOLD":
            # Check stop-loss / take-profit
            self._check_exits(greeks)
    
    def _execute_rule_based(
        self,
        greeks: Dict,
        strategy_type: StrategyType
    ):
        """Rule-based execution เมื่อ AI ไม่พร้อม"""
        if strategy_type == StrategyType.IV_RANK:
            # Buy when IV < 20th percentile, Sell when IV > 80th
            if greeks['iv'] < 20:
                self._open_position(greeks['instrument_name'], "LONG", 
                                   self.current_capital * 0.1, greeks['mark_price'], greeks)
            elif greeks['iv'] > 80:
                self._open_position(greeks['instrument_name'], "SHORT",
                                   self.current_capital * 0.1, greeks['mark_price'], greeks)
    
    def _calculate_metrics(
        self,
        strategy_name: str,
        use_ai: bool
    ) -> BacktestResult:
        """คำนวณ Performance Metrics"""
        if not self.trade_history:
            return BacktestResult(
                strategy_name=strategy_name,
                total_trades=0,
                win_rate=0.0,
                total_pnl=0.0,
                max_drawdown=0.0,
                sharpe_ratio=0.0,
                sortino_ratio=0.0,
                avg_trade_duration_hours=0.0,
                holy_sheep_cost_usd=self.total_ai_cost,
                ai_signals_used=len(self.ai_signals)
            )
        
        df = pd.DataFrame(self.trade_history)
        returns = df['pnl'].values
        cumulative = np.cumsum(returns)
        peak = np.maximum.accumulate(cumulative)
        drawdown = (cumulative - peak) / peak
        
        wins = df[df['pnl'] > 0]
        losses = df[df['pnl'] <= 0]
        
        return BacktestResult(
            strategy_name=strategy_name,
            total_trades=len(df),
            win_rate=len(wins) / len(df) if len(df) > 0 else 0,
            total_pnl=cumulative[-1] if len(cumulative) > 0 else 0,
            max_drawdown=abs(drawdown.min()) if len(drawdown) > 0 else 0,
            sharpe_ratio=np.mean(returns) / np.std(returns) * np.sqrt(252) if np.std(returns) > 0 else 0,
            sortino_ratio=self._sortino_ratio(returns),
            avg_trade_duration_hours=df['duration_hours'].mean() if 'duration_hours' in df.columns else 0,
            holy_sheep_cost_usd=self.total_ai_cost,
            ai_signals_used=len(self.ai_signals) if use_ai else 0
        )
    
    def _sortino_ratio(self, returns: np.ndarray, target=0.0) -> float:
        downside = returns[returns < target]
        if len(downside) == 0:
            return 0.0
        return np.mean(returns) / np.std(downside) * np.sqrt(252)
    
    # Helper methods
    def _has_position(self, instrument: str) -> bool:
        return any(p['instrument'] == instrument and p['status'] == 'OPEN' 
                  for p in self.positions)
    
    def _open_position(self, instrument, direction, size, entry_price, greeks):
        self.positions.append({
            'instrument': instrument,
            'direction': direction,
            'size': size,
            'entry_price': entry_price,
            'entry_time': datetime.now(),
            'status': 'OPEN',
            'delta': greeks.get('delta', 0),
            'gamma': greeks.get('gamma', 0),
            'vega': greeks.get('vega', 0)
        })
    
    def _check_exits(self, greeks):
        for pos in self.positions:
            if pos['status'] != 'OPEN':
                continue
            pnl = self._calculate_position_pnl(pos, greeks)
            # Stop-loss at 20%
            if pnl < -0.2 * pos['size']:
                self._close_position(pos, greeks, pnl)
            # Take-profit at 50%
            elif pnl > 0.5 * pos['size']:
                self._close_position(pos, greeks, pnl)
    
    def _calculate_position_pnl(self, pos, current_greeks) -> float:
        current_price = current_greeks['mark_price']
        direction = 1 if pos['direction'] == 'LONG' else -1
        return (current_price - pos['entry_price']) * direction * (pos['size'] / pos['entry_price'])
    
    def _close_position(self, pos, greeks, pnl):
        pos['status'] = 'CLOSED'
        pos['exit_price'] = greeks['mark_price']
        pos['exit_time'] = datetime.now()
        pos['pnl'] = pnl
        pos['duration_hours'] = (pos['exit_time'] - pos['entry_time']).total_seconds() / 3600
        self.current_capital += pnl
        self.trade_history.append(pos)
    
    def _update_portfolio(self, greeks):
        """Update portfolio value based on