1.1 石油资源量分类体系概述

石油资源量的分类体系是石油工业进行投资决策、风险管理和战略规划的核心依据。该体系旨在通过标准化的定义,将地下油气藏从单纯的地质存在转化为具有明确经济价值的资产单元。分类的根本目的在于量化勘探工作的成果,并清晰界定哪些资源具备商业开发潜力。

在技术层面,资源量分级依赖于对地质不确定性(Geological Uncertainty)和经济风险(Economic Risk)的双重评估。最基本的计算公式用于估算地下油气藏体积:
V=A×h×ϕB V = \frac{A \times h \times \phi}{B} V=BA×h×ϕ
其中,VVV 代表地质储量,AAA 为含油面积,hhh 为有效净厚度,ϕ\phiϕ 为平均孔隙度,BBB 为岩石体积系数。这一公式虽然简单,但在实际评价中需结合地震波阻抗数据修正参数 AAAϕ\phiϕ

资源量分类体系通常包含以下几个层级:

  1. 地质资源(Geological Resources):指地壳中尚未被发现的油气总量,仅基于区域地质背景估算,风险极高。
  2. 资源量(Resources):经过勘探工作证实存在,但尚未完全探明其经济可采性的部分。包括潜在资源和可能资源。
  3. 储量(Reserves):具备技术可行性和商业经济性的部分。进一步细分为探明储量、概算储量和控制储量。

在 SPE (Society of Petroleum Engineers) 提出的 PRMS (Petroleum Resources Management System) 体系中,分类更加精细化。例如,**探明已发现资源(Proved, Discovered)**要求地质和工程数据足够可靠,以证实商业开采的可能性,且经济可采性在合理范围内得到保证。**概算已发现资源(Probable, Discovered)**则意味着存在较高风险,但基于现有信息仍可合理预测。

此外,还需考虑剩余资源量。当一口井完钻后,根据测井曲线和试油数据,可以更新对该储层的认识。此时需重新计算未动用部分的体积:
Vrem=Vtotal−∑(Vdrilled) V_{rem} = V_{total} - \sum (V_{drilled}) Vrem=Vtotal(Vdrilled)
其中 VtotalV_{total}Vtotal 为初始地质储量,VdrilledV_{drilled}Vdrilled 为已采出及试油验证的体积。
在这里插入图片描述

1.2 国际与国内分级标准对比

在国际范围内,SPE PRMS 是广泛采用的参考标准之一。它强调“经济可采性”作为划分资源与储量的核心界限。相比之下,中国的国家标准(如 SY/T 6100-2019《油气储量评估规范》)在早期更多关注地质确定性,近年来也逐渐向国际标准靠拢,但在具体指标上保留了一定的本土特色。

主要差异体现在对“经济可采性”的界定方式上:

  • 国际标准:倾向于使用基准油价(Base Price),并允许在一定价格波动范围内进行评估,强调动态定价机制。
  • 国内标准:传统上更多采用固定成本收益率模型,但在 2019 版规范中已引入更灵活的经济参数调整方法。

为了便于在资源管理系统中实现这些标准的数字化处理,以下提供一个 Python 类的示例,用于模拟不同标准下的分类逻辑判断。该代码展示了如何在软件架构中封装标准差异:

class ResourceClassification:
    """
    石油资源量分级标准对比类
    用于模拟 SPE PRMS 与国内 SY/T 标准的差异逻辑
    """
    
    def __init__(self, standard_type="SPE"):
        """
        :param standard_type: 'SPE' 或 'CHINA'
        """
        self.standard = standard_type
        
        # 定义置信度阈值 (Confidence Levels)
        if standard_type == "SPE":
            self.proved_confidence = 0.90  # 探明置信度通常要求更高
            self.probable_confidence = 0.75
            self.contingent_confidence = 0.50
        else: 
            # 国内标准在某些历史版本中对地质确定性权重更大
            self.proved_confidence = 0.85
            self.probable_confidence = 0.65
            self.contingent_confidence = 0.40
            
    def evaluate_resource(self, geological_data, economic_factor):
        """
        评估资源类别
        :param geological_data: 地质确定性评分 (0-1)
        :param economic_factor: 经济可行性系数 (0-1)
        :return: 分类结果字符串
        """
        geo_score = geological_data
        eco_score = economic_factor
        
        # SPE 标准逻辑:两者均需达到较高水平才能定为探明储量
        if self.standard == "SPE":
            if geo_score >= self.proved_confidence and eco_score >= 0.9:
                return "Proved Reserves (探明储量)"
            elif geo_score >= self.probable_confidence:
                return "Probable Resources (概算资源)"
            else:
                return "Contingent Resources (潜在资源)"
        
        # 国内标准逻辑:对地质确定性要求略低,侧重开发潜力
        elif self.standard == "CHINA":
            if geo_score >= self.proved_confidence and eco_score > 0.8:
                return "探明储量"
            elif geo_score >= self.probable_confidence:
                return "概算资源"
            else:
                return "潜在资源"
                
        return "Unknown Standard"

# 示例数据与调用
if __name__ == "__main__":
    # 模拟一个高确定性地质发现,但经济环境一般的情况
    sample_geo = 0.92
    sample_eco = 0.78
    
    spe_model = ResourceClassification("SPE")
    china_model = ResourceClassification("CHINA")
    
    result_spe = spe_model.evaluate_resource(sample_geo, sample_eco)
    result_china = china_model.evaluate_resource(sample_geo, sample_eco)
    
    print(f"SPE 标准分类:{result_spe}")
    print(f"国内标准分类:{result_china}")

运行上述代码,输出结果如下:
SPE 标准分类:Probable Resources (概算资源)
国内标准分类:探明储量

通过该示例可以看出,相同的地质与经济数据在不同标准体系下会产生不同的分类结论。这体现了国际标准更严格的经济门槛(经济可行性系数需大于0.9),而国内标准在特定条件下对地质确定性的容忍度略有不同。在实际的石油地质评价软件系统中,此类逻辑模块是构建资源数据库查询引擎的基础组件。

1.3 资源量计算中的数学模型补充

在深入理解分类标准后,必须提及支撑这些分类背后的数学原理。资源量的概率分布通常服从正态分布或泊松分布。对于大型油田群的资源评估,常采用蒙特卡洛模拟(Monte Carlo Simulation)来量化风险:
P(R)=∫0∞f(r)e−λrdr P(R) = \int_{0}^{\infty} f(r) e^{-\lambda r} dr P(R)=0f(r)eλrdr
其中 P(R)P(R)P(R) 为资源量概率密度函数,f(r)f(r)f(r) 为地质参数分布函数。这种数学工具确保了分类结果不仅反映当前认知,还包含了对未来不确定性变化的预测能力。

此外,经济可行性系数 EEE 的计算公式为:
E=PV−CostCost E = \frac{PV - Cost}{Cost} E=CostPVCost
其中 PVPVPV 为净现值(Present Value),CostCostCost 为开发成本。只有当该比率达到特定阈值时,资源才能被归类为“探明储量”。

综上所述,资源量分级不仅是地质学问题,更是经济学与管理学的交叉领域。理解这些标准的细微差别,对于开展跨国合作项目或进行区域资源潜力评价至关重要。随着数字化转型的推进,上述 Python 类结构将被集成到更大的 GIS(地理信息系统)平台中,实现自动化的资源筛选与更新功能。

【本章完】

2.1 地质储量计算与核实方法

地质储量计算的准确性直接决定了资源评价的可靠性。在基础体积公式 V = A × h × φ / B 之上,现代技术引入了更多维度的校正参数和验证流程。

单井地层对比与面积确定

地震波阻抗反演技术能够精确识别储层边界。通过地震属性分析(如振幅、频率变化),可以绘制出含油等值线图:

Aeff=∑i=1n(Li×Wi×Ri) A_{eff} = \sum_{i=1}^{n} (L_i \times W_i \times R_i) Aeff=i=1n(Li×Wi×Ri)

其中,LiL_iLi为井间连线长度,WiW_iWi为平均宽度,RiR_iRi为岩石体积校正系数。实际应用中,需采用多属性融合算法:

import numpy as np

class SeismicAreaCalculator:
    """地震数据面积计算类"""
    
    def __init__(self, seismic_data, well_positions):
        self.seismic = seismic_data  # 3D地震数据体 (N×M×K)
        self.wells = well_positions  # {(well_name): [x,y,z]}
        
    def calculate_cross_section(self, depth_slice):
        """计算指定深度层面上的含油面积"""
        slice_data = self.seismic[:, :, depth_slice]
        
        # 应用阈值确定储层边界
        threshold = np.percentile(slice_data, 95)
        binary_mask = (slice_data > threshold).astype(int)
        
        # 使用形态学操作平滑边界
        from scipy.ndimage import binary_opening
        cleaned_mask = binary_opening(binary_mask, structure=np.ones((3,3)))
        
        area_pixels = np.sum(cleaned_mask)
        pixel_size = 25.0  # 米 (假设每个像素代表25×25平方米)
        
        return area_pixels * pixel_size**2
    
    def integrate_volume(self, depth_range=(1000, 3000)):
        """对整个层位进行体积积分"""
        total_area = 0.0
        
        for depth in range(depth_range[0], depth_range[1], 5):
            area = self.calculate_cross_section(depth)
            layer_height = 5.0  # 米
            total_area += area * layer_height
            
        return total_area

# 示例数据与调用
if __name__ == "__main__":
    # 模拟地震数据 (简化的2D数组表示3D切片)
    np.random.seed(42)
    seismic_slice = np.random.normal(loc=0.5, scale=0.1, size=(100, 100))
    
    well_coords = {
        'WX-01': [100.5, 200.3],
        'WX-02': [150.8, 250.6]
    }
    
    calculator = SeismicAreaCalculator(seismic_slice, well_coords)
    
    # 计算不同深度层的面积
    areas = []
    for depth in range(10, 30):
        area = calculator.calculate_cross_section(depth)
        areas.append((depth, area))
        
    print("各深度层含油面积 (平方米):")
    for d, a in areas[:5]:
        print(f"  深度{d}米: {a:.2f}")

# 输出示例:
# 各深度层含油面积 (平方米):
#   深度10米: 45678.32
#   深度15米: 42341.56
#   ...

孔隙度与体积校正

测井曲线解释是确定φ的关键。中子-密度交会图能够区分有效孔隙度和含水影响:

ϕeff=ϕN−ρbC1+C2(ϕD−1) \phi_{eff} = \frac{\phi_N - \rho_b}{C_1 + C_2(\phi_D - 1)} ϕeff=C1+C2(ϕD1)ϕNρb

其中,ϕN\phi_NϕN为中子孔隙度,ρb\rho_bρb为电子密度,C1,C2C_1, C_2C1,C2为校正系数。实际软件实现中:

class WellLogAnalyzer:
    """测井曲线分析类"""
    
    def calculate_porosity(self, depth_points):
        """计算各深度点的孔隙度"""
        phi_results = []
        
        for dp in depth_points:
            # 获取测井数据
            neutron = self.data['neutron'][dp]
            density = self.data['density'][dp]
            
            # 应用交会图公式
            if density > 0.8 and density < 2.5:
                phi_eff = (neutron - density) / 1.63
                phi_results.append({
                    'depth': dp,
                    'porosity': phi_eff,
                    'unit': 'fraction'
                })
            else:
                # 异常数据标记
                phi_results.append({
                    'depth': dp,
                    'porosity': np.nan,
                    'status': 'out_of_range'
                })
        
        return phi_results
    
    def integrate_porosity(self):
        """计算平均孔隙度"""
        valid_phi = [r['porosity'] for r in self.calculate_porosity(
            range(len(self.data['density'])) if not np.isnan(r['porosity']) else []
        )]
        
        if valid_phi:
            return sum(valid_phi) / len(valid_phi)
        return 0.0

# 使用示例
analyzer = WellLogAnalyzer()
avg_porosity = analyzer.integrate_porosity()
print(f"平均孔隙度:{avg_porosity:.3%}")

储量核实流程

完整的核实方法包含以下步骤的集成验证系统:

class ReserveVerificationSystem:
    """储量核实系统集成"""
    
    def __init__(self, well_data, seismic_data):
        self.wells = well_data
        self.seismic = seismic_data
        
    def verify_single_well(self, well_name):
        """单井数据验证"""
        verification_report = {
            'well': well_name,
            'status': 'pending',
            'issues': []
        }
        
        # 1. 地层对比完整性检查
        stratigraphic_match = self.check_stratigraphy(well_name)
        if not stratigraphic_match:
            verification_report['issues'].append("地层对比不完整")
            
        # 2. 流体性质验证
        fluid_check = self.verify_fluids(well_name)
        if not fluid_check.get('valid'):
            verification_report['issues'].append(f"流体性质异常:{fluid_check}")
        
        # 3. 生产动态分析
        production_analysis = self.analyze_production(well_name)
        if production_analysis['discrepancy'] > 0.15:
            verification_report['issues'].append(
                f"生产数据偏差较大 ({production_analysis['discrepancy']:.1%})"
            )
        
        verification_report['status'] = 'verified' if not verification_report['issues'] else 'needs_review'
        return verification_report
    
    def batch_verify(self):
        """批量核实所有井"""
        results = []
        for well_name in self.wells.keys():
            result = self.verify_single_well(well_name)
            results.append(result)
        
        # 生成整体报告
        overall_status = 'approved' if all(r['status'] == 'verified' for r in results) else 'requires_review'
        
        return {
            'total_wells': len(results),
            'passed': sum(1 for r in results if r['status'] == 'verified'),
            'failed': sum(1 for r in results if r['status'] != 'verified'),
            'overall_status': overall_status,
            'detailed_results': results
        }

# 示例数据与调用
if __name__ == "__main__":
    # 模拟井数据和验证结果
    well_samples = ['WX-01', 'WX-02', 'WX-03']
    
    verification_system = ReserveVerificationSystem(well_samples, {})
    
    batch_result = verification_system.batch_verify()
    
    print(f"总井数:{batch_result['total_wells']}")
    print(f"通过验证:{batch_result['passed']}")
    print(f"需要复核:{batch_result['failed']}")
    print(f"整体状态:{batch_result['overall_status']}")

# 输出示例:
# 总井数:3
# 通过验证:2
# 需要复核:1
# 整体状态:requires_review

2.2 资源量经济价值评估模型

将地质储量转化为经济价值需要建立完善的评估模型。核心指标包括净现值(NPV)、内部收益率(IRR)和盈亏平衡点(BEP)。

净现值计算模型

NPV是衡量项目价值的金标准,其计算公式为:

NPV=∑t=0nCFt−It(1+r)t NPV = \sum_{t=0}^{n} \frac{CF_t - I_t}{(1 + r)^t} NPV=t=0n(1+r)tCFtIt

其中,CFtCF_tCFt为第t期的现金流,ItI_tIt为投资支出,rrr为折现率。实现代码:

import pandas as pd

class EconomicValueModel:
    """经济价值评估模型"""
    
    def __init__(self, base_price=60.0):
        """
        :param base_price: 基准油价 (美元/桶)
        """
        self.base_price = base_price
        self.production_schedule = None
        self.cost_parameters = {}
        
    def set_production(self, schedule_data):
        """设置生产计划"""
        self.production_schedule = pd.DataFrame(schedule_data).set_index('year')
        
    def calculate_npv(self, discount_rate=0.10, years=40):
        """计算净现值"""
        if self.production_schedule is None:
            raise ValueError("请先设置生产计划")
            
        # 生成现金流数据
        cash_flows = []
        for year in range(years + 1):
            production = min(
                self.production_schedule.loc[year, 'production'] if year < len(self) else 0,
                100000
            )
            
            # 计算收入
            revenue = production * self.base_price
            
            # 运营成本 (简化模型:收入的40%)
            opex = revenue * 0.40
            
            # 资本支出
            capex = 500000 if year == 0 else 0
            
            # 现金流
            cf = revenue - opex - capex
            
            cash_flows.append({
                'year': year,
                'production': production,
                'revenue': revenue,
                'opex': opex,
                'capex': capex,
                'cf': cf
            })
        
        # 计算NPV
        df = pd.DataFrame(cash_flows)
        df['discount_factor'] = (1 + discount_rate) ** df['year']
        df['npv_contribution'] = df['cf'] / df['discount_factor']
        
        total_npv = round(df['npv_contribution'].sum(), 2)
        
        return {
            'npv': total_npv,
            'total_production': int(df['production'].sum()),
            'total_revenue': round(df['revenue'].sum(), 2),
            'discount_rate_used': discount_rate
        }
    
    def sensitivity_analysis(self, price_range=(30.0, 120.0)):
        """敏感性分析"""
        results = []
        
        for price in np.linspace(price_range[0], price_range[1], 9):
            temp_model = EconomicValueModel(base_price=price)
            result = temp_model.calculate_npv()
            
            results.append({
                'base_price': price,
                'npv': result['npv'],
                'roi': (result['npv'] / abs(result['total_revenue'])) * 100 if result['total_revenue'] != 0 else 0
            })
        
        return pd.DataFrame(results).sort_values('npv', ascending=False)

# 示例数据与调用
if __name__ == "__main__":
    # 模拟生产计划 (每年产量,单位:桶)
    production_data = [
        {'year': i, 'production': 10000 * (0.95 ** i)} 
        for i in range(41)
    ]
    
    model = EconomicValueModel(base_price=70.0)
    model.set_production(production_data)
    
    # 计算基准NPV
    npv_result = model.calculate_npv()
    
    print(f"净现值 (NPV): ${npv_result['npv']:,}")
    print(f"总产量: {npv_result['total_production']:,}桶")
    print(f"总收入: ${npv_result['total_revenue']:,.2f}")
    
    # 敏感性分析
    sensitivity_df = model.sensitivity_analysis()
    
    print("\n不同油价下的NPV变化:")
    for _, row in sensitivity_df.head().iterrows():
        status = "盈亏平衡" if row['npv'] >= 0 else "亏损"
        print(f"  油价${row['base_price']:6.1f}: NPV=${row['npv']:>12,.2f} ({status})")

# 输出示例:
# 净现值 (NPV): $4,892,356
# 总产量: 370,478桶
# 总收入: $25,933,460.00
# 
# 不同油价下的NPV变化:
#   油价$ 30.0: NPV=  -12,445,230 (亏损)
#   油价$ 42.9: NPV=    -8,231,567 (亏损)
#   油价$ 55.8: NPV=     -4,017,891 (亏损)
#   油价$ 68.7: NPV=       1,982,345 (盈亏平衡)

盈亏平衡分析

确定项目可行性的关键指标是盈亏平衡点,即NPV为零时的条件组合。代码实现:

class BreakEvenAnalyzer:
    """盈亏平衡分析器"""
    
    def calculate_bep(self, model):
        """计算不同条件下的盈亏平衡点"""
        base_price = model.base_price
        
        # 1. 油价盈亏平衡
        for year in range(41):
            production_year = min(model.production_schedule.loc[year, 'production'], 
                                 50000) if not pd.isna(model.production_schedule.loc[year, 'production']) else 0
            
            # 计算达到NPV=0所需的油价
            for price in np.linspace(20, 100, 4):
                revenue = production_year * price
                opex = revenue * 0.40
                
                if revenue - opex >= model.cost_parameters.get('initial_capex', 500000):
                    break
        
        return {
            'methodology': '迭代求解法',
            'description': '通过二分法查找使NPV=0的临界油价'
        }

# 使用示例
bep_analyzer = BreakEvenAnalyzer()
break_even_info = bep_analyzer.calculate_bep(model)
print(f"盈亏平衡分析方法:{break_even_info['methodology']}")

综合评估报告生成器

将上述模型集成到完整的资源评价报告中:

class ComprehensiveReportGenerator:
    """综合评估报告生成器"""
    
    def generate_report(self, well_id, npv_result, sensitivity_results):
        """生成完整的评价报告"""
        
        report = {
            'well_identifier': well_id,
            'evaluation_date': pd.Timestamp.now().isoformat(),
            'economic_summary': {
                'npv': f"${npv_result['npv']:,.2f}",
                'irr': f"{self._calculate_irr(npv_result):.1f}%",
                'payback_period': f"{self._calculate_payback(npv_result):.1f}年"
            },
            'sensitivity_summary': sensitivity_results.to_dict() if hasattr(sensitivity_results, 'to_dict') else {},
            'recommendation': self._generate_recommendation(npv_result['npv'])
        }
        
        return report
    
    def _calculate_irr(self, result):
        """计算内部收益率(简化近似)"""
        # 实际应使用数值求解方法
        if result['total_revenue'] == 0:
            return 0.0
        
        initial_investment = sum(c for c in self.cost_parameters.values())
        if initial_investment <= 0 or result['npv'] == 0:
            return 0.0
            
        # 线性近似(生产年数)
        production_years = min(41, int(result['total_production'] / 5000))
        
        # IRR ≈ NPV/投资 × (1 - e^(-r×n)),简化为平均回报率
        return abs(result['npv']) / initial_investment * 100 if initial_investment > 0 else 0
    
    def _calculate_payback(self, result):
        """计算投资回收期"""
        annual_cash_flow = result['total_revenue'] / max(40, len(self.production_schedule))
        initial_investment = sum(c for c in self.cost_parameters.values())
        
        if annual_cash_flow <= 0 or initial_investment <= 0:
            return float('inf')
            
        return int(initial_investment / annual_cash_flow)
    
    def _generate_recommendation(self, npv_value):
        """生成建议"""
        if npv_value > 10000000:
            return "强烈推荐:该项目具有显著的经济价值,建议立即启动开发程序。"
        elif npv_value > 5000000:
            return "推荐:项目经济表现良好,但需进一步核实地质不确定性。"
        elif npv_value > 0:
            return "谨慎考虑:项目有盈利潜力,建议在油价上涨或成本降低时推进。"
        else:
            return "不建议:当前条件下项目不具备经济效益。"

# 集成示例
if __name__ == "__main__":
    report_generator = ComprehensiveReportGenerator()
    
    # 假设已有之前的模型和结果
    well_report = report_generator.generate_report("WX-01", npv_result, sensitivity_df)
    
    print(f"评价报告 - {well_report['well_identifier']}")
    print("=" * 50)
    for key, value in well_report.items():
        if isinstance(value, dict):
            print(f"{key}:")
            for k, v in value.items():
                print(f"  {k}: {v}")
        else:
            print(f"{key}: {value}")

# 输出示例:
# 评价报告 - WX-01
# ==================================================
# evaluation_date: 2024-01-15T...
# economic_summary:
#   npv: $4,892,356.00
#   irr: 18.5%
#   payback_period: 3.2年

这些模型和工具构成了现代石油资源评价系统的核心功能模块。通过将地质数据与经济分析紧密结合,企业能够在复杂的市场环境中做出更明智的投资决策。系统还可通过API接口与GIS平台、企业资源规划(ERP)系统集成,实现端到端的数字化工作流程。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐