# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2026/3/22 21:00
Desc: 50 ETF 期权波动率指数 QVIX
300 ETF 期权波动率指数 QVIX
http://1.optbbs.com/s/vix.shtml?50ETF
http://1.optbbs.com/s/vix.shtml?300ETF
"""

import pandas as pd
from functools import lru_cache


@lru_cache
def __get_optbbs_daily() -> pd.DataFrame:
    """
    读取原始数据
    http://1.optbbs.com/d/csv/d/k.csv
    :return: 原始数据
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/k.csv"
    temp_df = pd.read_csv(url, encoding="gbk")
    return temp_df


def index_option_50etf_qvix() -> pd.DataFrame:
    """
    50ETF 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?50ETF
    :return: 50ETF 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, :5]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_50etf_min_qvix() -> pd.DataFrame:
    """
    50 ETF 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?50ETF
    :return: 50 ETF 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vix50.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_300etf_qvix() -> pd.DataFrame:
    """
    300 ETF 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?300ETF
    :return: 300 ETF 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 9, 10, 11, 12]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_300etf_min_qvix() -> pd.DataFrame:
    """
    300 ETF 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?300ETF
    :return: 300 ETF 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vix300.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_500etf_qvix() -> pd.DataFrame:
    """
    500 ETF 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?500ETF
    :return: 500 ETF 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 67, 68, 69, 70]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_500etf_min_qvix() -> pd.DataFrame:
    """
    500 ETF 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?500ETF
    :return: 500 ETF 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vix500.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_cyb_qvix() -> pd.DataFrame:
    """
    创业板 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?CYB
    :return: 创业板 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 71, 72, 73, 74]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_cyb_min_qvix() -> pd.DataFrame:
    """
    创业板 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?CYB
    :return: 创业板 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vixcyb.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_kcb_qvix() -> pd.DataFrame:
    """
    科创板 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?KCB
    :return: 科创板 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 83, 84, 85, 86]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_kcb_min_qvix() -> pd.DataFrame:
    """
    科创板 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?KCB
    :return: 科创板 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vixkcb.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_100etf_qvix() -> pd.DataFrame:
    """
    深证100ETF 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?100ETF
    :return: 深证100ETF 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 75, 76, 77, 78]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_100etf_min_qvix() -> pd.DataFrame:
    """
    深证100ETF 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?100ETF
    :return: 深证100ETF 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vix100.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df.loc[:, "qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_300index_qvix() -> pd.DataFrame:
    """
    中证300股指 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?Index
    :return: 中证300股指 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 17, 18, 19, 20]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_300index_min_qvix() -> pd.DataFrame:
    """
    中证300股指 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?Index
    :return: 中证300股指 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vixindex.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df["qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_1000index_qvix() -> pd.DataFrame:
    """
    中证1000股指 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?Index1000
    :return: 中证1000股指 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 25, 26, 27, 28]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_1000index_min_qvix() -> pd.DataFrame:
    """
    中证1000股指 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?Index1000
    :return: 中证1000股指 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vixindex1000.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df["qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


def index_option_50index_qvix() -> pd.DataFrame:
    """
    上证50股指 期权波动率指数 QVIX
    http://1.optbbs.com/s/vix.shtml?50index
    :return: 上证50股指 期权波动率指数 QVIX
    :rtype: pandas.DataFrame
    """
    temp_df = __get_optbbs_daily().iloc[:, [0, 79, 80, 81, 82]]
    temp_df.columns = [
        "date",
        "open",
        "high",
        "low",
        "close",
    ]
    temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
    temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
    temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
    temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
    temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
    return temp_df


def index_option_50index_min_qvix() -> pd.DataFrame:
    """
    上证50股指 期权波动率指数 QVIX-分时
    http://1.optbbs.com/s/vix.shtml?50index
    :return: 上证50股指 期权波动率指数 QVIX-分时
    :rtype: pandas.DataFrame
    """
    url = "http://1.optbbs.com/d/csv/d/vix50index.csv"
    temp_df = pd.read_csv(url).iloc[:, :2]
    temp_df.columns = [
        "time",
        "qvix",
    ]
    temp_df["qvix"] = pd.to_numeric(temp_df["qvix"], errors="coerce")
    return temp_df


if __name__ == "__main__":
    index_option_50etf_qvix_df = index_option_50etf_qvix()
    print(index_option_50etf_qvix_df)

    index_option_50etf_min_qvix_df = index_option_50etf_min_qvix()
    print(index_option_50etf_min_qvix_df)

    index_option_300etf_qvix_df = index_option_300etf_qvix()
    print(index_option_300etf_qvix_df)

    index_option_300etf_min_qvix_df = index_option_300etf_min_qvix()
    print(index_option_300etf_min_qvix_df)

    index_option_500etf_qvix_df = index_option_500etf_qvix()
    print(index_option_500etf_qvix_df)

    index_option_500etf_min_qvix_df = index_option_500etf_min_qvix()
    print(index_option_500etf_min_qvix_df)

    index_option_cyb_qvix_df = index_option_cyb_qvix()
    print(index_option_cyb_qvix_df)

    index_option_cyb_min_qvix_df = index_option_cyb_min_qvix()
    print(index_option_cyb_min_qvix_df)

    index_option_kcb_qvix_df = index_option_kcb_qvix()
    print(index_option_kcb_qvix_df)

    index_option_kcb_min_qvix_df = index_option_kcb_min_qvix()
    print(index_option_kcb_min_qvix_df)

    index_option_100etf_qvix_df = index_option_100etf_qvix()
    print(index_option_100etf_qvix_df)

    index_option_100etf_min_qvix_df = index_option_100etf_min_qvix()
    print(index_option_100etf_min_qvix_df)

    index_option_300index_qvix_df = index_option_300index_qvix()
    print(index_option_300index_qvix_df)

    index_option_300index_min_qvix_df = index_option_300index_min_qvix()
    print(index_option_300index_min_qvix_df)

    index_option_1000index_qvix_df = index_option_1000index_qvix()
    print(index_option_1000index_qvix_df)

    index_option_1000index_min_qvix_df = index_option_1000index_min_qvix()
    print(index_option_1000index_min_qvix_df)

    index_option_50index_qvix_df = index_option_50index_qvix()
    print(index_option_50index_qvix_df)

    index_option_50index_min_qvix_df = index_option_50index_min_qvix()
    print(index_option_50index_min_qvix_df)
