fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
312 lines
11 KiB
Python
312 lines
11 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
"""
|
|
Date: 2025/9/11 13:00
|
|
Desc: 东方财富-港股-公司概况
|
|
https://emweb.securities.eastmoney.com/PC_HKF10/pages/home/index.html?code=03900&type=web&color=w#/CompanyProfile
|
|
"""
|
|
|
|
import pandas as pd
|
|
import requests
|
|
|
|
|
|
def stock_hk_security_profile_em(symbol: str = "03900") -> pd.DataFrame:
|
|
"""
|
|
东方财富-港股-证券资料
|
|
https://emweb.securities.eastmoney.com/PC_HKF10/pages/home/index.html?code=03900&type=web&color=w#/CompanyProfile
|
|
:param symbol: 股票代码
|
|
:type symbol: str
|
|
:return: 证券资料
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://datacenter.eastmoney.com/securities/api/data/v1/get"
|
|
params = {
|
|
"reportName": "RPT_HKF10_INFO_SECURITYINFO",
|
|
"columns": "SECUCODE,SECURITY_CODE,SECURITY_NAME_ABBR,SECURITY_TYPE,LISTING_DATE,ISIN_CODE,BOARD,"
|
|
"TRADE_UNIT,TRADE_MARKET,GANGGUTONGBIAODISHEN,GANGGUTONGBIAODIHU,PAR_VALUE,"
|
|
"ISSUE_PRICE,ISSUE_NUM,YEAR_SETTLE_DAY",
|
|
"quoteColumns": "",
|
|
"filter": f'(SECUCODE="{symbol}.HK")',
|
|
"pageNumber": "1",
|
|
"pageSize": "200",
|
|
"sortTypes": "",
|
|
"sortColumns": "",
|
|
"source": "F10",
|
|
"client": "PC",
|
|
"v": "04748497219912483",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
field_mapping = {
|
|
"BOARD": "板块",
|
|
"GANGGUTONGBIAODIHU": "是否沪港通标的",
|
|
"GANGGUTONGBIAODISHEN": "是否深港通标的",
|
|
"ISIN_CODE": "ISIN(国际证券识别编码)",
|
|
"ISSUE_NUM": "发行量(股)",
|
|
"ISSUE_PRICE": "发行价",
|
|
"LISTING_DATE": "上市日期",
|
|
"PAR_VALUE": "每股面值",
|
|
"SECUCODE": "证券代码",
|
|
"SECURITY_NAME_ABBR": "证券简称",
|
|
"SECURITY_TYPE": "证券类型",
|
|
"TRADE_MARKET": "交易所",
|
|
"TRADE_UNIT": "每手股数",
|
|
"YEAR_SETTLE_DAY": "年结日",
|
|
}
|
|
temp_df.rename(columns=field_mapping, inplace=True)
|
|
temp_df = temp_df[
|
|
[
|
|
"证券代码",
|
|
"证券简称",
|
|
"上市日期",
|
|
"证券类型",
|
|
"发行价",
|
|
"发行量(股)",
|
|
"每手股数",
|
|
"每股面值",
|
|
"交易所",
|
|
"板块",
|
|
"年结日",
|
|
"ISIN(国际证券识别编码)",
|
|
"是否沪港通标的",
|
|
"是否深港通标的",
|
|
]
|
|
]
|
|
return temp_df
|
|
|
|
|
|
def stock_hk_company_profile_em(symbol: str = "03900") -> pd.DataFrame:
|
|
"""
|
|
东方财富-港股-公司资料
|
|
https://emweb.securities.eastmoney.com/PC_HKF10/pages/home/index.html?code=03900&type=web&color=w#/CompanyProfile
|
|
:param symbol: 股票代码
|
|
:type symbol: str
|
|
:return: 公司资料
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://datacenter.eastmoney.com/securities/api/data/v1/get"
|
|
params = {
|
|
"reportName": "RPT_HKF10_INFO_ORGPROFILE",
|
|
"columns": "SECUCODE,SECURITY_CODE,ORG_NAME,ORG_EN_ABBR,BELONG_INDUSTRY,FOUND_DATE,CHAIRMAN,"
|
|
"SECRETARY,ACCOUNT_FIRM,REG_ADDRESS,ADDRESS,YEAR_SETTLE_DAY,EMP_NUM,ORG_TEL,ORG_FAX,ORG_EMAIL,"
|
|
"ORG_WEB,ORG_PROFILE,REG_PLACE",
|
|
"quoteColumns": "",
|
|
"filter": f'(SECUCODE="{symbol}.HK")',
|
|
"pageNumber": "1",
|
|
"pageSize": "200",
|
|
"sortTypes": "",
|
|
"sortColumns": "",
|
|
"source": "F10",
|
|
"client": "PC",
|
|
"v": "04748497219912483",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
field_mapping = {
|
|
"ACCOUNT_FIRM": "核数师",
|
|
"ADDRESS": "办公地址",
|
|
"BELONG_INDUSTRY": "所属行业",
|
|
"CHAIRMAN": "董事长",
|
|
"EMP_NUM": "员工人数",
|
|
"FOUND_DATE": "公司成立日期",
|
|
"ORG_EMAIL": "E-MAIL",
|
|
"ORG_EN_ABBR": "英文名称",
|
|
"ORG_FAX": "传真",
|
|
"ORG_NAME": "公司名称",
|
|
"ORG_PROFILE": "公司介绍",
|
|
"ORG_TEL": "联系电话",
|
|
"ORG_WEB": "公司网址",
|
|
"REG_ADDRESS": "注册地址",
|
|
"REG_PLACE": "注册地",
|
|
"SECRETARY": "公司秘书",
|
|
"SECUCODE": "股票代码",
|
|
"SECURITY_CODE": "证券代码",
|
|
"YEAR_SETTLE_DAY": "年结日",
|
|
}
|
|
temp_df.rename(columns=field_mapping, inplace=True)
|
|
temp_df = temp_df[
|
|
[
|
|
"公司名称",
|
|
"英文名称",
|
|
"注册地",
|
|
"注册地址",
|
|
"公司成立日期",
|
|
"所属行业",
|
|
"董事长",
|
|
"公司秘书",
|
|
"员工人数",
|
|
"办公地址",
|
|
"公司网址",
|
|
"E-MAIL",
|
|
"年结日",
|
|
"联系电话",
|
|
"核数师",
|
|
"传真",
|
|
"公司介绍",
|
|
]
|
|
]
|
|
return temp_df
|
|
|
|
|
|
def stock_hk_financial_indicator_em(symbol: str = "03900") -> pd.DataFrame:
|
|
"""
|
|
东方财富-港股-核心必读-最新指标
|
|
https://emweb.securities.eastmoney.com/PC_HKF10/pages/home/index.html?code=03900&type=web&color=w#/CoreReading
|
|
:param symbol: 股票代码
|
|
:type symbol: str
|
|
:return: 财务指标
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://datacenter.eastmoney.com/securities/api/data/v1/get"
|
|
params = {
|
|
"reportName": "RPT_CUSTOM_HKF10_FN_MAININDICATORMAX",
|
|
"columns": "ORG_CODE,SECUCODE,SECURITY_CODE,SECURITY_NAME_ABBR,SECURITY_INNER_CODE,REPORT_DATE,BASIC_EPS,"
|
|
"PER_NETCASH_OPERATE,BPS,BPS_NEDILUTED,COMMON_ACS,PER_SHARES,ISSUED_COMMON_SHARES,HK_COMMON_SHARES,"
|
|
"TOTAL_MARKET_CAP,HKSK_MARKET_CAP,OPERATE_INCOME,OPERATE_INCOME_SQ,OPERATE_INCOME_QOQ,"
|
|
"OPERATE_INCOME_QOQ_SQ,HOLDER_PROFIT,HOLDER_PROFIT_SQ,HOLDER_PROFIT_QOQ,HOLDER_PROFIT_QOQ_SQ,PE_TTM,"
|
|
"PE_TTM_SQ,PB_TTM,PB_TTM_SQ,NET_PROFIT_RATIO,NET_PROFIT_RATIO_SQ,ROE_AVG,ROE_AVG_SQ,ROA,"
|
|
"ROA_SQ,DIVIDEND_TTM,DIVIDEND_LFY,DIVI_RATIO,DIVIDEND_RATE,IS_CNY_CODE",
|
|
"quoteColumns": "",
|
|
"filter": f'(SECUCODE="{symbol}.HK")',
|
|
"pageNumber": "1",
|
|
"pageSize": "200",
|
|
"sortTypes": "-1",
|
|
"sortColumns": "REPORT_DATE",
|
|
"source": "F10",
|
|
"client": "PC",
|
|
"v": "07945646099062258",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
field_mapping = {
|
|
"SECURITY_CODE": "股票代码",
|
|
"BASIC_EPS": "基本每股收益(元)",
|
|
"BPS": "每股净资产(元)",
|
|
"COMMON_ACS": "法定股本(股)",
|
|
"PER_SHARES": "每手股",
|
|
"DIVIDEND_TTM": "每股股息TTM(港元)",
|
|
"DIVI_RATIO": "派息比率(%)",
|
|
"ISSUED_COMMON_SHARES": "已发行股本(股)",
|
|
"HK_COMMON_SHARES": "已发行股本-H股(股)",
|
|
"PER_NETCASH_OPERATE": "每股经营现金流(元)",
|
|
"DIVIDEND_RATE": "股息率TTM(%)",
|
|
"TOTAL_MARKET_CAP": "总市值(港元)",
|
|
"HKSK_MARKET_CAP": "港股市值(港元)",
|
|
"OPERATE_INCOME": "营业总收入",
|
|
"OPERATE_INCOME_QOQ": "营业总收入滚动环比增长(%)",
|
|
"NET_PROFIT_RATIO": "销售净利率(%)",
|
|
"HOLDER_PROFIT": "净利润",
|
|
"HOLDER_PROFIT_QOQ": "净利润滚动环比增长(%)",
|
|
"ROE_AVG": "股东权益回报率(%)",
|
|
"PE_TTM": "市盈率",
|
|
"PB_TTM": "市净率",
|
|
"ROA": "总资产回报率(%)",
|
|
}
|
|
temp_df.rename(columns=field_mapping, inplace=True)
|
|
temp_df = temp_df[
|
|
[
|
|
"基本每股收益(元)",
|
|
"每股净资产(元)",
|
|
"法定股本(股)",
|
|
"每手股",
|
|
"每股股息TTM(港元)",
|
|
"派息比率(%)",
|
|
"已发行股本(股)",
|
|
"已发行股本-H股(股)",
|
|
"每股经营现金流(元)",
|
|
"股息率TTM(%)",
|
|
"总市值(港元)",
|
|
"港股市值(港元)",
|
|
"营业总收入",
|
|
"营业总收入滚动环比增长(%)",
|
|
"销售净利率(%)",
|
|
"净利润",
|
|
"净利润滚动环比增长(%)",
|
|
"股东权益回报率(%)",
|
|
"市盈率",
|
|
"市净率",
|
|
"总资产回报率(%)",
|
|
]
|
|
]
|
|
return temp_df
|
|
|
|
|
|
def stock_hk_dividend_payout_em(symbol: str = "03900") -> pd.DataFrame:
|
|
"""
|
|
东方财富-港股-核心必读-分红派息
|
|
https://emweb.securities.eastmoney.com/PC_HKF10/pages/home/index.html?code=03900&type=web&color=w#/CoreReading
|
|
:param symbol: 股票代码
|
|
:type symbol: str
|
|
:return: 分红派息
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://datacenter.eastmoney.com/securities/api/data/v1/get"
|
|
params = {
|
|
"reportName": "RPT_HKF10_MAIN_DIVBASIC",
|
|
"columns": "SECURITY_CODE,UPDATE_DATE,REPORT_TYPE,EX_DIVIDEND_DATE,DIVIDEND_DATE,"
|
|
"TRANSFER_END_DATE,YEAR,PLAN_EXPLAIN,IS_BFP",
|
|
"quoteColumns": "",
|
|
"filter": f'(SECURITY_CODE="{symbol}")(IS_BFP="0")',
|
|
"pageNumber": "1",
|
|
"pageSize": "200",
|
|
"sortTypes": "-1,-1",
|
|
"sortColumns": "NOTICE_DATE,EX_DIVIDEND_DATE",
|
|
"source": "F10",
|
|
"client": "PC",
|
|
"v": "035584639294227527",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
|
|
field_mapping = {
|
|
"SECURITY_CODE": "股票代码",
|
|
"UPDATE_DATE": "最新公告日期",
|
|
"REPORT_TYPE": "分配类型",
|
|
"EX_DIVIDEND_DATE": "除净日",
|
|
"DIVIDEND_DATE": "发放日",
|
|
"TRANSFER_END_DATE": "截至过户日",
|
|
"YEAR": "财政年度",
|
|
"PLAN_EXPLAIN": "分红方案",
|
|
"IS_BFP": "IS_BFP",
|
|
}
|
|
columns = [
|
|
"最新公告日期",
|
|
"财政年度",
|
|
"分红方案",
|
|
"分配类型",
|
|
"除净日",
|
|
"截至过户日",
|
|
"发放日",
|
|
]
|
|
|
|
temp_df = pd.DataFrame(columns=columns)
|
|
if data_json["result"] is not None:
|
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
temp_df.rename(columns=field_mapping, inplace=True)
|
|
temp_df = temp_df[columns]
|
|
temp_df["最新公告日期"] = pd.to_datetime(
|
|
temp_df["最新公告日期"], errors="coerce"
|
|
).dt.date
|
|
temp_df["除净日"] = pd.to_datetime(temp_df["除净日"], errors="coerce").dt.date
|
|
temp_df["发放日"] = pd.to_datetime(
|
|
temp_df["发放日"], format="%Y/%m/%d", errors="coerce"
|
|
).dt.date
|
|
return temp_df
|
|
|
|
|
|
if __name__ == "__main__":
|
|
stock_hk_security_profile_em_df = stock_hk_security_profile_em(symbol="03900")
|
|
print(stock_hk_security_profile_em_df)
|
|
|
|
stock_hk_company_profile_em_df = stock_hk_company_profile_em(symbol="03900")
|
|
print(stock_hk_company_profile_em_df)
|
|
|
|
stock_hk_financial_indicator_em_df = stock_hk_financial_indicator_em(symbol="03900")
|
|
print(stock_hk_financial_indicator_em_df)
|
|
|
|
stock_hk_dividend_payout_em_df = stock_hk_dividend_payout_em(symbol="03900")
|
|
print(stock_hk_dividend_payout_em_df)
|