Skip to content

Commit

Permalink
feat: add ConvertibleBond (#291)
Browse files Browse the repository at this point in the history
  • Loading branch information
linsamtw committed Mar 31, 2024
1 parent 3ba1e70 commit 5826924
Show file tree
Hide file tree
Showing 3 changed files with 261 additions and 2 deletions.
147 changes: 147 additions & 0 deletions FinMind/data/data_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -1463,6 +1463,153 @@ def taiwan_options_snapshot(
)
return options_snapshot

def taiwan_stock_convertible_bond_info(
self, timeout: int = None
) -> pd.DataFrame:
"""get 可轉債總覽
:param timeout (int): timeout seconds, default None
:return: 可轉債總覽 TaiwanStockConvertibleBondInfo
:rtype pd.DataFrame
:rtype column cb_id (str)
:rtype column cb_name (str)
:rtype column InitialDateOfConversion (str)
:rtype column DueDateOfConversion (str)
:rtype column IssuanceAmount (int)
"""
df = self.get_data(
dataset=Dataset.TaiwanStockConvertibleBondInfo,
timeout=timeout,
)
return df

def taiwan_stock_convertible_bond_daily(
self,
cb_id: str = "",
start_date: str = "",
end_date: str = "",
timeout: int = None,
) -> pd.DataFrame:
"""get 可轉債日成交資訊
:param cb_id (str): 可轉債代號("2330")
:param start_date (str): 開始日期("2018-01-01")
:param end_date (str): 結束日期("2021-03-06")
:param timeout (int): timeout seconds, default None
:return: 可轉債日成交資訊 TaiwanStockConvertibleBondDaily
:rtype pd.DataFrame
:rtype column cb_id: (str)
:rtype column cb_name: (str)
:rtype column transaction_type: (str)
:rtype column close: (float)
:rtype column change: (float)
:rtype column open: (float)
:rtype column max: (float)
:rtype column min: (float)
:rtype column no_of_transactions: (int)
:rtype column unit: (int)
:rtype column trading_value: (int)
:rtype column avg_price: (float)
:rtype column next_ref_price: (float)
:rtype column next_max_limit: (float)
:rtype column next_min_limit: (float)
:rtype column date: (str)
"""
df = self.get_data(
dataset=Dataset.TaiwanStockConvertibleBondDaily,
data_id=cb_id,
start_date=start_date,
end_date=end_date,
timeout=timeout,
)
return df

def taiwan_stock_convertible_bond_institutional_investors(
self,
cb_id: str = "",
start_date: str = "",
end_date: str = "",
timeout: int = None,
) -> pd.DataFrame:
"""get 可轉債三大法人日交易資訊
:param cb_id (str): 可轉債代號("2330")
:param start_date (str): 開始日期("2018-01-01")
:param end_date (str): 結束日期("2021-03-06")
:param timeout (int): timeout seconds, default None
:return: 可轉債三大法人日交易資訊 TaiwanStockConvertibleBondInstitutionalInvestors
:rtype pd.DataFrame
:rtype column Foreign_Investor_Buy: (int)
:rtype column Foreign_Investor_Sell: (int)
:rtype column Foreign_Investor_Overbuy: (int)
:rtype column Investment_Trust_Buy: (int)
:rtype column Investment_Trust_Sell: (int)
:rtype column Investment_Trust_Overbuy: (int)
:rtype column Dealer_self_Buy: (int)
:rtype column Dealer_self_Sell: (int)
:rtype column Dealer_self_Overbuy: (int)
:rtype column Total_Overbuy: (int)
:rtype column cb_id: (str)
:rtype column cb_name: (str)
:rtype column date: (str)
"""
df = self.get_data(
dataset=Dataset.TaiwanStockConvertibleBondInstitutionalInvestors,
data_id=cb_id,
start_date=start_date,
end_date=end_date,
timeout=timeout,
)
return df

def taiwan_stock_convertible_bond_daily_overview(
self,
cb_id: str = "",
start_date: str = "",
end_date: str = "",
timeout: int = None,
) -> pd.DataFrame:
"""get 可轉債每日總覽資訊
:param cb_id (str): 可轉債代號("2330")
:param start_date (str): 開始日期("2018-01-01")
:param end_date (str): 結束日期("2021-03-06")
:param timeout (int): timeout seconds, default None
:return: 可轉債每日總覽資訊 TaiwanStockConvertibleBondDailyOverview
:rtype pd.DataFrame
:rtype column cb_id: (str)
:rtype column cb_name: (str)
:rtype column date: (str)
:rtype column InitialDateOfConversion: (str)
:rtype column DueDateOfConversion: (str)
:rtype column InitialDateOfStopConversion: (str)
:rtype column DueDateOfStopConversion: (str)
:rtype column ConversionPrice: (float)
:rtype column NextEffectiveDateOfConversionPrice: (str)
:rtype column LatestInitialDateOfPut: (str)
:rtype column LatestDueDateOfPut: (str)
:rtype column LatestPutPrice: (float)
:rtype column InitialDateOfEarlyRedemption: (str)
:rtype column DueDateOfEarlyRedemption: (str)
:rtype column EarlyRedemptionPrice: (float)
:rtype column DateOfDelisted: (str)
:rtype column IssuanceAmount: (float)
:rtype column OutstandingAmount: (float)
:rtype column ReferencePrice: (float)
:rtype column PriceOfUnderlyingStock: (float)
:rtype column InitialDateOfSuspension: (str)
:rtype column DueDateOfSuspension: (str)
:rtype column CouponRate: (float)
"""
df = self.get_data(
dataset=Dataset.TaiwanStockConvertibleBondDailyOverview,
data_id=cb_id,
start_date=start_date,
end_date=end_date,
timeout=timeout,
)
return df


class Feature:
def __init__(self, data_loader: DataLoader):
Expand Down
8 changes: 8 additions & 0 deletions FinMind/schema/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ class Dataset(str, Enum):
TaiwanStockPriceAdj = "TaiwanStockPriceAdj"
TaiwanStockKBar = "TaiwanStockKBar"
TaiwanStockDelisting = "TaiwanStockDelisting"
TaiwanStockConvertibleBondInfo = "TaiwanStockConvertibleBondInfo"
TaiwanStockConvertibleBondDaily = "TaiwanStockConvertibleBondDaily"
TaiwanStockConvertibleBondInstitutionalInvestors = (
"TaiwanStockConvertibleBondInstitutionalInvestors"
)
TaiwanStockConvertibleBondDailyOverview = (
"TaiwanStockConvertibleBondDailyOverview"
)


class Version(str, Enum):
Expand Down
108 changes: 106 additions & 2 deletions tests/data/test_data_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import pandas as pd
import pytest

from FinMind.data import DataLoader
from FinMind.data import FinMindApi
from FinMind.data import DataLoader, FinMindApi

user_id = os.environ.get("FINMIND_USER", "")
password = os.environ.get("FINMIND_PASSWORD", "")
Expand Down Expand Up @@ -681,3 +680,108 @@ def test_us_stock_price(data_loader):
"Volume",
],
)


def test_taiwan_stock_convertible_bond_info(data_loader):
df = data_loader.taiwan_stock_convertible_bond_info()
assert_data(
df,
[
"cb_id",
"cb_name",
"InitialDateOfConversion",
"DueDateOfConversion",
"IssuanceAmount",
],
)


def test_taiwan_stock_convertible_bond_daily(data_loader):
df = data_loader.taiwan_stock_convertible_bond_daily(
cb_id="15131",
start_date="2020-04-01",
end_date="2020-04-10",
)
assert_data(
df,
[
"cb_id",
"cb_name",
"transaction_type",
"close",
"change",
"open",
"max",
"min",
"no_of_transactions",
"unit",
"trading_value",
"avg_price",
"next_ref_price",
"next_max_limit",
"next_min_limit",
"date",
],
)


def test_taiwan_stock_convertible_bond_institutional_investors(data_loader):
df = data_loader.taiwan_stock_convertible_bond_institutional_investors(
cb_id="15131",
start_date="2020-04-01",
end_date="2020-04-10",
)
assert_data(
df,
[
"Foreign_Investor_Buy",
"Foreign_Investor_Sell",
"Foreign_Investor_Overbuy",
"Investment_Trust_Buy",
"Investment_Trust_Sell",
"Investment_Trust_Overbuy",
"Dealer_self_Buy",
"Dealer_self_Sell",
"Dealer_self_Overbuy",
"Total_Overbuy",
"cb_id",
"cb_name",
"date",
],
)


def test_taiwan_stock_convertible_bond_daily_overview(data_loader):
df = data_loader.taiwan_stock_convertible_bond_daily_overview(
cb_id="15131",
start_date="2020-04-01",
end_date="2020-04-10",
)
assert_data(
df,
[
"cb_id",
"cb_name",
"date",
"InitialDateOfConversion",
"DueDateOfConversion",
"InitialDateOfStopConversion",
"DueDateOfStopConversion",
"ConversionPrice",
"NextEffectiveDateOfConversionPrice",
"LatestInitialDateOfPut",
"LatestDueDateOfPut",
"LatestPutPrice",
"InitialDateOfEarlyRedemption",
"DueDateOfEarlyRedemption",
"EarlyRedemptionPrice",
"DateOfDelisted",
"IssuanceAmount",
"OutstandingAmount",
"ReferencePrice",
"PriceOfUnderlyingStock",
"InitialDateOfSuspension",
"DueDateOfSuspension",
"CouponRate",
],
)

0 comments on commit 5826924

Please sign in to comment.