Skip to content
Back to skills

Agricultural Insurance Risk

ASecurity

Use when assessing ag insurance risk. Payouts, modeling.

  • 2 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 10, 2026
ai-agentspythongoapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 10, 2026

npx -y skills add LoopyLuci/Skills --skill agricultural-insurance-risk --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Agricultural Insurance Risk?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Agricultural Insurance Risk
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/loopyluci-agricultural-insurance-risk/badge)](https://www.skillsdirectory.com/skills/loopyluci-agricultural-insurance-risk)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: agricultural-insurance-risk
description: "Use when assessing ag insurance risk. Payouts, modeling."
version: 1.0.0
author: Hermes Agent
license: MIT
platforms: [linux, macos, windows]
metadata:
  hermes:
    tags: [agriculture, insurance, risk-assessment, actuarial, modeling]
    related_skills: [crop-yield-modeling, precision-agriculture]
---

# Agricultural Insurance Risk Assessment

## Overview
Design and implement agricultural insurance products using satellite data, weather stations, predictive modeling, and actuarial science. Covers parametric insurance, index-based payouts, risk pooling, claims processing automation, and actuarial reserve calculations for crop, livestock, and weather risk products.

## When to Use
- "Design parametric crop insurance product"
- "Calculate actuarial reserves for insurance portfolio"
- "Build weather index-based insurance model"
- "Automate agricultural claims processing"
- "Assess farmer-level insurance risk"

## Parametric Insurance Design

### Index-Based Insurance Framework
```python
import numpy as np
import pandas as pd
from scipy.stats import norm

def design_weather_index_insurance(historical_weather_data, threshold, payout_rate):
    """
    Design weather-based parametric insurance
    
    Args:
        historical_weather_data: daily weather observations (10+ years)
        threshold: trigger threshold (e.g., rainfall < 10mm during growing season)
        payout_rate: payout per unit threshold deviation
    
    Returns:
        Actuarially fair premium, payout probabilities
    """
    # Calculate historical probability of trigger event
    trigger_events = sum(
        1 for day in historical_weather_data 
        if day['rainfall'] < threshold
    )
    prob_trigger = trigger_events / len(historical_weather_data)
    
    # Expected payout
    expected_payout = prob_trigger * payout_rate
    
    # Standard deviation of payouts (for risk loading)
    payouts = [
        payout_rate if day['rainfall'] < threshold else 0
        for day in historical_weather_data
    ]
    payout_std = np.std(payouts)
    
    # Actuarially fair premium + risk loading
    risk_loading = 0.3  # 30% above expected value
    fair_premium = expected_payout * (1 + risk_loading)
    
    return {
        'trigger_probability': round(prob_trigger * 100, 2),
        'expected_payout': round(expected_payout, 2),
        'fair_premium': round(fair_premium, 2),
        'payout_volatility': round(payout_std, 2),
        'value_at_risk_99': round(
            expected_payout + 2.33 * payout_std, 2
        )
    }
```

## Satellite Data Integration

### Crop Health Monitoring for Claims
```python
def satellite_claim_verification(field_boundary, planting_date, expected_crop):
    """
    Use satellite NDVI to verify crop damage claims
    """
    # Get historical NDVI pattern for this crop/field
    normal_growth_pattern = get_historical_ndvi_curve(
        field_id, crop_type=expected_crop, years=5
    )
    
    # Get actual NDVI during growing season
    actual_ndvi = get_current_season_ndvi(
        field_boundary, planting_date
    )
    
    # Calculate deviation from normal
    deviation = compare_ndvi_patterns(actual_ndvi, normal_growth_pattern)
    
    # Insurance payout calculation
    if deviation['deviation_pct'] > 30:
        # Severe stress — likely insurance claim valid
        return {
            'claim_status': 'APPROVED',
            'damage_severity': 'SEVERE' if deviation['deviation_pct'] > 50 else 'MODERATE',
            'payout_percentage': min(deviation['deviation_pct'] / 100, 0.9),
            'confidence': deviation['confidence']
        }
    elif deviation['deviation_pct'] > 15:
        return {
            'claim_status': 'PENDING_INSPECTION',
            'damage_severity': 'MILD',
            'payout_percentage': 0.1,
            'confidence': deviation['confidence']
        }
    else:
        return {
            'claim_status': 'REJECTED',
            'damage_severity': 'NONE',
            'payout_percentage': 0.0,
            'confidence': deviation['confidence']
        }

def get_historical_ndvi_curve(field_id, crop_type, years):
    """
    Retrieve historical NDVI data for comparison
    """
    import ee  # Google Earth Engine
    
    # Query satellite archive (MODIS/Sentinel-2)
    collection = ee.ImageCollection('MODIS/006/MOD13Q1').filter(
        ee.DateRange(
            datetime(2020, 1, 1),
            datetime(2024, 12, 31)
        )
    ).select('NDVI')
    
    # Extract time series for field boundary
    ts = collection.getRegion(
        geometry=field_boundary,
        scale=250  # 250m resolution for MODIS
    )
    
    return ts  # Array of [timestamp, NDVI, lat, lon] tuples
```

## Actuarial Reserve Modeling

### Portfolio Reserve Calculation
```python
class InsuranceReserveCalculator:
    def __init__(self, portfolio_data, historical_claims):
        self.portfolio = portfolio_data
        self.claims_history = historical_claims
        
    def calculate_solvency_reserves(self, confidence_level=0.99):
        """
        Calculate reserves needed for solvency at given confidence level
        """
        # Aggregate claims distribution
        portfolio_claims = []
        
        for farm in self.portfolio:
            farm_risk_profile = self.get_farm_risk(farm)
            expected_claims = farm_risk_profile['expected_annual_claims']
            claim_volatility = farm_risk_profile['claim_volatility']
            
            # Monte Carlo simulation of farm-level claims
            simulated_claims = np.random.normal(
                expected_claims, 
                claim_volatility, 
                10000
            )
            portfolio_claims.extend(simulated_claims)
        
        # Portfolio-level statistics
        total_claims = np.array(portfolio_claims)
        portfolio_expected = np.mean(total_claims)
        portfolio_std = np.std(total_claims)
        
        # Solvency reserve (Value at Risk)
        var_threshold = np.percentile(total_claims, confidence_level * 100)
        
        return {
            'expected_annual_claims': round(portfolio_expected, 2),
            'solvency_reserve_99': round(var_threshold, 2),
            'capital_requirement': round(var_threshold * 1.2, 2),  # 20% buffer
            'risk_margin_ratio': round(portfolio_std / portfolio_expected, 3)
        }
```

## Claims Processing Automation

### Automated Claim Workflow
```python
class AutomatedClaimProcessor:
    def __init__(self, risk_models):
        self.risk_models = risk_models
        
    def process_claim(self, claim_data):
        """
        Automated claim assessment and processing
        """
        # Step 1: Verify farmer policy status
        policy_valid = verify_policy(claim_data['farmer_id'], claim_data['date'])
        if not policy_valid:
            return {"status": "REJECTED", "reason": "Policy expired or invalid"}
        
        # Step 2: Damage assessment
        satellite_analysis = satellite_claim_verification(
            claim_data['field_boundary'],
            claim_data['planting_date'],
            claim_data['crop_type']
        )
        
        # Step 3: Weather verification
        weather_data = get_weather_during_claim_period(
            claim_data['location'],
            claim_data['incident_date']
        )
        
        # Step 4: Calculate payout
        if satellite_analysis['claim_status'] == 'APPROVED':
            payout_amount = calculate_payout(
                claim_data['insured_value'],
                satellite_analysis['payout_percentage'],
                weather_data['severity_factor']
            )
            
            return {
                'status': 'APPROVED',
                'payout_amount': round(payout_amount, 2),
                'processing_time_hours': 2,
                'automated': True
            }
        
        elif satellite_analysis['claim_status'] == 'PENDING_INSPECTION':
            return {
                'status': 'MANUAL_REVIEW',
                'reason': 'Field inspection required',
                'estimated_processing_days': 5
            }
        
        else:
            return {
                'status': 'REJECTED',
                'reason': 'Satellite data shows no significant damage',
                'confidence_threshold': 0.85
            }
```

## Risk Pooling & Reinsurance

### Diversification Strategies
| Pool Type | Geography | Crops | Risk Correlation | Premium Reduction |
|-----------|-----------|-------|------------------|-------------------|
| Regional | Same state | Multiple | Medium | 15-25% |
| National | Country-wide | All crops | Low | 30-45% |
| Index-based | Global | Weather-index | Very low | 40-60% |
| Reinsurer | Multiple pools | All | Lowest | 50-70% |

## Common Pitfalls
1. **Inadequate historical data** — need 10+ years of weather/satellite records
2. **Basis risk** — weather station data doesn't match actual farm conditions
3. **Overfitting to recent weather patterns** — climate change shifts norms
4. **Not accounting for correlation** — drought affecting entire region simultaneously
5. **Satellite cloud cover gaps** — missing data during critical periods
6. **Too many manual claims** — defeats automation purpose
7. **Ignoring reinsurance needs** — catastrophic loss exceeds reserves
8. **Poor risk segmentation** — treating all farms as identical risk
9. **Not updating actuarial models** — premiums become inaccurate
10. **Regulatory compliance gaps** — state/country insurance regulations

## Verification Checklist
- [ ] Historical weather data spans ≥10 years for all regions
- [ ] Satellite data validated against ground truth measurements
- [ ] Basis risk quantified and disclosed to customers
- [ ] Correlation coefficients calculated between farms/regions
- [ ] Reinsurance agreements in place for catastrophic losses
- [ ] Automated claims accuracy ≥90% vs manual review
- [ ] Actuarial models updated annually with new claims data
- [ ] Regulatory filings current for all operating jurisdictions
- [ ] Reserve calculations meet solvency requirements (≥99% confidence)
- [ ] Customer communication protocol for claim status and payouts established

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.