bond_issue_cninfo.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # -*- coding:utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. Date: 2024/6/19 22:00
  5. Desc: 巨潮资讯-数据中心-专题统计-债券报表-债券发行
  6. http://webapi.cninfo.com.cn/#/thematicStatistics
  7. """
  8. import pandas as pd
  9. import requests
  10. import py_mini_racer
  11. from ak.datasets import get_ths_js
  12. def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
  13. """
  14. 获取 JS 文件的内容
  15. :param file: JS 文件名
  16. :type file: str
  17. :return: 文件内容
  18. :rtype: str
  19. """
  20. setting_file_path = get_ths_js(file)
  21. with open(setting_file_path, encoding="utf-8") as f:
  22. file_data = f.read()
  23. return file_data
  24. def bond_cov_issue_cninfo(
  25. start_date: str = "20210913", end_date: str = "20211112"
  26. ) -> pd.DataFrame:
  27. """
  28. 巨潮资讯-数据中心-专题统计-债券报表-债券发行-可转债发行
  29. http://webapi.cninfo.com.cn/#/thematicStatistics
  30. :param start_date: 开始统计时间
  31. :type start_date: str
  32. :param end_date: 开始统计时间
  33. :type end_date: str
  34. :return: 可转债发行
  35. :rtype: pandas.DataFrame
  36. """
  37. url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1123"
  38. js_code = py_mini_racer.MiniRacer()
  39. js_content = _get_file_content_cninfo("cninfo.js")
  40. js_code.eval(js_content)
  41. mcode = js_code.call("getResCode1")
  42. headers = {
  43. "Accept": "*/*",
  44. "Accept-Enckey": mcode,
  45. "Accept-Encoding": "gzip, deflate",
  46. "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
  47. "Cache-Control": "no-cache",
  48. "Content-Length": "0",
  49. "Host": "webapi.cninfo.com.cn",
  50. "Origin": "http://webapi.cninfo.com.cn",
  51. "Pragma": "no-cache",
  52. "Proxy-Connection": "keep-alive",
  53. "Referer": "http://webapi.cninfo.com.cn/",
  54. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  55. "Chrome/93.0.4577.63 Safari/537.36",
  56. "X-Requested-With": "XMLHttpRequest",
  57. }
  58. params = {
  59. "sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
  60. "edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
  61. }
  62. r = requests.post(url, headers=headers, params=params)
  63. data_json = r.json()
  64. temp_df = pd.DataFrame(data_json["records"])
  65. if temp_df.empty:
  66. return temp_df
  67. temp_df.rename(
  68. columns={
  69. "F029D": "发行起始日",
  70. "SECNAME": "债券简称",
  71. "F027D": "转股开始日期",
  72. "F003D": "发行终止日",
  73. "F007N": "发行面值",
  74. "F053D": "转股终止日期",
  75. "F005N": "计划发行总量",
  76. "F051D": "网上申购日期",
  77. "F026N": "初始转股价格",
  78. "F066N": "网上申购数量下限",
  79. "F052N": "发行价格",
  80. "BONDNAME": "债券名称",
  81. "F014V": "发行对象",
  82. "F002V": "交易市场",
  83. "F032V": "网上申购简称",
  84. "F086V": "转股代码",
  85. "DECLAREDATE": "公告日期",
  86. "F028D": "债权登记日",
  87. "F004D": "优先申购日",
  88. "F068D": "网上申购中签结果公告日及退款日",
  89. "F054D": "优先申购缴款日",
  90. "F008N": "网上申购数量上限",
  91. "SECCODE": "债券代码",
  92. "F006N": "实际发行总量",
  93. "F067N": "网上申购单位",
  94. "F065N": "配售价格",
  95. "F017V": "承销方式",
  96. "F015V": "发行范围",
  97. "F013V": "发行方式",
  98. "F021V": "募资用途说明",
  99. "F031V": "网上申购代码",
  100. },
  101. inplace=True,
  102. )
  103. temp_df = temp_df[
  104. [
  105. "债券代码",
  106. "债券简称",
  107. "公告日期",
  108. "发行起始日",
  109. "发行终止日",
  110. "计划发行总量",
  111. "实际发行总量",
  112. "发行面值",
  113. "发行价格",
  114. "发行方式",
  115. "发行对象",
  116. "发行范围",
  117. "承销方式",
  118. "募资用途说明",
  119. "初始转股价格",
  120. "转股开始日期",
  121. "转股终止日期",
  122. "网上申购日期",
  123. "网上申购代码",
  124. "网上申购简称",
  125. "网上申购数量上限",
  126. "网上申购数量下限",
  127. "网上申购单位",
  128. "网上申购中签结果公告日及退款日",
  129. "优先申购日",
  130. "配售价格",
  131. "债权登记日",
  132. "优先申购缴款日",
  133. "转股代码",
  134. "交易市场",
  135. "债券名称",
  136. ]
  137. ]
  138. temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
  139. temp_df["发行起始日"] = pd.to_datetime(
  140. temp_df["发行起始日"], errors="coerce"
  141. ).dt.date
  142. temp_df["发行终止日"] = pd.to_datetime(
  143. temp_df["发行终止日"], errors="coerce"
  144. ).dt.date
  145. temp_df["转股开始日期"] = pd.to_datetime(
  146. temp_df["转股开始日期"], errors="coerce"
  147. ).dt.date
  148. temp_df["转股终止日期"] = pd.to_datetime(
  149. temp_df["转股终止日期"], errors="coerce"
  150. ).dt.date
  151. temp_df["转股终止日期"] = pd.to_datetime(
  152. temp_df["转股终止日期"], errors="coerce"
  153. ).dt.date
  154. temp_df["网上申购日期"] = pd.to_datetime(
  155. temp_df["网上申购日期"], errors="coerce"
  156. ).dt.date
  157. temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(
  158. temp_df["网上申购中签结果公告日及退款日"], errors="coerce"
  159. ).dt.date
  160. temp_df["债权登记日"] = pd.to_datetime(
  161. temp_df["债权登记日"], errors="coerce"
  162. ).dt.date
  163. temp_df["优先申购日"] = pd.to_datetime(
  164. temp_df["优先申购日"], errors="coerce"
  165. ).dt.date
  166. temp_df["优先申购缴款日"] = pd.to_datetime(
  167. temp_df["优先申购缴款日"], errors="coerce"
  168. ).dt.date
  169. temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
  170. temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
  171. temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
  172. temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
  173. temp_df["初始转股价格"] = pd.to_numeric(temp_df["初始转股价格"], errors="coerce")
  174. temp_df["网上申购数量上限"] = pd.to_numeric(
  175. temp_df["网上申购数量上限"], errors="coerce"
  176. )
  177. temp_df["网上申购数量下限"] = pd.to_numeric(
  178. temp_df["网上申购数量下限"], errors="coerce"
  179. )
  180. temp_df["网上申购单位"] = pd.to_numeric(temp_df["网上申购单位"], errors="coerce")
  181. temp_df["配售价格"] = pd.to_numeric(temp_df["配售价格"], errors="coerce")
  182. return temp_df
  183. if __name__ == "__main__":
  184. bond_cov_issue_cninfo_df = bond_cov_issue_cninfo(
  185. start_date="20250101", end_date="20250131"
  186. )
  187. print(bond_cov_issue_cninfo_df)