关于 trip-calculator
这项旅行积分技能比较现金预订与积分兑换,并计入税费、转点比例和保留积分的价值,适合决定机票或酒店如何付款的旅客。
主要功能
- 01比较现金与积分成本
- 02按转点比例调整成本
- 03计入税费
- 04评估积分价值与机会成本
- 05比较机票和酒店兑换
适用场景
- 01决定机票用现金还是积分
- 02比较不同计划的兑换路线
- 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 使用 United | United | 88,000 UR | $45 | $1,496 | 4.72 | 极佳 |
| 通过 Chase UR 使用 Aeroplan | Aeroplan | 75,000 UR | $120 | $1,275 | 5.44 | 极佳 |
| 通过 Bilt 使用 Alaska | Alaska | 55,000 Bilt | $30 | $935 | 7.58 | 极佳 |
| 通过 Chase UR 使用 Virgin Atlantic → ANA | VA | 52,500 UR | $200 | $893 | 7.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 里程。