import yfinance as yf
import pandas as pd
from datetime import datetime
from pathlib import Path

CODE = "7012.T"
NAME = "7012_川崎重工"

OUTDIR = Path(r"C:\Users\machi\Market_Radar_7012\04_市場レーダー")
OUTFILE = OUTDIR / "7012_川崎重工_morning_radar_inside_log.xlsx"

START_TIME = "09:00"
END_TIME = "15:30"

BLOCKS = [
    ("09:00", "09:30"),
    ("09:30", "10:00"),
    ("10:00", "10:30"),
    ("10:30", "11:00"),
    ("11:00", "11:30"),
    ("13:00", "13:30"),
    ("13:30", "14:00"),
    ("14:00", "14:30"),
    ("14:30", "15:00"),
    ("15:00", "15:30"),
]

today = datetime.now().date()

print(f"{NAME} 30分足の中身透視レーダー 開始")
print("=" * 60)

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")

today_df = df[df["Date"] == today].copy()

if today_df.empty:
    raise SystemExit("今日のデータがありません")

today_df = today_df[
    (today_df["Time"] >= START_TIME) &
    (today_df["Time"] < END_TIME)
].copy()

# 過去5日同時刻平均
past_df = df[df["Date"] < today].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)

minute_rows = []
block_rows = []

def judge_direction(open_p, close_p):
    rate = (close_p - open_p) / open_p * 100

    if rate >= 0.4:
        return "強い上昇"
    elif rate >= 0.15:
        return "上昇寄り"
    elif rate <= -0.4:
        return "強い下落"
    elif rate <= -0.15:
        return "下落寄り"
    else:
        return "横ばい"

def wave_side(direction):
    if "上昇" in direction:
        return "上げ波"
    elif "下落" in direction:
        return "下げ波"
    else:
        return "中立"

for block_start, block_end in BLOCKS:
    block = today_df[
        (today_df["Time"] >= block_start) &
        (today_df["Time"] < block_end)
    ].copy()

    if block.empty:
        continue

    wave_no = 0
    last_wave = None
    block_minute_rows = []

    for _, r in block.iterrows():
        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

        direction = judge_direction(open_p, close_p)
        side = wave_side(direction)

        if side != "中立" and side != last_wave:
            wave_no += 1
            last_wave = side

        if side == "中立":
            wave_label = "中立"
        else:
            wave_label = f"第{wave_no}波_{side}"

        change = close_p - open_p
        rate = change / open_p * 100

        trap = ""

        if wave_no == 1 and side == "下げ波" and vol_ratio >= 1.0:
            trap = "寄り売り浴びせ"
        elif wave_no == 1 and side == "上げ波" and vol_ratio >= 1.0:
            trap = "寄り買い先行"
        elif wave_no == 2 and side == "上げ波":
            trap = "反発・買い戻し"
        elif wave_no == 2 and side == "下げ波":
            trap = "反落・戻り売り"
        elif wave_no >= 3 and side == "下げ波":
            trap = "戻り売り確認"
        elif wave_no >= 3 and side == "上げ波":
            trap = "再上昇確認"

        row = {
            "大区間": f"{block_start}-{block_end}",
            "時刻": r["Time"],
            "始値": open_p,
            "高値": high_p,
            "安値": low_p,
            "終値": close_p,
            "変化幅": round(change, 2),
            "変化率%": round(rate, 3),
            "出来高": vol,
            "過去5日同時刻平均出来高": round(avg_vol, 0),
            "出来高倍率": round(vol_ratio, 2),
            "方向": direction,
            "波判定": wave_label,
            "罠判定": trap
        }

        minute_rows.append(row)
        block_minute_rows.append(row)

    b = pd.DataFrame(block_minute_rows)

    block_open = float(block.iloc[0]["Open"])
    block_close = float(block.iloc[-1]["Close"])
    block_high = float(block["High"].max())
    block_low = float(block["Low"].min())
    block_volume = int(block["Volume"].sum())

    first_low_time = block.loc[block["Low"].idxmin(), "Time"]
    first_high_time = block.loc[block["High"].idxmax(), "Time"]

    max_vol_row = b.loc[b["出来高"].idxmax()]

    hidden_wave_count = b[b["波判定"] != "中立"]["波判定"].nunique()

    block_direction = judge_direction(block_open, block_close)

    if block_direction == "横ばい" and hidden_wave_count >= 2:
        inside_judge = "表面は横ばい・中身は乱戦"
    elif "上昇" in block_direction and hidden_wave_count >= 2:
        inside_judge = "上昇だが中身に振り落としあり"
    elif "下落" in block_direction and hidden_wave_count >= 2:
        inside_judge = "下落だが中身に反発あり"
    else:
        inside_judge = "中身も単調"

    block_rows.append({
        "区間": f"{block_start}-{block_end}",
        "始値": block_open,
        "高値": block_high,
        "安値": block_low,
        "終値": block_close,
        "変化幅": round(block_close - block_open, 2),
        "出来高": block_volume,
        "30分方向": block_direction,
        "安値時刻": first_low_time,
        "高値時刻": first_high_time,
        "最大出来高時刻": max_vol_row["時刻"],
        "最大出来高": max_vol_row["出来高"],
        "波の数": hidden_wave_count,
        "中身判定": inside_judge
    })

minute_df = pd.DataFrame(minute_rows)
block_df = pd.DataFrame(block_rows)

OUTDIR.mkdir(parents=True, exist_ok=True)

with pd.ExcelWriter(OUTFILE, engine="openpyxl") as writer:
    block_df.to_excel(writer, index=False, sheet_name="30分の中身判定")
    minute_df.to_excel(writer, index=False, sheet_name="1分波の中身")

print("\n保存完了")
print(OUTFILE)

print("\n30分の中身判定")
print(block_df[["区間", "始値", "高値", "安値", "終値", "出来高", "30分方向", "波の数", "中身判定"]])