再掲載の戸建て物件を発掘する物件仕入れシステム
SUUMOや空き家バンク等のサイトを24時間巡回し、収益性の高い戸建て物件を自動で発掘・査定する仕入れエージェントシステムです。
最大の特徴は「再掲載検知」にあり、物件固有のフィンガープリントにより、値下げやURL変更を伴う再掲載を即座に特定。売れ残り期間や価格推移から、交渉の余地が大きい物件を自動抽出します。
内部ではClaudeによる画像・立地評価と、勾配ブースティングを用いた独自スコアリングを併用。
取得物件はDiscordへ通知され、意思決定ボタンを通じて収集されたフィードバック(問い合わせ・指値・成約成否)をもとに、AIが週次で学習・進化し続ける自律的な運用を実現します。
zip未取得
Akiya Sniper - AI Property Acquisition Agent
AIで"化ける戸建て"を24時間発掘する、完全自動の物件仕入れシステム。
コンセプト: Human Out of the Loop (HOOTL)
人間が介在しなくても 止まらず・賢くなり・事業インパクトを出す AIエージェント。
[2h毎スクレイピング] → [物件正規化+再掲載検知] → [AI査定]
↑ ↓
[フィードバックで再学習] ← [ファネル追跡] ← [Discord通知+ボタン]
再掲載検知
物件のフィンガープリント(住所+面積+築年)で同一物件を追跡。
URLが変わっても再掲載を検知し、掲載日数・値下げ履歴・再掲載回数を記録。
「半年売れ残り+3回値下げ」= 交渉チャンスのシグナル。
ファネル型フィードバック
成約まで待たず、意思決定の各段階でデータを収集:
| ステージ | タイミング | Discord UI | 学習シグナル |
|---|---|---|---|
| Stage 1 | 物件通知時 | 問い合わせ/見送り/ウォッチ | 弱い正/負 |
| Stage 2 | 問い合わせ3日後 | 値引きOK/強気/返答なし | 強い正/負 |
| Stage 3 | 値引きOK時 | 指値金額入力(モーダル) | 定量データ |
| Stage 4 | 交渉4週間後 | 成約/不成立 | 最終結果 |
アーキテクチャ(サーバーレス)
GitHub Actions (cron)
├── 2h毎: スクレイピング → 再掲載検知 → Sheets同期 → スコアリング → Discord通知
├── 毎日10時: フォローアップ(Stage 2/4ボタン送信)
├── 毎日20時: 日次サマリ
└── 毎週日曜: モデル再学習
Discord Webhook → ボタン付きEmbed送信(Bot常駐不要)
Supabase Edge Function → Discord Interaction Endpoint
└── ボタン押下 → feedback保存 → 物件ステータス更新
Supabase
├── PostgreSQL(物件・フィードバック・ログ)
└── Storage(学習モデル永続化)
Google Sheets(gogcli経由)
└── 物件一覧 + 変更履歴の可視化
ファイル構成
src/
├── config.py # 環境変数管理
├── models.py # Property / ScoringResult / Feedback(ファネル対応)
├── database.py # Supabase CRUD + フィンガープリント + 再掲載検知
├── pipeline.py # 各パイプライン関数(GitHub Actionsから呼ばれる)
├── notifier.py # Discord Webhook通知 + ステージ別ボタン
├── health.py # ヘルスモニタリング
├── sheets.py # Google Sheets同期(gogcli)
├── scrapers/
│ ├── base.py # リトライ付きベーススクレイパー
│ ├── suumo.py # SUUMO中古戸建て
│ ├── athome.py # at home
│ └── akiya_bank.py # 空き家バンク
└── scoring/
├── ai_assessor.py # Claude画像判定 + 立地評価 + 再掲載ボーナス
└── evolution_engine.py # ファネルフィードバックで再学習(GBM)
scripts/
├── run_scrape.py # スクレイピング実行
├── run_score.py # スコアリング実行
├── run_followup.py # フォローアップ送信
├── run_summary.py # 日次サマリ
└── run_retrain.py # モデル再学習
.github/workflows/
├── scrape_and_score.yml # 2h毎
├── followup_and_summary.yml # 毎日
└── retrain.yml # 毎週
supabase/
├── migrations/
│ ├── 001_init.sql
│ └── 002_relist_and_funnel.sql
└── functions/
└── discord-interaction/index.ts # ボタンコールバック処理
スコアリングロジック
総合スコア = 利回り(30%) + 立地(25%) + 状態(20%) + 再建築(15%) + 災害リスク(10%) + 再掲載ボーナス(最大+15)
再掲載ボーナス:
- 再掲載回数 x 2点(最大8点)
- 値下げ30%以上: +7点 / 20%以上: +5点 / 10%以上: +3点
セットアップ
1. 環境変数
cp .env.example .env
# .env を編集してAPIキーを設定
必須キー:
SUPABASE_URL/SUPABASE_KEY- SupabaseANTHROPIC_API_KEY- Claude画像判定・立地評価DISCORD_WEBHOOK_URL- Discord通知WebhookDISCORD_PUBLIC_KEY- ボタンコールバック署名検証GOOGLE_SPREADSHEET_ID- Sheets同期
物件一覧スプレッドシート: Google Sheets
2. Supabaseセットアップ
# マイグレーション実行
# supabase/migrations/001_init.sql → 002_relist_and_funnel.sql の順に実行
# Supabase Storageに "models" バケットを作成
3. Discord設定
- Discord Developer Portalでアプリケーション作成
- Webhook URLを取得(チャンネル設定 → 連携サービス → Webhook)
- Edge Function URLを Interactions Endpoint URL に登録
4. Supabase Edge Function デプロイ
supabase functions deploy discord-interaction
supabase secrets set DISCORD_PUBLIC_KEY=xxx SUPABASE_SERVICE_ROLE_KEY=xxx
5. GitHub Actions
リポジトリのSecrets に環境変数を設定すれば自動で動き始めます。
ローカルテスト
pip install -e .
python main.py scrape # スクレイピング
python main.py score # スコアリング
python main.py followup # フォローアップ
python main.py summary # 日次サマリ
python main.py retrain # モデル再学習
進化の仕組み
- ボタンタップでフィードバック収集(成約を待たない)
- 「問い合わせた物件」と「見送った物件」のパターンの違いを学習
- 「値引きOKだった物件」の特徴を強い正シグナルとして重み付け
- 再掲載回数・掲載日数・値下げ率も特徴量に含む
- 週次で自動再学習 → スコア補正係数が更新される
技術スタック
- Python 3.11+ / asyncio
- httpx + BeautifulSoup(スクレイピング)
- Anthropic Claude(画像分析・立地評価)
- scikit-learn GradientBoosting(進化モデル)
- Discord Webhook + Interaction Endpoint(通知+フィードバック)
- Supabase PostgreSQL + Storage + Edge Functions
- Google Sheets + gogcli(物件一覧管理)
- GitHub Actions(サーバーレス定期実行)
- structlog(構造化ログ)
ライセンス
Private - 個人利用