Skip to content

Instantly share code, notes, and snippets.

@makotom
Last active December 18, 2019 03:58
Show Gist options
  • Save makotom/4eb7f0162ce752418aa4069addc5844f to your computer and use it in GitHub Desktop.
Save makotom/4eb7f0162ce752418aa4069addc5844f to your computer and use it in GitHub Desktop.
Mastercard は海外に強いという説は本当か

Mastercard は海外に強いという説は本当か

tl;dr

  • 確かに有意にレートのよい通貨があるが, 逆に有意に不利な通貨もある. 一般に Mastercard のレートがよいとは言い切れない.
  • 有利度の期待値が 0.1 % のオーダー. あまり気にする価値はなさそうだ.

背景

クレジットカード オタクの界隈では, Mastercard のレートがよいということがよく言われる (日本語でぐぐるとわかる). しかし, 検証におけるデータ量が乏しい場合やデータの信頼性に乏しい場合が多く, 本当に Mastercard のレートが有利なのか, 有利な場合どれくらい有利なのかは判断がしづらい現状があった.

ところで, この度, 海外旅行中の現金引き出しに使用するクレジットカードを検討するにあたり, VISA か Mastercard かを選択する必然性に迫られた. そこで, Mastercard および VISA が提示している為替レートの情報を約 1 年分収集し, 本当に Mastercard が VISA よりも有利なレートを使用しているのか検証することにした.

方法

検討する各通貨について, Mastercard の Currency Converter および VISA の Currency Exchange Calculator より 2018 年 12 月 15 日から 2019 年 12 月 13 日まで (両端を含む, 計 364 日) の各日の対日本円適用レートを収集し, 分析した. なお, レートを計算させるにあたり, Mastercard および VISA を利用する金融機関による手数料の割合は 0 とした. 検討する通貨は, 世界的な通貨の流通量, 当該通貨流通地域への日本人渡航者数, JCB が提示している為替レートにある通貨一覧, 筆者個人の独断と偏見を踏まえ, 下記とした.

  • 米ドル
  • ユーロ
  • 英ポンド
  • 香港ドル
  • 中国元
  • シンガポール ドル
  • 豪ドル
  • 韓国ウォン
  • 台湾ドル

結果

次の表は, 各通貨について A: 全期間のうち Mastercard のレートが VISA のレートよりも有利であった日の割合, B: 各日における Mastercard のレートを 1 とした場合の VISA のレートの増分の平均値, C: 各日における Mastercard のレートを 1 とした場合の VISA のレートの増分の 10 パーセンタイル, D: 各日における Mastercard のレートを 1 とした場合の VISA のレートの増分の 90 パーセンタイル を各通貨ごとに示している.

USDEURGBPHKDCNYSGDAUDKRWTWD
A: 有利な日の割合0.703300.664840.351650.637360.447800.750000.618130.752750.34615
B: VISA 増分平均値 (%)0.047960.04658-0.113830.04191-0.010780.102000.067360.14320-0.04531
C: VISA 増分 10 パーセンタイル (%)-0.21597-0.25879-0.56506-0.22563-0.42466-0.19866-0.33860-0.30609-0.37542
D: VISA 増分 90 パーセンタイル (%)0.298630.374680.344450.312840.352690.395940.527780.576800.29283

A について, 生起確率を 0.5 とした二項検定で検討したところ, いずれの通貨についても生起数が有意に多い (0.5 以上の場合) もしくは少ない (0.5 以下の場合) との結論を得た. つまり, 為替レートの有利・不利が純にランダムに発生しうるものと仮定すると, 米ドル, ユーロ, 香港ドル, シンガポール ドル, 豪ドル, 韓国ウォンについては Mastercard のレートが有利である日が有意に多く, 英ポンド, 中国元, 台湾ドルについては Mastercard のレートが不利である日が有意に多かった.

考察

結果 A より, 確かに為替レートの有利不利が存在し, かつ, 今回の調査範囲においては過半数の通貨において Mastercard のレートが有利な日が多いことがわかった. 一方で, 英ポンド, 中国元, 台湾ドルについては VISA のレートの方が有利である日が多いと結論付けられるべきである. このことは, 一般に Mastercard のレートが有利であるとの主張は, さらなる検証なしに支持できるものではないということを示唆している.

さらに興味深いのは結果 B である. 結果 B は 各日における Mastercard のレートを 1 とした場合の VISA のレートの増分の平均値をパーセント単位で示している. つまり, 韓国ウォン (最も Mastercacrd が有利であるように見える通貨である) にて 10 万円相当の決済を行うと, Mastercard で決済した場合の方が平均して 143 円得である, ということを示している. 143 円を笑う意図はないが, 為替レートそのものが数 % から十数 % 変動しうること (現に 2019 年 12 月 18 日までの 52 週において韓国ウォン - 日本円の為替相場は 15 % 程度の変動レンジがあるようである) に鑑みると, Mastercard か VISA かの差は十分に小さいと考えるべきであろう.

上述の主張をさらに支持するのが結果 C および D である. C および D では, いずれの通貨についても 10 パーセンタイルは負数, 90 パーセンタイルは正数であり, それらの絶対値は高々 0.6 であった. つまり, 一方的に偏った分布を持った通貨はなく, いずれの通貨においても 8 割のケースにおいて 10 万円につきプラスマイナス 600 円の範囲に収まることが期待される. この値を, 海外ショッピングにかかる事務手数料 (決済額の約 1.6 % のクレジットカード会社と約 2.2 % の会社があり, その差は 0.6 % である!) や一部クレジットカード会社が徴収する海外キャッシングの ATM 手数料 (2 万円以上の引き出し 1 回につき 200 円というケースが多いだろう) とぜひ比較したい.

以上を踏まえると, 為替レートを理由に Mastercard と VISA の選択をすることは合理的でないと結論付けられる. それよりも, Mastercard および VISA それぞれの独自性や, クレジットカード会社が設定する手数料や各社が強味としているカード ブランド, 所持していないカード ブランドを考慮するのがよいだろう. 具体的には

  • Mastercard なら Apple Pay で EMV コンタクトレスが使える.
  • Mastercard の EMV コンタクトレスの方が優先的に公共交通機関で導入されたケース (i.e. シンガポール) がある.
  • 日本国内では VISA の EMV コンタクトレス (タッチ決済) 対応カードを発行しているクレジットカード会社の方が多い.
  • 海外ショッピングにかかる事務手数料が 1.63 % 以下のカード会社が発行するカードを選ぶ.
  • 海外キャッシング時に ATM 手数料を徴収しないカード会社が発行するカードを選ぶ.
  • 例えば, 三井住友系は VISA (現に三井住友カードのコンタクトレスは VISA から導入が始まっている), オリコであれば Mastercard (現にオリコのホームページ上で募集しているプロパー カードで VISA が選べるのは 4 種類のみ) を強味としている.

といった事項を考慮するのがよいと考える.

参考までに, 筆者はオリコの Mastercard をメインで使用している (歴史的に Mastercard PayPass のユーザーである) が, 本稿執筆の前後に入会したセディナについては VISA を選択した (問い合わせたところセディナカードで VISA を選択する EMV コンタクトレス対応になることがわかったため).

参考

データ収集に使用したプログラムのサンプルを添付する.

免責事項

  • 本稿を執筆するにあたり, 本稿中で言及のある各社からは何の報酬も受けていないことをここで明言する.
  • 本稿の内容および添付のプログラムの使用により生じたいかなる損害についてその責務を追わない.
// THIS IS A SAMPLE CODE. NO WARRANTY. USE THIS AT YOUR OWN RISK.
const fs = require('fs');
const https = require('https');
const getWithRefererPromise = (url, referer) => {
return new Promise((resolve) => {
https.get(url, {
headers: {
"Referer": referer || ''
}
}, (res) => {
const chunks = [];
res.on('data', (data) => {
chunks.push(data);
});
res.on('end', () => {
resolve(Buffer.concat(chunks).toString('utf-8'));
});
});
});
}
const getVisaRate = async (date, from, to) => {
const res = await getWithRefererPromise(
`https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html?amount=100&fee=0&exchangedate=${`${date.getMonth() + 1}`.padStart(2, '0')}%2F${`${date.getDate()}`.padStart(2, '0')}%2F${date.getFullYear()}&fromCurr=${to}&toCurr=${from}`
);
return res !== null ? parseFloat(res.match(/^1 [^<]* = <strong class=converted-amount-value>([\d.]+) .*$/m)[1], 10) : null;
};
const getMasterRate = async (date, from, to) => {
const res = await getWithRefererPromise(
`https://www.mastercard.us/settlement/currencyrate/fxDate=${date.toISOString().split('T')[0]};transCurr=${from};crdhldBillCurr=${to};bankFee=0;transAmt=100/conversion-rate`,
'https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html'
);
try {
const resObj = JSON.parse(res);
return resObj.data.conversionRate;
} catch {
return null;
}
};
(async () => {
const onThisDay = new Date();
const today = new Date();
const outputFileName = 'output.tsv';
fs.writeFileSync(outputFileName, [['Date', 'USDJPY (V)', 'USDJPY (M)', 'EURJPY (V)', 'EURJPY (M)', 'GBPJPY (V)', 'GBPJPY (M)'].join('\t')]);
fs.appendFileSync(outputFileName, '\n');
for (
onThisDay.setFullYear(today.getFullYear() - 1);
onThisDay.getTime() <= today.getTime();
onThisDay.setTime(onThisDay.getTime() + 1000 * 60 * 60 * 24)
) {
const row = [];
row.push(onThisDay.toISOString().split('T')[0]);
row.push(await getVisaRate(onThisDay, 'USD', 'JPY'));
row.push(await getMasterRate(onThisDay, 'USD', 'JPY'));
row.push(await getVisaRate(onThisDay, 'EUR', 'JPY'));
row.push(await getMasterRate(onThisDay, 'EUR', 'JPY'));
row.push(await getVisaRate(onThisDay, 'GBP', 'JPY'));
row.push(await getMasterRate(onThisDay, 'GBP', 'JPY'));
fs.appendFileSync(outputFileName, row.join('\t'));
fs.appendFileSync(outputFileName, '\n');
}
})().catch((err) => console.error(err));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment