查询活跃券:
from apis.factor_handler import FactorHandlerAPI
from apis.quant_handler import QuantHandlerAPI
from apis.market_handler import MarketHandlerAPI
import datetime
import pandas as pd
import numpy as np
import re
import sys
import os
#Hidden function print
def initialize_hidden_prints(activated=True):
original_stdout = None
if activated:
original_stdout = sys.stdout
sys.stdout = open(os.devnull, 'w')
return original_stdout
def open_hidden_prints(original_stdout):
sys.stdout.close()
sys.stdout = original_stdout
def close_hidden_prints():
return sys.stdout
# Active bonds information inquiry
def Active_bond(start_date,end_date,factor_id):
FT = FactorHandlerAPI("10.253.50.110") # IP
example = {'quote_start_time': start_date, \
'quote_end_time': end_date, \
'factor_id': factor_id}
res = FT.get_actived_bond(example)
return res["dataset"]
# Helper functions
def custom_sort(term):
order = {'1M': 1, '3M': 2, '6M': 3, '9M': 4, '1Y': 5, '2Y': 6, '3Y': 7, '5Y': 8, '7Y': 9, '10Y': 10, '15Y': 11, '20Y': 12, '30Y': 13, '50Y': 14}
return order.get(term, 0)
# Find the specified information for the coupon
def find_info(data, dateline):
filtered_data = []
dateline.sort(key = custom_sort)
# Loop through the date and data
for date, items in sorted(data.items(), key=lambda x: custom_sort(x[0])):
# Iterate through each data item
for item in items:
# Filter out data that matches a specific deadline in Dateline
if item['residual_maturity'] in dateline:
filtered_data.append(item)
filtered_data_new = [{'quote_time': item['quote_time'],
'variety_code': item['variety_code'],
'factor_value': item['factor_value'],
#'residual_maturity': item['residual_maturity']
}
for item in filtered_data]
df = pd.DataFrame(filtered_data_new)
df['quote_time'] = pd.to_datetime(df['quote_time'], format='%Y-%m-%d')
return df
调用:
from Active_bond import *
from apis.market_handler import MarketHandlerAPI
import pandas as pd
import sys, os
original_stdout = initialize_hidden_prints(activated=True)
factor_id = '1696824430582472704'
start_date = '2023-08-01'
end_date = '2023-08-01'
dateline = ['5Y', '10Y']
data = Active_bond(start_date,end_date,factor_id)
open_hidden_prints(original_stdout) # Execute the code that needs to display the printout
bondinfo = find_info(data, dateline)
bondinfo
获取收益率:
import pandas as pd
import numpy as np
import re
from datetime import timedelta
from apis.factor_handler import FactorHandlerAPI
from apis.quant_handler import QuantHandlerAPI
from apis.market_handler import MarketHandlerAPI
# Check market information yield
"""
The function find_bond_market called by the function yield_rate_inqure
"""
def find_bond_market(start_date, end_date, bond_codes):
from datetime import datetime
api = MarketHandlerAPI("10.243.140.184") # IP
extracted_data = []
data = []
# Character formatting is converted to date format
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
start_date_str =start_date_obj.strftime('%Y-%m-%d %H:%M:%S')
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
end_date_str =end_date_obj.strftime('%Y-%m-%d %H:%M:%S')
# Inquire about the corresponding bond information
for bond_code in bond_codes:
param = {
"start_date": start_date_str,
"end_date": end_date_str,
"variety_code": bond_code,
"page_size": 100,
"quotation_type": "cmds_market_data_xswap",
"interval": "d",
"index_type": "3"
}
res = api.load_quotation(param)
data.extend(res['dataset'])
for item in data:
extracted_data.append({
"symbol": item["symbol"],
"datetime": item["datetime"],
"yield_rate": item["yield_rate"],
"vt_symbol": item["vt_symbol"]
})
extracted_data = pd.DataFrame(extracted_data)
# extracted_data['datetime'] = pd.to_datetime(extracted_data['datetime'])
# extracted_data['datetime'] = extracted_data['datetime'].dt.strftime('%Y-%m-%d')
return extracted_data
def yield_rate_inqure(start_date: str , end_date: str, df , bond_codes):
if len( bond_codes) == 0:
start_date = start_date + ' 00:00:00'
end_date = end_date + ' 00:00:00'
dt = pd.DataFrame( columns = ['symbol', 'datetime', 'yield_rate', 'vt_symbol'] )
from datetime import datetime
# Convert date string to a datetime object
start_datetime = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
# Define an incremental time interval of one day
delta = timedelta(days=1)
current_datetime = start_datetime
# Date cycle
while current_datetime <= end_datetime:
filtered_rows=[]
current_date_str = current_datetime.strftime('%Y-%m-%d')
# Extract rows with the same current date
filtered_rows = df[df['quote_time'] == current_date_str]
# Skip if there is a missing or non-existent date
if filtered_rows.empty or len(filtered_rows['variety_code']) == 1:
current_datetime += delta
continue
else:
try:
# Process and search for bond codes
for i in range(len(filtered_rows['variety_code'])):
obj1 = filtered_rows['variety_code'][0]
obj2 = filtered_rows['variety_code'][1]
code_1 = obj1+'.BOND' # 230008.BOND
code_2 = obj2+'.BOND' # 230012.BOND
bond_codes = [code_1, code_2]
# Check the information of the bonds on the same day, it is 00:00:00-23:59:59
start = current_datetime.strftime("%Y-%m-%d") + " 00:00:00"
end = current_datetime.strftime("%Y-%m-%d") + " 23:59:59"
dft = find_bond_market(start_date, end_date, bond_codes)
for i in range(len(df)):
symbol = dft['symbol'][i]
dateTime = dft['datetime'][i] # 字符型日期,下一步要转换成日期型
yield_rate = dft['yield_rate'][i]
vt_symbol = dft['vt_symbol'][i]
# Add the found data to the dt data box
dt = dt.append({'symbol': symbol, 'datetime': dateTime, 'yield_rate': yield_rate, 'vt_symbol': vt_symbol}, ignore_index=True)
except KeyError:
current_datetime += delta
continue
# Incremental Date
current_datetime += delta
return dt
else:
from datetime import datetime
bond_codes = [code + '.BOND' for code in bond_codes]
api = MarketHandlerAPI("10.243.140.184") # IP
data = []
start_datetime = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')
start_datetime_st = str(start_datetime)
end_datetime = datetime.strptime(end_date, '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')
end_datetime_st = str(end_datetime)
for bond_code in bond_codes:
param = {
"start_date": start_datetime_st,
"end_date": end_datetime_st,
"variety_code": bond_code,
"page_size": 100,
"quotation_type": "cmds_market_data_xswap",
"interval": "d",
"index_type": "3"
}
res = api.load_quotation(param)
data.extend(res['dataset'])
extracted_data = []
for item in data:
extracted_data.append({
"symbol": item["symbol"],
"datetime": item["datetime"], # 字符型日期,下一步要转换成日期型
"yield_rate": item["yield_rate"],
"vt_symbol": item["vt_symbol"]
})
extracted_data = pd.DataFrame(extracted_data)
# extracted_data['datetime'] = pd.to_datetime(extracted_data['datetime'])
# extracted_data['datetime'] = extracted_data['datetime'].dt.strftime('%Y-%m-%d')
return extracted_data
调用:
from inqure_yield import *
from Active_bond import *
from datetime import datetime
original_stdout = initialize_hidden_prints(activated=True) # Execute the code here that needs to hide the printout
# inqure active bond code
factor_id = 'factor_id' # factor_id = str '1696824430582472704'
start_date = date # date:str '2023-06-17'
end_date = date # date:str '2023-08-23'
dateline = ['term_1', 'term_2'] # date_term:list ['5Y', '10Y']
data = Active_bond(start_date,end_date,factor_id)
bondinfo = find_info(data, dateline)
bondinfo
# inqure bond yield
open_hidden_prints(original_stdout) # Execute the code that needs to display the printout
start_date_1 = date # date:str '2023-06-17',start_date_1 > start_date
end_date_1 = date # date:str '2023-08-23',start_date_2 < start_date
"""
When querying yield for the entire period, the rule is that bondinfo is not empty.
When querying yield for a specific bond code, bondinfo is empty and the code
is filled in to the corresponding bond_codes. default bond_codes = [] ,bondinfo != [].
"""
#bondinfo = []
#bond_codes = [] # This parameter is not necessary
"""
# bond_codes = ['symbol_1' , 'symbol_2']
# 'symbol_1' , 'symbol_2' must be in bondinfo
# eg: 'symbol_1' , 'symbol_2' = '230008' , '230012'
"""
#start_date_1 , end_date_1 , bondinfo : These parameters are necessary
inqure = yield_rate_inqure(start_date_1 , end_date_1 ,bondinfo , bond_codes)
inqure
利差计算:
Python
File
Edit
View
Language
1
import re
2
import numpy as np
3
import pandas as pd
4
def yield_diff(df_filtered):
5
6
rate_diff = pd.DataFrame(columns=['datetime', 'vt_symbol_1', 'yield_rate_1', 'vt_symbol_2', 'yield_rate_2','yield_diff'])
7
8
# 待填充的日期列表
9
date_list = df_filtered['datetime'].unique()
10
11
# 循环迭代日期
12
for date in date_list:
13
14
# 获取当前日期的数据
15
data = df_filtered[df_filtered['datetime'] == date]
16
17
data_code = data['symbol'].unique()
18
19
# 获取数据的值
20
datetime_val = data['datetime'].values[0]
21
symbol_1_val = data[data['symbol'] == data_code[0]]['vt_symbol'].values[0]
22
yield_rate_1_val = data[data['symbol'] == data_code[0]]['yield_rate'].values[0]
23
symbol_2_val = data[data['symbol'] == data_code[1]]['vt_symbol'].values[0]
24
yield_rate_2_val = data[data['symbol'] == data_code[1]]['yield_rate'].values[0]
25
yield_diff_val = min(yield_rate_1_val, yield_rate_2_val) - max(yield_rate_1_val, yield_rate_2_val)
26
27
# 将值填充到数据框
28
rate_diff.loc[len(rate_diff)] = [datetime_val, symbol_1_val, yield_rate_1_val, symbol_2_val, yield_rate_2_val, yield_diff_val]
29
30
print(rate_diff)
调用:
from inqure_yield import *
from Active_bond import *
from rate_diff import *
from datetime import datetime
import pandas as pd
original_stdout = initialize_hidden_prints(activated=True) # Execute the code here that needs to hide the printout
# inqure active bond code
factor_id = 'factor_id' # factor_id = str '1696824430582472704'
start_date = date # date:str '2023-06-17'
end_date = date # date:str '2023-08-23'
dateline = ['term_1', 'term_2'] # date_term:list ['5Y', '10Y']
data = Active_bond(start_date,end_date,factor_id)
bondinfo = find_info(data, dateline)
bondinfo
# inqure bond yield
open_hidden_prints(original_stdout) # Execute the code that needs to display the printout
start_date_1 = date # date:str '2023-06-17',start_date_1 > start_date
end_date_1 = date # date:str '2023-08-23',start_date_2 < start_date
"""
When querying yield for the entire period, the rule is that bondinfo is not empty.
When querying yield for a specific bond code, bondinfo is empty and the code
is filled in to the corresponding bond_codes. default bond_codes = [] ,bondinfo != [].
"""
#bondinfo = []
#bond_codes = [] # This parameter is not necessary
"""
# bond_codes = ['symbol_1' , 'symbol_2']
# 'symbol_1' , 'symbol_2' must be in bondinfo
# eg: 'symbol_1' , 'symbol_2' = '230008' , '230012'
"""
#start_date_1 , end_date_1 , bondinfo : These parameters are necessary
inqure = yield_rate_inqure(start_date_1 , end_date_1 ,bondinfo , bond_codes)
inqure