【D6】收集:三大法人-区分期货与选择权二类

前言

昨日稍微介绍了为什麽要取得这些资料,今天来实作取得资料,并且写入Table LegalDailyFutureOption
今天会从期交所取得:三大法人-区分期货与选择权二类-依日期的资料。

本日程序码使用:d6_3LegalPersonTrade.py

建立资料表

我们可以下载csv档:

https://www.taifex.com.tw/data_gov/taifex_open_data.asp?data_name=MarketDataOfMajorInstitutionalTradersDividedByFuturesAndOptionsBytheDate

观察一下我们的内容,我们会需要用到全部的资料,因此把这些资料全部列到资料库中。这些资料分别为:

  • 日期
  • 身份别
  • 期货多方交易口数
  • 选择权多方交易口数
  • 期货多方交易契约金额(千元)
  • 选择权多方交易契约金额(千元)
  • 期货空方交易口数
  • 选择权空方交易口数
  • 期货空方交易契约金额(千元)
  • 选择权空方交易契约金额(千元)
  • 期货多空交易口数净额
  • 选择权多空交易口数净额
  • 期货多空交易契约金额净额(千元)
  • 选择权多空交易契约金额净额(千元)
  • 期货多方未平仓口数
  • 选择权多方未平仓口数
  • 期货多方未平仓契约金额(千元)
  • 选择权多方未平仓契约金额(千元)
  • 期货空方未平仓口数
  • 选择权空方未平仓口数
  • 期货空方未平仓契约金额(千元)
  • 选择权空方未平仓契约金额(千元)
  • 期货多空未平仓口数净额
  • 选择权多空未平仓口数净额
  • 期货多空未平仓契约金额净额(千元)
  • 选择权多空未平仓契约金额净额(千元)

因此资料库的SQL码会是:

CREATE TABLE `finance`.`LegalDailyFutureOption` (
  `ID` INT NOT NULL AUTO_INCREMENT,
  `TradeDate` DATE NOT NULL,
  `TradeGroup` VARCHAR(10) NOT NULL,
  `FutureLongQty` INT NOT NULL DEFAULT 0,
  `OptionLongQty` INT NOT NULL DEFAULT 0,
  `FutureLongAmount` INT NOT NULL DEFAULT 0,
  `OptionLongAmount` INT NOT NULL DEFAULT 0,
  `FutureShortQty` INT NOT NULL DEFAULT 0,
  `OptionShortQty` INT NOT NULL DEFAULT 0,
  `FutureShortAmount` INT NOT NULL DEFAULT 0,
  `OptionShortAmount` INT NOT NULL DEFAULT 0,
  `FutureNetQty` INT NOT NULL DEFAULT 0,
  `OptionNetQty` INT NOT NULL DEFAULT 0,
  `FutureNetAmount` INT NOT NULL DEFAULT 0,
  `OptionNetAmount` INT NOT NULL DEFAULT 0,
  `FutureLongOIQty` INT NOT NULL DEFAULT 0,
  `OptionLongOIQty` INT NOT NULL DEFAULT 0,
  `FutureLongOIAmount` INT NOT NULL DEFAULT 0,
  `OptionLongOIAmount` INT NOT NULL DEFAULT 0,
  `FutureShortOIQty` INT NOT NULL DEFAULT 0,
  `OptionShortOIQty` INT NOT NULL DEFAULT 0,
  `FutureShortOIAmount` INT NOT NULL DEFAULT 0,
  `OptionShortOIAmount` INT NOT NULL DEFAULT 0,
  `FutureOINetQty` INT NOT NULL DEFAULT 0,
  `OptionOINetQty` INT NOT NULL DEFAULT 0,
  `FutureOINetAmount` INT NOT NULL DEFAULT 0,
  `OptionOINetAmount` INT NOT NULL DEFAULT 0,
  `CreateTime` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`));

其中把数量、金额全部预设为0,并且不提供空值,这样资料比较乾净,不必额外处理异常数值状况,直接排除0就可以。

资料写进资料库

资料表准备好,接着就是写入资料。

建立汇入物件

本次作法是把这个功能变成一个单独的物件,因此建立一个名为legal_daily_future_optionclass。并且提供属性,让後面比较方便取得资料:

self.title = "三大法人-区分期货与选择权二类-依日期"
self.url = "https://www.taifex.com.tw/data_gov/taifex_open_data.asp?data_name=MarketDataOfMajorInstitutionalTradersDividedByFuturesAndOptionsBytheDate"
self.df = None  # 把资料从csv转乘datframe
self.csv = self.get_csv_data()  # 取得网路上的资料,格式为csv

其中url保留弹性,万一网址修改了还可以使用参数法去改。

取得服务器资料

在政府提供的资料格式为:csv,因此建立一个get_csv_data的功能来取得服务器中的资料,把它存成csvdataframe。虽然csv这次没有用到,但这可以抓到资料後直接存成一个csv档,当做资料备源,例如当格式改掉後,还有个参考依据,并补汇入资料。

因此主要的功能会在这边:

try:
    csv = requests.get(self.url)
    df = pandas.read_csv(StringIO(csv.text))  # 有header
    print(df)  # debug
    self.df = df
except Exception as exc:
    print(exc)
    return False

这部份跟之前类似,就不多说明。

存入资料库

这次把连结单独拉出来,成为一个模组。这样不用每次与资料库连结时,都写一样的参数和方法,可直接呼叫使用,或是修改资料库资讯,以後如果要使用Azure或是搬到其他地方,也可以直接修改这个模组,而不用动到其他程序。(我这就是滚动式进步XD)

因此建立一个叫做db_connect.py的档案,里面建立之前的MySQL连线:

import pymysql


class mysql_connect:
    def __init__(self) -> None:
        self.db_settings = {
            "host": "127.0.0.1",
            "port": 3306,
            "user": "root",
            "password": "pwd",
            "db": "finance",
        }

    def connect(self):
        conn = pymysql.connect(**self.db_settings)

        return conn

就这样简简单单的完成。记住"password": "pwd"这边要输入自己的密码,其他资料也是输入自己的连线资讯喔!

接着就是在原本的模组中,建立一个功能,用来把资料汇入MySQL中:

def insert_mysql(self) -> bool:
    # 计数器:计算新增了几笔
    counter = 0

    try:
        # 建立connection物件
        my_connt_obj = db_connect.mysql_connect()
        conn = my_connt_obj.connect()
        with conn.cursor() as cursor:
            # 新增SQL语法
            for _, row in self.df.iterrows():
                trade_date = str(row[0])
                cmd = f"""INSERT INTO LegalDailyFutureOption 
                (TradeDate, TradeGroup,
                FutureLongQty, OptionLongQty,
                FutureLongAmount, OptionLongAmount,
                FutureShortQty, OptionShortQty,
                FutureShortAmount, OptionShortAmount,
                FutureNetQty, OptionNetQty,
                FutureNetAmount, OptionNetAmount,
                FutureLongOIQty, OptionLongOIQty,
                FutureLongOIAmount, OptionLongOIAmount,
                FutureShortOIQty, OptionShortOIQty,
                FutureShortOIAmount, OptionShortOIAmount,
                FutureOINetQty, OptionOINetQty,
                FutureOINetAmount, OptionOINetAmount)
                values('{"{}-{}-{}".format(trade_date[:4],trade_date[4:6],trade_date[6:])}', 
                '{row[1]}',
                {row[2]}, {row[3]},
                {row[4]}, {row[5]},
                {row[6]}, {row[7]},
                {row[8]}, {row[9]},
                {row[10]}, {row[11]},
                {row[12]}, {row[13]},
                {row[14]}, {row[15]},
                {row[16]}, {row[17]},
                {row[18]}, {row[19]},
                {row[20]}, {row[21]},
                {row[22]}, {row[23]},
                {row[24]}, {row[25]});"""
                cursor.execute(cmd)

                counter += 1
            conn.commit()
    except Exception as exc:
        print(exc)
        return False

    print(f"===Finish: {counter}==")
    return True

最後执行他,就大功告成罗~
会显示的结果如下:

日期    身份别  期货多方交易口数  选择权多方交易口数  期货多方交易契约金额(千元)  ...  选择权空方未平仓契约金额(千元)  期货多空未平仓口数净额  选择权多空未平仓口数净额  期货多空未平仓契约金额净额(千元)  选择权多空未平仓契约金额净额(千元)
0  20210906    自营商     41537     247258        46023473  ...            824397         6922         24371           31180664              343273
1  20210906     投信        27          2           76092  ...                 0         2417            62            3763399                  61
2  20210906  外资及陆资    380498     140362       372794596  ...            986546      -230431        -38464         -111817854             -499753

[3 rows x 26 columns]
===Finish: 3==
True

後记:

这篇以为一下子就可以完成,殊不知写了很多。不过,还是无法使用网友提供建议的pandasto_sql功能,等之後学会再导入吧!


<<:  建立 Line Bot(1)

>>:  DAY6 起手式--Nuxt.js常用套件安装

倒数第二天

终於到了倒数第二天 现在一直在努力的写前後端的程序码跟串接 在前端 RxDB 中有一些 Middle...

Day14选择器(CSS)

CSS选择器 接续这上篇 选择器也可以多重选择多个元素 像是 h1,th {color:brown}...

理解React的setState到底是同步还是非同步(上)

在上个月初的时候,偶然在IThelp看到这篇讨论 setState後画面没有立即Render,决定趁...

day24 : kong api gateway(上)

到今天为止介绍了不少应用於k8s上的服务,并且大部分都可以透过operator的方式进行同性质的服务...

全端入门Day24_後端程序撰写之多一点点的Node.js

昨天介绍了一些名词,今天继续提Node.js Node.js一点入门 今天直接贴上程序码,再去做解释...