mcpField
T
trip-calculator

trip-calculator

github.com/borski生产力78076 次安装2 天前更新
代码仓库

关于 trip-calculator

这项旅行积分技能比较现金预订与积分兑换,并计入税费、转点比例和保留积分的价值,适合决定机票或酒店如何付款的旅客。

主要功能

  1. 01比较现金与积分成本
  2. 02按转点比例调整成本
  3. 03计入税费
  4. 04评估积分价值与机会成本
  5. 05比较机票和酒店兑换

适用场景

  1. 01决定机票用现金还是积分
  2. 02比较不同计划的兑换路线
  3. 03评估酒店积分兑换

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill trip-calculator

安装后在 Claude Code 中输入/trip-calculator确认已加载。

详细介绍

旅行费用计算器

“我该付现金还是用积分?”用数学来回答。

比较用现金预订与使用每种可用积分货币预订的实际成本,并考虑转点比例、税费,以及使用积分的机会成本。

无需 API 密钥。 使用本地 JSON 数据文件和航班/酒店搜索结果。

数据文件

文件用途
data/points-valuations.json各计划的 CPP 估值(下限/上限)
data/transfer-partners.json信用卡 → 忠诚度计划的转点比例

适用场景

  • 用户同时有现金价格(来自 Duffel/Ignav/Google Flights)和奖励票价格(来自 seats.aero)
  • 用户询问“我该付现金还是用积分?”
  • 用户想知道某次兑换的 CPP
  • 用户正在为一次旅行在多种预订策略之间做决定

核心概念

每点美分数(CPP)

兑换时每点积分能获得的价值:

cpp = (cash_price - taxes_on_award) / points_needed × 100

CPP 高于 points-valuations.json 中的估值下限,表示获得了高于平均水平的价值。低于下限则表示兑换价值较低。

机会成本

即使不使用,积分也有价值。将 100K Chase UR 按 1.7 cpp(下限)兑换,意味着你在“花费”未来旅行灵活性的 $1,700:

opportunity_cost = points_needed × floor_cpp / 100

如果现金价格低于机会成本,就付现金。如果更高,就用积分。

决策框架
IF cash_price < opportunity_cost → PAY CASH (points are worth more saved)
IF cash_price > opportunity_cost → USE POINTS (good redemption)
IF cash_price ≈ opportunity_cost → PAY CASH (preserve flexibility)

平手时选择现金,因为积分能保留更多选择空间。

工作流程

第 1 步:收集价格

现金价格(使用一个或多个来源):

Duffel API → exact bookable fares
Ignav API → fast comparison prices
Google Flights → browser-based, includes Southwest

奖励票价格(使用 seats.aero):

Seats.aero API → cached availability across 25+ programs
Seats.aero web → live search (local Patchright only)
第 2 步:计算每种奖励兑换的 CPP

对于每种有对应现金价格的奖励兑换选项:

cpp = (cash_price_usd - award_taxes_usd) / award_miles × 100

奖励票税费来自 seats.aero 行程详情中的 TotalTaxes 字段(单位为美分),也可以按每个航段估算:美国国内航线为 $5.60,国际航线为 $50-$200(因承运方和航线而异,差异很大)。

第 3 步:考虑转点比例

如果使用可转点数(Chase UR、Amex MR 等),实际所需积分会变化:

effective_points = award_miles / transfer_ratio
effective_cpp = (cash_price - award_taxes) / effective_points × 100

示例:通过 Capital One 兑换 Flying Blue 奖励票,所需 50,000 英里(比例为 1:1):

  • 实际所需积分:50,000
  • 现金价格:$1,200,税费:$100
  • CPP:($1,200 - $100)/ 50,000 × 100 = 2.2 cpp

对比:通过 Capital One 兑换另一张 Emirates 奖励票,所需 72,500 Skywards 英里(比例为 4:3,是 Capital One 最差的转点比例):

  • 实际所需积分:72,500 / 0.75 = 96,667 Capital One 英里
  • 相同的 $1,200 现金等值价格:($1,200 - $100)/ 96,667 × 100 = 1.14 cpp。不如 Flying Blue 方案。

重要:为目标计划选择最佳积分货币。 Emirates Skywards 可从 Bilt Rewards 按 1:1 转点(无手续费,即时到账)。兑换同一张 Emirates 奖励票,72,500 Bilt = 72,500 Skywards =($1,200 - $100)/ 72,500 × 100 = 1.52 cpp。在建议转点前,始终检查 data/transfer-partners.json,确认用户持有的每种可转点数对应的转点方式——Bilt 转至 Emirates 的 1:1 比例远优于 Capital One 的 4:3。该技能会在第 0 步强制执行此要求(先加载 transfer-partners,列出所有可行路径)。

第 4 步:与估值比较

从 points-valuations.json 加载估值:

jq -r '.credit_card_points.chase_ultimate_rewards | "Chase UR: floor \(.floor)cpp, ceiling \(.ceiling)cpp"' data/points-valuations.json
评级CPP 与下限的比较含义
极佳> 上限非常划算的兑换。直接预订。
良好> 下限高于平均水平。积分用得不错。
一般下限的 0.8× 到 1×表现平平。可以考虑付现金。
较差< 下限的 0.8×不划算。付现金。
第 5 步:展示对比

始终使用 Markdown 表格。

航班:SFO → NRT 商务舱,8 月 15 日
选项计划里程/积分税费现金等值CPP评级
现金———$4,200——
通过 Chase UR 使用 UnitedUnited88,000 UR$45$1,4964.72极佳
通过 Chase UR 使用 AeroplanAeroplan75,000 UR$120$1,2755.44极佳
通过 Bilt 使用 AlaskaAlaska55,000 Bilt$30$9357.58极佳
通过 Chase UR 使用 Virgin Atlantic → ANAVA52,500 UR$200$8937.62极佳

建议:

  • 最佳价值: Virgin Atlantic,7.62 cpp,但税费为 $200,且必须致电预订。
  • 最方便: Aeroplan,5.44 cpp,可在线预订,税费较低。
  • 现金价格($4,200)与机会成本($893-$1,496)相比: 积分明显更划算。使用积分。
第 6 步:往返和多航段行程

往返行程要分别计算两个方向。奖励票价格通常按单程计算,现金票价则通常按往返计算。请确保比较的项目一致:

If cash = round-trip $4,200:
  Compare against: outbound award + return award
  e.g., 75K out + 75K return = 150K total vs $4,200 cash
  CPP = ($4,200 - $240 taxes) / 150,000 = 2.64 cpp

jq 示例

获取某种货币的最低估值
jq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json
计算机会成本
# 75,000 Chase UR points
POINTS=75000
FLOOR=$(jq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json)
echo "$POINTS points × $FLOOR cpp = \$$(echo "$POINTS * $FLOOR / 100" | bc) opportunity cost"
比较一条航线的完整方案
# Cash: $4200 round trip. Award: 75000 Aeroplan each way, $120 taxes each way.
CASH=4200
MILES_ONEWAY=75000
TAXES_ONEWAY=120
TOTAL_MILES=$((MILES_ONEWAY * 2))
TOTAL_TAXES=$((TAXES_ONEWAY * 2))

echo "Cash: \$$CASH"
echo "Award: $TOTAL_MILES miles + \$$TOTAL_TAXES taxes"
echo "CPP: $(echo "scale=2; ($CASH - $TOTAL_TAXES) / $TOTAL_MILES * 100" | bc)"

# Opportunity cost at floor valuation
FLOOR=$(jq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json)
echo "Opportunity cost: \$$(echo "scale=0; $TOTAL_MILES * $FLOOR / 100" | bc)"

酒店比较

同一套框架也适用于酒店:

hotel_cpp = (cash_rate_per_night × nights) / total_points × 100

酒店积分兑换的差异比机票更大。请使用 points-valuations.json 中的酒店部分:

  • Hyatt:最低估值为 1.4 cpp(始终是最佳酒店积分货币)
  • Hilton:最低估值为 0.4 cpp(所需积分多,每积分价值低)
  • Marriott:最低估值为 0.6 cpp

比较现金与积分时,对于高端酒店计划(FHR、THC、Chase Edit),还要考虑额外礼遇(早餐、房型升级、额度、延迟退房)。每晚 $500 的 FHR 房价若附带 $100 早餐额度和潜在套房升级,其价值可能高于标价。

Chase Travel 门户与积分转点

Chase Sapphire Reserve 在 Chase 旅行门户中采用动态 Points Boost 定价:部分预订的价值约为 1.5-2.0 cpp,但并非每笔预订都能保证达到这一最低值。过去固定的 1.5 cpp 倍率已不再适用——当前兑换价值会因航线、日期和库存而异。假定兑换率之前,务必查看门户中的实际价格。

粗略决策规则,但请注意,必须核实门户中的实际报价:

If actual portal CPP > award CPP → portal wins
If award CPP > actual portal CPP → transfer to partner wins

Sapphire Preferred 类似(通过 Points Boost 通常为 1.5-1.75 cpp)。Amex 门户的机票兑换价值约为 1.0 cpp(每个 MR 积分 1 美分)。Capital One 门户约为 0.75-1.0 cpp。

在建议使用积分还是门户预订之前,务必通过 chase-travel 或 amex-travel 技能查询门户的实际报价。 不要假设标示的兑换率适用于你的具体预订。

常见误区

  • 忽略奖励票的税费。 有些航空公司(尤其是 BA、Lufthansa,以及使用自有机队执飞的 Singapore)会在奖励票上加收 $500 以上的燃油附加费。计算 CPP 前务必扣除税费。
  • 将单程奖励票与往返现金票价比较。 确保计算分母一致。
  • 忘记转点比例。 通过 Amex 以 5:4 的比例转点至 Emirates,兑换 50K 里程需要 62,500 MR,而非 50,000。
  • 未查询门户价格。 有时 Chase/Amex 门户价格比转点计算结果更划算。
  • 过度优化微小差异。 如果两个选项的差距不超过 0.5 cpp,请选择航线更好、税费更低或灵活性更高的方案。

备注

  • 积分估值具有主观性。points-valuations.json 中的最低估值是最站得住脚的数字。
  • “机会成本”假设你最终会以最低估值使用这些积分。如果你持有大量积分却没有使用计划,实际机会成本会更低。
  • 长期持有时,货币贬值风险很重要。积分属于会贬值的资产。
  • 转点奖励可能显著改变计算结果。Chase → Flying Blue 的 30% 奖励意味着 75K UR 可兑换 97.5K Flying Blue 里程。

评论

支持 Markdown