Tutorial lengkap menjalankan kontrak Gross Split (GS) menggunakan PySCnomics. Menggunakan data dummy lapangan minyak.
from datetime import date
import numpy as np
from pyscnomics.contracts.grossplit import GrossSplit
from pyscnomics.contracts.project import BaseProject
from pyscnomics.econ.revenue import Lifting
from pyscnomics.econ.costs import CapitalCost, Intangible, OPEX, ASR, LBT, CostOfSales
from pyscnomics.econ.selection import (
FluidType, CostType, VariableSplit082017, VariableSplit132024,
TaxRegime, DeprMethod, GrossSplitRegime, OtherRevenue,
)
Catatan:
CostTypemenentukan klasifikasi biaya —SUNK_COST,PRE_ONSTREAM_COST, atauPOST_ONSTREAM_COST. Untuk contoh sederhana, kita gunakanNone(default).
Profil produksi minyak 2022–2035 (14 tahun), produksi aktif 2024–2035.
| Tahun | Produksi (MSTB) | Harga (USD/bbl) |
|---|---|---|
| 2024 | 1,003.02 | 75 |
| 2025 | 1,752.43 | 75 |
| 2026 | 1,660.63 | 75 |
| 2027 | 1,646.06 | 75 |
| 2028 | 1,303.30 | 75 |
| 2029 | 1,206.56 | 75 |
| 2030 | 715.46 | 75 |
| 2031 | 575.35 | 75 |
| 2032 | 385.41 | 75 |
| 2033 | 177.90 | 75 |
| 2034 | 95.56 | 75 |
| 2035 | 53.09 | 75 |
Total: 10,574.78 MSTB. OIIP: 33,046 MSTB. RF: 32%.
| Tahun | Tangible | Intangible | OPEX | ASR | LBT |
|---|---|---|---|---|---|
| 2024 | 46,771 | 138,789 | 971 | 479 | 0 |
| 2025 | 39,368 | 64,992 | 2,457 | 839 | 1,718 |
| 2026 | 14,093 | 1,018 | 3,101 | 1,137 | 3,752 |
| 2027 | 146 | 1,110 | 3,499 | 1,137 | 3,813 |
| 2028 | 205 | 1,724 | 3,644 | 1,137 | 2,747 |
| 2029–2035 | 0 | 0 | 4,145–491 | 1,137 | 1,972–191 |
| Parameter | Nilai |
|---|---|
| Base Split | 43% |
| Field Status | No POD |
| Field Location | Onshore |
| Reservoir Depth | ≤ 2,500 m |
| Infrastructure | Well Developed |
| Reservoir Type | Conventional |
| API Oil | < 25 |
| Local Content | 50%–70% |
| Production Stage | Secondary |
| CO₂ | < 5% |
| H₂S | < 100 ppm |
| Ministry Discretion | 8% |
| Total Variable Split | 10% |
| Effective Tax Rate | 20% |
VS_08 = VariableSplit082017
VS_13 = VariableSplit132024
fluid = FluidType.OIL
years = np.arange(2022, 2036)
n = 14
# --- Lifting ---
oil_prod = np.zeros(n)
oil_prod[2:] = [1003.0199446529831, 1752.432145956366, 1660.6301731419717,
1646.0627763447706, 1303.3041984413528, 1206.5639873521618,
715.4645972478986, 575.3514499534913, 385.4081882123877,
177.89615342446643, 95.56081329460324, 53.0868811432885]
lifting = (Lifting(start_year=2022, end_year=2035,
prod_year=years, lifting_rate=oil_prod,
price=np.full(n, 75.0), fluid_type=fluid),)
# --- Biaya ---
tangible = np.zeros(n)
tangible[2:] = [46770.5618086779, 39367.67438303412, 14092.60474684542,
146.20020959318614, 205.10626669388003, 0, 0, 0, 0, 0, 0, 0]
intangible = np.zeros(n)
intangible[2:] = [138789.4636326723, 64991.89684568776, 1017.6646628267224,
1109.753846284434, 1724.021720150022, 0, 0, 0, 0, 0, 0, 0]
opex_val = np.zeros(n)
opex_val[2:] = [971.2922341140787, 2457.377778672174, 3101.4741007518423,
3499.0467473904023, 3643.771494577852, 4144.810944579345,
4557.104202201483, 3879.7855889175835, 3433.613808830112,
3469.404403154051, 1683.435935644883, 491.3875687921439]
asr_val = np.zeros(n)
asr_val[2:] = [478.5713313792797, 838.6798590511097, 1136.9994880186798,
1136.9994880186798, 1136.9994880186798, 1136.9994880186798,
1136.9994880186798, 1136.9994880186798, 1136.9994880186798,
1136.9994880186798, 1136.9994880186798, 1136.9994880186798]
lbt_val = np.zeros(n)
lbt_val[2:] = [0, 1718.3047696724527, 3752.2309976639744, 3812.962759566481,
2746.8873646581274, 1971.6202492861562, 1464.0091477535566,
1000.5000676199533, 814.8407519884357, 457.1311522471098,
356.6056525662459, 191.29623638486623]
cap = (CapitalCost(start_year=2022, end_year=2035, expense_year=years,
cost=tangible, cost_allocation=[fluid]*n,
cost_type=[None]*n, pis_year=np.full(n, 2024),
useful_life=np.full(n, 5)),)
itg = (Intangible(start_year=2022, end_year=2035, expense_year=years,
cost=intangible, cost_allocation=[fluid]*n,
cost_type=[None]*n),)
opx = (OPEX(start_year=2022, end_year=2035, expense_year=years,
fixed_cost=opex_val, cost_allocation=[fluid]*n,
cost_type=[None]*n),)
asr = (ASR(start_year=2022, end_year=2035, expense_year=years,
cost=asr_val, cost_allocation=[fluid]*n,
cost_type=[None]*n),)
lbt = (LBT(start_year=2022, end_year=2035, expense_year=years,
cost=lbt_val, cost_allocation=[fluid]*n,
cost_type=[None]*n),)
cos = (CostOfSales(start_year=2022, end_year=2035, expense_year=years,
cost=np.zeros(n), cost_allocation=[fluid]*n,
cost_type=[None]*n),)
# --- Kontrak Gross Split ---
gs = GrossSplit(
start_date=date(2022, 1, 1), end_date=date(2035, 12, 31),
oil_onstream_date=date(2024, 1, 1), gas_onstream_date=None,
approval_year=2023, is_pod_1=True, is_strict=False,
lifting=lifting, capital_cost=cap, intangible_cost=itg,
opex=opx, asr_cost=asr, lbt_cost=lbt, cost_of_sales=cos,
# Variable split
field_status=VS_08.FieldStatus.NO_POD,
field_loc=VS_08.FieldLocation.ONSHORE,
res_depth=VS_08.ReservoirDepth.LESSEQUAL_2500,
infra_avail=VS_08.InfrastructureAvailability.WELL_DEVELOPED,
res_type=VS_08.ReservoirType.CONVENTIONAL,
api_oil=VS_08.APIOil.LESSTHAN_25,
domestic_use=VS_08.DomesticUse.EQUAL_50_UNTIL_LESSTHAN_70,
prod_stage=VS_08.ProductionStage.SECONDARY,
co2_content=VS_08.CO2Content.LESSTHAN_5,
h2s_content=VS_08.H2SContent.LESSTHAN_100,
# Progressive split (Permen ESDM 13/2024)
field_reserves_2024=VS_13.FieldReservesAmount.MEDIUM,
infra_avail_2024=VS_13.InfrastructureAvailability.PARTIALLY_AVAILABLE,
field_loc_2024=VS_13.FieldLocation.ONSHORE,
# Ministry discretion
split_ministry_disc=0.08,
# DMO
oil_dmo_volume_portion=0.25, oil_dmo_fee_portion=1.0,
oil_dmo_holiday_duration=0,
gas_dmo_volume_portion=1.0, gas_dmo_fee_portion=1.0,
gas_dmo_holiday_duration=0,
# Carry forward
oil_carry_forward_depreciation=0.0,
gas_carry_forward_depreciation=0.0,
)
gs.run(
effective_tax_rate=0.2,
is_dmo_end_weighted=False,
tax_regime=TaxRegime.NAILED_DOWN,
depr_method=DeprMethod.PSC_DB, decline_factor=2,
sum_undepreciated_cost=False,
cum_production_split_offset=0.0,
amortization=False,
regime=GrossSplitRegime.PERMEN_ESDM_13_2024,
reservoir_type_permen_2024=VS_13.ReservoirType.MK,
sulfur_revenue=OtherRevenue.ADDITION_TO_GAS_REVENUE,
electricity_revenue=OtherRevenue.ADDITION_TO_GAS_REVENUE,
co2_revenue=OtherRevenue.ADDITION_TO_GAS_REVENUE,
vat_rate=0.0,
)
s = gs.get_summary()
| Metrik | Nilai |
|---|---|
| Gross Revenue | 793,108.60 MUSD |
| CTR Gross Share | 713,797.74 MUSD |
| Sunk Cost | 0.00 MUSD |
| CTR Net Share | 271,421.32 MUSD |
| CTR NPV | 123,793.72 MUSD |
| CTR IRR | 39.56% |
| Gov Take | 147,166.19 MUSD (18.56%) |
Dengan data produksi yang berbeda (CR: 1,350 MSTB, GS: 10,575 MSTB), perbandingan ini menunjukkan perbedaan skenario:
| Metrik | CR Oil Only | GS Oil Only |
|---|---|---|
| Gross Revenue | 101,224 MUSD | 793,109 MUSD |
| CTR Net Share | 5,932 MUSD | 271,421 MUSD |
| CTR NPV | -15,998 MUSD | 123,794 MUSD |
| Gov Take | 9,119 MUSD (9.01%) | 147,166 MUSD (18.56%) |
Catatan: Perbandingan ini tidak apple-to-apple karena data produksi dan biaya berbeda. Untuk perbandingan yang adil, gunakan data yang identik pada kedua rezim kontrak.
Kontrak GS menggunakan tiga mekanisme:
Total split = Base + Variable + Progressive + Ministry Discretion.