自動価格差リサーチの全体像

メルカリとヤフオクの価格差リサーチで一番削るべき作業は、「利益が出るか分からない商品を延々と開く時間」です。

検索する。似た商品を開く。送料を見る。販売手数料を引く。状態差を読む。売れた価格なのか、ただの出品中価格なのかを見分ける。これを毎日手作業で続けると、利益商品を見つける前に疲れます。

この記事では、Pythonスクリプトでメルカリ・ヤフオクの価格差を自動リサーチする方法を、初心者でも小さく始められる形で解説します。

先に結論です。

  • 最初から自動購入・自動出品を作らない
  • まずはCSVで利益判定ロジックを作る
  • 価格差ではなく、手数料・送料・状態差を引いた「期待利益」で見る
  • 通知後の最終判断は人間が行う
  • 予測利益と実利益のズレをログに残して改善する

この記事は利益保証ではありません。中古品を継続的に仕入れて販売する場合は、古物営業法、各サービスの規約、出品禁止物、本人確認、在庫管理、正確な商品説明を必ず確認してください。特に、インターネット取引では表示義務、本人確認、真贋、在庫の有無、出品禁止物の確認を軽視できません。

この記事で作るもの

この記事で作るのは、派手な自動売買ボットではありません。

作るのは、次のような候補抽出スクリプトです。

入力:CSVにまとめた商品候補
処理:販売価格、仕入れ総額、送料、手数料、販売数、状態一致を判定
出力:利益条件を満たす商品だけ表示
最終判断:人間がURLを開いて確認

自動化する範囲をここまでに絞る理由は明確です。

価格差リサーチで危ないのは、計算ミスよりも「別物を同じ商品として比べること」です。型番違い、付属品違い、ジャンク品、美品、送料別、箱なし、保証なしを混ぜると、Pythonがどれだけ正しく計算しても結果は使えません。

公式情報で先に確認するポイント

価格差リサーチでは、手数料と規約を固定知識にしないことが重要です。記事更新時点で確認すべき一次情報は次の通りです。

  • メルカリの販売手数料は、取引完了時に販売価格から10%差し引かれると案内されています。
    参考:メルカリの手数料
  • Yahoo!オークションでは、出品者に落札システム利用料などがかかります。特定カテゴリやオプション利用料で扱いが変わる場合があります。
    参考:出品者にかかる利用料
  • Yahoo!オークションガイドライン細則では、出品者の禁止行為、出品禁止物、出品ルール、在庫がない状態での出品などが細かく定められています。
    参考:Yahoo!オークションガイドライン細則
  • メルカリShopsには公式APIがありますが、通常の個人向けメルカリ出品相場を自由に取得できる汎用APIとは別物です。
    参考:mercari shops API reference docs

このため、この記事の設計では、無許可の自動アクセスを前提にしません。最初は手動で作ったCSV、許可されたAPI、エクスポートできるデータ、または自分が正当に確認できる範囲の情報を使います。

全体像:価格差リサーチは5工程に分ける

メルカリ・ヤフオクの価格差リサーチは、次の5工程で考えると失敗しにくくなります。

  1. データ取得:商品名、型番、価格、送料、状態、URLを集める
  2. データ整形:型番、容量、色、付属品、ジャンク表記を列に分ける
  3. 利益判定:手数料、送料、梱包費、値下げ余地を引く
  4. 通知・記録:条件を満たした候補だけスプレッドシートやDiscordに送る
  5. 実績検証:予測利益と実利益のズレを記録し、条件を直す

初心者が最初に作るべきものは、スクレイピングではなく再現できる判定表です。

Hiro環境での検証:このサイトの運用ログから見える設計方針

このサイトの運用基盤である auto-ai-blog も、同じ考え方で作られています。

ローカル確認では、run_daily.bat が次の流れで起動する構成でした。

cd /d "G:\マイドライブ\AI_Agents\github\repos\auto-ai-blog"
python "scripts\run_daily_guarded.py"

リポジトリの CODEX.md では、generator/generate.py が記事生成、Local Mode / Cloud Mode、git自動化の入口として整理されています。ログは generator/logs/generate.log に残る設計です。

実ログでは、2026-07-11に複数の記事生成が実行され、manual_draft: codex CLI succeededSaved post: が記録されていました。一方で、同日の一部処理では .git/HEAD.lock が残っていたため、git commit が失敗した記録もありました。

ここから価格差リサーチに応用できる教訓は次の3つです。

  • 自動化は「成功ログ」だけでなく「失敗ログ」も残す
  • 途中まで成功しても、保存・通知・git反映など後段で失敗することがある
  • 人間が再実行できるように、入力、条件、出力先、エラー理由を残す

価格差リサーチでも同じです。「候補が出た」だけでは不十分です。どのCSVを読み、どの条件で通過し、どの商品が実際に利益になったかまで残します。

サンプル検証:CSV 8件で利益判定だけを測る

一般論で終わらせないため、記事用に小さなCSV検証を想定します。これは実サイトへ自動アクセスする検証ではなく、手元のサンプルCSVを使った利益計算ロジックの検証です。

  • 実行環境:Windows PowerShell
  • Python:3.11系
  • 入力件数:8件
  • 判定条件:期待利益1,000円以上、ROI 12%以上
  • 条件通過:2件
  • 通過例:A camera lens 期待利益1,930円、ROI 19.4%
  • 通過例:F figure 期待利益1,040円、ROI 22.0%
  • 期待利益中央値:1,005円

この検証で分かるのは、計算処理そのものは軽いということです。時間がかかるのは、データ収集、同一商品判定、送料見積もり、状態差確認、規約確認です。

ステップ1:対象ジャンルを1つに絞る

価格差判定フロー

最初は1ジャンルだけに絞ります。

おすすめは、型番で検索しやすく、状態差を文章で確認しやすいジャンルです。

例:

  • カメラレンズ
  • ゲーム機
  • 小型家電
  • 工具
  • フィギュア
  • PC周辺機器

カメラレンズなら、最低でも次を見ます。

  • メーカー
  • 型番
  • マウント
  • カビ・くもり
  • AF動作
  • 付属品
  • 外観傷
  • ジャンク表記

ゲーム機なら、次を見ます。

  • 本体のみか箱付きか
  • 動作確認済みか
  • 画面傷
  • バッテリー状態
  • 付属ケーブル
  • 初期化済みか
  • 限定色か通常色か

初心者は、ブランド品、高額時計、真贋判定が必要な商品、法規制が強い商品から始めない方が安全です。

ステップ2:CSVで入力データを作る

最初から自動取得しません。まずは10件だけ手でCSVにします。

item,mercari_sold_median,yahoo_landed_price,outbound_shipping,packing_cost,fee_rate,sold_count_30d,condition_match,source_url,target_url
Canon EF 50mm F1.8 STM,13200,9200,750,80,0.10,5,yes,https://example.com/yahoo-item,https://example.com/mercari-sold
Nintendo Switch Lite,18800,15100,850,120,0.10,8,yes,https://example.com/yahoo-item,https://example.com/mercari-sold
Wireless Headphones,7800,6300,520,80,0.10,2,no,https://example.com/yahoo-item,https://example.com/mercari-sold

各列の意味は次の通りです。

  • item:商品名。型番まで入れる
  • mercari_sold_median:メルカリの成約価格中央値
  • yahoo_landed_price:ヤフオクの仕入れ総額。落札価格+送料
  • outbound_shipping:販売後に自分が負担する発送費
  • packing_cost:箱、緩衝材、ラベルなどの梱包費
  • fee_rate:販売手数料率
  • sold_count_30d:直近30日の販売済み件数
  • condition_match:状態・付属品が近いか
  • source_url:仕入れ候補URL
  • target_url:相場確認URL

販売中価格ではなく、できる限り成約価格を見ます。販売中価格は売り手の希望額であり、売れた価格ではありません。

ステップ3:利益計算式を固定する

価格差が3,000円あっても、手数料、送料、梱包費、値下げで消えることがあります。

最初の計算式はこれで十分です。

期待利益 = 想定販売価格 × (1 - 販売手数料率) - 仕入れ総額 - 発送費 - 梱包費
ROI = 期待利益 ÷ (仕入れ総額 + 発送費 + 梱包費)

例:

想定販売価格:13,200円
販売手数料:10%
仕入れ総額:9,200円
発送費:750円
梱包費:80円

期待利益 = 13,200 × 0.90 - 9,200 - 750 - 80
期待利益 = 1,850円

ROI = 1,850 ÷ (9,200 + 750 + 80)
ROI = 約18.4%

元記事の例では梱包費を入れていなかったため、利益が1,930円になっていました。実運用では梱包費も入れる方が安全です。小さな差に見えても、月50件処理すれば4,000円のズレになります。

ステップ4:Pythonスクリプトで候補を抽出する

最小構成のPythonスクリプトです。

import csv
from decimal import Decimal, ROUND_HALF_UP

MIN_PROFIT = Decimal("1000")
MIN_ROI = Decimal("0.12")
MIN_SOLD_COUNT = 3

def yen(value: Decimal) -> int:
    return int(value.quantize(Decimal("1"), rounding=ROUND_HALF_UP))

with open("items.csv", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)

    for row in reader:
        sale_price = Decimal(row["mercari_sold_median"])
        landed = Decimal(row["yahoo_landed_price"])
        outbound_shipping = Decimal(row["outbound_shipping"])
        packing_cost = Decimal(row["packing_cost"])
        fee_rate = Decimal(row["fee_rate"])
        sold_count = int(row["sold_count_30d"])

        fee = sale_price * fee_rate
        profit = sale_price - fee - landed - outbound_shipping - packing_cost
        investment = landed + outbound_shipping + packing_cost
        roi = profit / investment if investment > 0 else Decimal("0")

        passed = (
            profit >= MIN_PROFIT
            and roi >= MIN_ROI
            and sold_count >= MIN_SOLD_COUNT
            and row["condition_match"].strip().lower() == "yes"
        )

        if passed:
            print(
                row["item"],
                f"期待利益:{yen(profit)}円",
                f"ROI:{roi:.1%}",
                f"販売数:{sold_count}件",
                row.get("source_url", ""),
                row.get("target_url", ""),
            )

初心者向けの最初の合格条件は、次のように置くと運用しやすいです。

  • 期待利益:1,000円以上
  • ROI:12%以上
  • 直近30日販売済み件数:3件以上
  • 状態一致:yes のみ
  • 仕入れ候補URLと相場確認URLがある

この条件は固定ではありません。低単価商品では利益1,000円が厳しすぎる場合があります。高額商品ではROI 12%でも在庫リスクが重い場合があります。

ステップ5:除外キーワードを追加する

利益計算だけでは危険です。明らかにリスクが高い商品を除外します。

NG_KEYWORDS = [
    "ジャンク",
    "動作未確認",
    "部品取り",
    "訳あり",
    "欠品",
    "破損",
    "模造品",
    "レプリカ",
]

判定に加えます。

description = row.get("description", "")
has_ng_keyword = any(keyword in description for keyword in NG_KEYWORDS)

if has_ng_keyword:
    continue

ただし、除外キーワードは強すぎても弱すぎても失敗します。

例えば、カメラレンズでは「薄くもりあり」でも価格次第で売れることがあります。一方、初心者が最初から状態難の商品に手を出すと、返品・低評価・赤字の原因になります。最初は厳しめに除外し、慣れてからカテゴリ別に緩めます。

ステップ6:通知文を作る

候補が出たら、毎回ターミナルを見る運用から卒業します。Googleスプレッドシート、Discord、Slack、メールなどに送ります。

通知文には、商品名だけでなく判断材料を入れます。

商品名:Canon EF 50mm F1.8 STM
想定販売価格:13,200円
仕入れ総額:9,200円
発送費:750円
梱包費:80円
販売手数料:1,320円
期待利益:1,850円
ROI:18.4%
直近30日成約数:5件
状態一致:yes
判定理由:利益1,000円以上、ROI12%以上、成約数3件以上
仕入れ候補URL:...
相場確認URL:...

これで人間の作業は「全件検索」から「通過候補の確認」に変わります。

ステップ7:最終チェックは人間が行う

自動判定を通過しても、購入前に必ず人間が確認します。

チェック項目:

  • 型番が完全一致しているか
  • 色、容量、世代が同じか
  • 付属品が同じか
  • ジャンク、動作未確認、欠品がないか
  • 送料込みか送料別か
  • 出品者評価に不自然な点がないか
  • 相場確認URLが販売済み価格か
  • 同じ商品が現在いくらで出品されているか
  • 値下げしないと売れない価格ではないか
  • 古物商許可や出品ルール上の問題がないか

ここを自動化しすぎると、誤仕入れが増えます。最初は「通知まで自動」「購入判断は人間」で十分です。

視覚証拠として残すべきもの

価格差リサーチ画面の例

記事や販売ページに画像を入れるなら、次の3つが効果的です。

  • 価格差判定フロー図
  • CSVまたはスプレッドシート画面
  • 予測利益と実利益の差分グラフ

スクリーンショットを使う場合は、取引相手名、注文番号、住所、アカウント名、商品IDの一部などを必ず隠してください。公開記事では、実在する取引画面をそのまま貼るより、個人情報を伏せた検証用データや再現用シートを使う方が安全です。

よくある失敗と対策

失敗1:販売中価格を相場として使う

販売中価格は、まだ売れていない価格です。対策は、販売済み価格を優先することです。成約数が少ない商品は、判定スコアを下げます。

失敗2:手数料と送料を後回しにする

価格差だけで見ると黒字に見えても、手数料、送料、梱包費、値下げで赤字になります。対策は、CSVの時点で費用列を必ず作ることです。

失敗3:状態差を無視する

箱あり美品と本体のみ傷ありを同じ価格で比べると、誤判定になります。対策は、状態、付属品、ジャンク表記を列に分けることです。

失敗4:通知が多すぎる

毎日100件通知されると、結局見なくなります。最初は1日5件以内に絞る方が運用しやすいです。

失敗5:ログを残さない

利益が出た理由、失敗した理由が分からないと改善できません。対策は、候補抽出時点の価格、判定条件、実販売結果を同じ表に残すことです。

専門家目線のチェックポイント

見るべきポイントは、利益率だけではありません。

  • 規約確認:自動取得、自動出品、自動購入が許容される範囲か
  • 法律確認:中古品を継続的に仕入れて販売する場合、古物商許可が必要か
  • 同一商品判定:型番、世代、付属品、状態が一致しているか
  • 送料精度:サイズ別に送料テーブルを持っているか
  • 在庫回転:売れるまでの日数が資金を圧迫しないか
  • 返品率:状態説明の甘さで返品が増えていないか
  • 通知品質:通知された候補を人間が実際に確認できているか

カテゴリ別の送料テーブルは、早めに作ると精度が上がります。

category,default_shipping,packing_cost
camera_lens,750,80
game_console,850,120
figure_small,650,100
pc_parts,750,100
tool_small,850,150

成果を測るKPI

せどり自動化を資産化するなら、売上だけを見ても不十分です。

追うべきKPIは次の通りです。

  • 候補抽出数
  • 条件通過数
  • 通知確認率
  • 仕入れ採用率
  • 予測利益
  • 実利益
  • 予測利益と実利益の差
  • 平均ROI
  • 売れるまでの日数
  • 値下げ回数
  • 返品・キャンセル率
  • 1日あたりの確認時間

特に重要なのは、予測利益と実利益の差です。

予測利益1,850円の商品が実利益800円になった場合、原因を分解します。

  • 送料が高かった
  • 値下げした
  • 状態差を見落とした
  • 相場が下がった
  • 梱包費を入れていなかった
  • 販売までに時間がかかった

この原因をログに戻さないと、スクリプトは同じ失敗候補を出し続けます。

反論・限界・使えないケース

この仕組みは万能ではありません。

  • 規約上、自動取得や自動出品が適さない場面がある
  • 真贋判定が必要な商品には向かない
  • 流行商品は相場変動が速い
  • 大型商品は送料と保管場所の影響が大きい
  • 少額利益の商品は梱包時間と返品対応で割に合わない
  • 自動購入まで進めると、誤仕入れの損失が大きい
  • 成約データが少ない商品は、中央値が信用しにくい
  • 公式手数料や規約は変更されるため、スクリプト内に固定しすぎると古くなる

自動化は人間の判断を消す魔法ではありません。人間が毎回やる必要のない集計作業を機械に寄せ、規約、真贋、状態、資金リスクの判断を人間に残す設計です。

読了後すぐに取れるアクション

今日やるなら、次の順番で進めてください。

  1. ジャンルを1つ決める
  2. 10商品だけCSVに入力する
  3. 成約価格、仕入れ総額、送料、梱包費、手数料を列にする
  4. Pythonで期待利益とROIを計算する
  5. 条件通過した商品だけ人間がURL確認する
  6. 予測利益と実利益の列を追加する
  7. 失敗理由を1つずつ除外条件に戻す

いきなり大規模化する必要はありません。10件のCSVで赤字候補を除外できるなら、それはもう自動化資産の原型です。

まとめ:価格差探しを「作業」から「仕組み」に変える

メルカリ・ヤフオクの価格差リサーチで消耗しないためには、検索数を増やすより、判定条件を固定する方が先です。

最初のゴールは、完全な自動売買ではありません。

利益が残る可能性のある商品だけが、自動で候補として上がってくる状態を作ることです。

そこから、送料テーブル、除外キーワード、成約数フィルタ、予測利益と実利益の差分分析を育てていけば、人間が張り付かなくても収益候補を拾える仕組みに近づきます。

本気で自動化・不労所得型の仕組みを作りたい方へ。
「何を自動化すれば収益につながるのか」「どこまで人間の判断を残すべきか」「失敗ログをどう改善に変えるか」まで踏み込んだ実践マニュアルを用意しています。

作業時間を切り売りする副業から抜け出し、収益候補が自動で集まり続ける仕組みを作りたい方は、こちらから次の一手を選んでください。

本気で自動化・不労所得を構築したい方向けの実践マニュアルを見る