import sys
import yfinance as yf
import pandas as pd
from datetime import timedelta
from pathlib import Path

CODE = "7011.T"
NAME = "7011_三菱重工"

OUTDIR = Path(r"C:\Users\machi\Market_Radar_7011\04_市場レーダー")

# コマンドから日付を受け取る
if len(sys.argv) >= 2:
    TARGET_DATE = sys.argv[1]
else:
    TARGET_DATE = "2026-06-24"

OUTFILE = OUTDIR / f"7011_三菱重工_wave_{TARGET_DATE}.xlsx"

print(f"{NAME} 日付指定 波観測版 開始")
print("=" * 60)
print("指定日:", TARGET_DATE)

df = yf.download(
    CODE,
    period="7d",
    interval="1m",
    auto_adjust=False,
    progress=True
)

if df.empty:
    raise SystemExit("データが取得できませんでした")

if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.get_level_values(0)

df = df.reset_index()
df["Datetime"] = pd.to_datetime(df["Datetime"])

if df["Datetime"].dt.tz is not None:
    df["Datetime"] = df["Datetime"].dt.tz_convert("Asia/Tokyo").dt.tz_localize(None)

df["Date"] = df["Datetime"].dt.date
df["Time"] = df["Datetime"].dt.strftime("%H:%M")

target_date = pd.to_datetime(TARGET_DATE).date()

print("取得できた日付:")
print(sorted(df["Date"].unique())[-10:])

today_df = df[df["Date"] == target_date].copy()

if today_df.empty:
    raise SystemExit("指定日の1分足がありません。yfinanceの7日分に入っていない可能性があります。")

past_df = df[df["Date"] < target_date].copy()
past_dates = sorted(past_df["Date"].unique())[-5:]
past_df = past_df[past_df["Date"].isin(past_dates)].copy()

past_avg = (
    past_df.groupby("Time")["Volume"]
    .mean()
    .reset_index()
    .rename(columns={"Volume": "過去5日同時刻平均出来高"})
)

today_df = today_df.merge(past_avg, on="Time", how="left")
today_df["過去5日同時刻平均出来高"] = today_df["過去5日同時刻平均出来高"].fillna(0)

rows = []
wave_no = 0
last_direction = None

for _, r in today_df.iterrows():
    start_time = r["Time"]
    dt = r["Datetime"]
    end_time = (dt + timedelta(minutes=1)).strftime("%H:%M")

    open_p = float(r["Open"])
    high_p = float(r["High"])
    low_p = float(r["Low"])
    close_p = float(r["Close"])
    vol = int(r["Volume"])
    avg_vol = float(r["過去5日同時刻平均出来高"])

    vol_ratio = vol / avg_vol if avg_vol > 0 else 0

    change = close_p - open_p
    change_rate = change / open_p * 100 if open_p else 0

    if close_p > open_p:
        candle = "陽線"
    elif close_p < open_p:
        candle = "陰線"
    else:
        candle = "同値"

    if change_rate >= 0.4:
        direction = "強い上昇"
    elif change_rate >= 0.15:
        direction = "上昇寄り"
    elif change_rate <= -0.4:
        direction = "強い下落"
    elif change_rate <= -0.15:
        direction = "下落寄り"
    else:
        direction = "横ばい"

    if vol_ratio >= 2.0:
        volume_judge = "出来高急増"
    elif vol_ratio >= 1.5:
        volume_judge = "出来高増加"
    elif vol_ratio >= 1.0:
        volume_judge = "通常"
    else:
        volume_judge = "出来高不足"

    if "上昇" in direction:
        wave_direction = "上げ波"
    elif "下落" in direction:
        wave_direction = "下げ波"
    else:
        wave_direction = "中立"

    if wave_direction != "中立" and wave_direction != last_direction:
        wave_no += 1
        last_direction = wave_direction

    if wave_direction != "中立":
        wave_label = f"第{wave_no}波_{wave_direction}"
    else:
        wave_label = "中立"

    trap_judge = ""

    if wave_no == 1 and wave_direction == "下げ波" and vol >= 300000:
        trap_judge = "第1波：寄り売り浴びせ"
    elif wave_no == 2 and wave_direction == "上げ波":
        trap_judge = "第2波：反発・買い戻し"
    elif wave_no >= 3 and wave_direction == "下げ波":
        trap_judge = "戻り売り確認"
    elif wave_no >= 3 and wave_direction == "上げ波":
        trap_judge = "再上昇確認"

    rows.append({
        "日付": target_date,
        "区間": f"{start_time}-{end_time}",
        "始値": open_p,
        "高値": high_p,
        "安値": low_p,
        "終値": close_p,
        "変化幅": round(change, 2),
        "変化率%": round(change_rate, 3),
        "出来高": vol,
        "過去5日同時刻平均出来高": round(avg_vol, 0),
        "出来高倍率": round(vol_ratio, 2),
        "ローソク": candle,
        "方向": direction,
        "出来高判定": volume_judge,
        "波判定": wave_label,
        "罠判定": trap_judge
    })

result = pd.DataFrame(rows)

summary = {
    "日付": target_date,
    "始値": result.iloc[0]["始値"],
    "高値": result["高値"].max(),
    "安値": result["安値"].min(),
    "終値": result.iloc[-1]["終値"],
    "総出来高": result["出来高"].sum(),
    "最大出来高区間": result.loc[result["出来高"].idxmax(), "区間"],
    "最大出来高": result["出来高"].max(),
    "最大下落区間": result.loc[result["変化幅"].idxmin(), "区間"],
    "最大上昇区間": result.loc[result["変化幅"].idxmax(), "区間"],
    "本日の波数": wave_no
}

summary_df = pd.DataFrame([summary])

OUTDIR.mkdir(parents=True, exist_ok=True)

with pd.ExcelWriter(OUTFILE, engine="openpyxl") as writer:
    result.to_excel(writer, index=False, sheet_name="1分波観測")
    summary_df.to_excel(writer, index=False, sheet_name="まとめ")

print("\n保存完了")
print(OUTFILE)

print("\n" + "=" * 100)
print(f"{NAME}　{TARGET_DATE}　1分波観測一覧")
print("=" * 100)

print(
    result[
        ["区間", "始値", "終値", "出来高", "出来高倍率", "方向", "波判定", "罠判定"]
    ].to_string(index=False)
)

print("\n" + "=" * 60)
print("日別まとめ")
print("=" * 60)
print(f"解析対象日      : {target_date}")
print(f"本日の波数      : {wave_no}")
print(f"総出来高        : {result['出来高'].sum():,} 株")
print(f"最大出来高区間  : {summary['最大出来高区間']}")
print(f"最大出来高      : {summary['最大出来高']:,} 株")
print(f"最大下落区間    : {summary['最大下落区間']}")
print(f"最大上昇区間    : {summary['最大上昇区間']}")