You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
380 lines
12 KiB
380 lines
12 KiB
|
2 months ago
|
"""
|
||
|
|
AmazingData 数据源适配器 - 使用示例
|
||
|
|
|
||
|
|
本文件展示了如何使用 AmazingDataAdapter 获取各类金融数据
|
||
|
|
"""
|
||
|
|
|
||
|
|
from amazing_data_adapter import (
|
||
|
|
AmazingDataAdapter,
|
||
|
|
DataSourceConfig,
|
||
|
|
SecurityType,
|
||
|
|
Market,
|
||
|
|
Period,
|
||
|
|
create_adapter
|
||
|
|
)
|
||
|
|
import pandas as pd
|
||
|
|
|
||
|
|
|
||
|
|
def demo_basic_usage():
|
||
|
|
"""基础使用示例"""
|
||
|
|
|
||
|
|
# 方式1: 使用配置对象创建
|
||
|
|
config = DataSourceConfig(
|
||
|
|
username='your_username',
|
||
|
|
password='your_password',
|
||
|
|
host='your_host',
|
||
|
|
port=8080,
|
||
|
|
local_path='./amazing_data_cache/',
|
||
|
|
use_local_cache=True
|
||
|
|
)
|
||
|
|
adapter = AmazingDataAdapter(config)
|
||
|
|
|
||
|
|
# 方式2: 使用便捷函数创建
|
||
|
|
# adapter = create_adapter(
|
||
|
|
# username='your_username',
|
||
|
|
# password='your_password',
|
||
|
|
# host='your_host',
|
||
|
|
# port=8080
|
||
|
|
# )
|
||
|
|
|
||
|
|
# 连接数据源
|
||
|
|
if not adapter.connect():
|
||
|
|
print("连接失败")
|
||
|
|
return
|
||
|
|
|
||
|
|
try:
|
||
|
|
# ============== 基础数据 ==============
|
||
|
|
print("\n=== 基础数据 ===")
|
||
|
|
|
||
|
|
# 获取沪深A股代码列表
|
||
|
|
stock_codes = adapter.get_code_list(SecurityType.STOCK_A)
|
||
|
|
print(f"沪深A股数量: {len(stock_codes)}")
|
||
|
|
|
||
|
|
# 获取ETF代码列表
|
||
|
|
etf_codes = adapter.get_code_list(SecurityType.ETF)
|
||
|
|
print(f"ETF数量: {len(etf_codes)}")
|
||
|
|
|
||
|
|
# 获取期货代码列表
|
||
|
|
future_codes = adapter.get_code_list(SecurityType.FUTURE)
|
||
|
|
print(f"期货数量: {len(future_codes)}")
|
||
|
|
|
||
|
|
# 获取证券基本信息
|
||
|
|
stock_info = adapter.get_code_info(SecurityType.STOCK_A)
|
||
|
|
print(f"\n证券信息列: {stock_info.columns.tolist()}")
|
||
|
|
print(stock_info.head())
|
||
|
|
|
||
|
|
# 获取交易日历
|
||
|
|
calendar = adapter.get_trading_calendar(Market.SH)
|
||
|
|
print(f"\n交易日数量: {len(calendar)}")
|
||
|
|
print(f"最近交易日: {calendar[-5:]}")
|
||
|
|
|
||
|
|
# ============== 历史行情数据 ==============
|
||
|
|
print("\n=== 历史行情数据 ===")
|
||
|
|
|
||
|
|
# 获取日K线数据
|
||
|
|
sample_codes = stock_codes[:5] # 取前5只股票作为示例
|
||
|
|
kline_data = adapter.get_kline(
|
||
|
|
codes=sample_codes,
|
||
|
|
start_date='20240101',
|
||
|
|
end_date='20241231',
|
||
|
|
period=Period.DAILY
|
||
|
|
)
|
||
|
|
|
||
|
|
for code, df in list(kline_data.items())[:2]:
|
||
|
|
print(f"\n{code} K线数据:")
|
||
|
|
print(df.head())
|
||
|
|
|
||
|
|
# 获取分钟K线
|
||
|
|
min_kline = adapter.get_kline(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date='20241201',
|
||
|
|
end_date='20241231',
|
||
|
|
period=Period.MIN60
|
||
|
|
)
|
||
|
|
|
||
|
|
# ============== 复权因子 ==============
|
||
|
|
print("\n=== 复权因子 ===")
|
||
|
|
|
||
|
|
adj_factor = adapter.get_adj_factor(
|
||
|
|
codes=['000001.SZ', '600000.SH'],
|
||
|
|
is_local=False # 强制从服务器获取最新数据
|
||
|
|
)
|
||
|
|
print("单次复权因子:")
|
||
|
|
print(adj_factor.head())
|
||
|
|
|
||
|
|
backward_factor = adapter.get_backward_factor(
|
||
|
|
codes=['000001.SZ', '600000.SH']
|
||
|
|
)
|
||
|
|
print("\n后复权因子:")
|
||
|
|
print(backward_factor.head())
|
||
|
|
|
||
|
|
# ============== 财务数据 ==============
|
||
|
|
print("\n=== 财务数据 ===")
|
||
|
|
|
||
|
|
# 获取资产负债表
|
||
|
|
balance_sheet = adapter.get_balance_sheet(
|
||
|
|
codes=['000001.SZ', '600000.SH'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
for code, df in balance_sheet.items():
|
||
|
|
print(f"\n{code} 资产负债表字段:")
|
||
|
|
print(df.columns.tolist()[:10]) # 显示前10个字段
|
||
|
|
|
||
|
|
# 获取现金流量表
|
||
|
|
cash_flow = adapter.get_cash_flow(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
# 获取利润表
|
||
|
|
income = adapter.get_income_statement(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
# 获取业绩快报
|
||
|
|
profit_express = adapter.get_profit_express(
|
||
|
|
codes=['000001.SZ', '600000.SH']
|
||
|
|
)
|
||
|
|
print(f"\n业绩快报:\n{profit_express.head()}")
|
||
|
|
|
||
|
|
# ============== 股东股本数据 ==============
|
||
|
|
print("\n=== 股东股本数据 ===")
|
||
|
|
|
||
|
|
# 获取十大股东
|
||
|
|
top10_holders = adapter.get_top10_shareholders(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
print(f"十大股东:\n{top10_holders.head()}")
|
||
|
|
|
||
|
|
# 获取股东户数
|
||
|
|
holder_count = adapter.get_shareholder_count(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
print(f"\n股东户数:\n{holder_count.head()}")
|
||
|
|
|
||
|
|
# 获取股本结构
|
||
|
|
equity_structure = adapter.get_equity_structure(
|
||
|
|
codes=['000001.SZ']
|
||
|
|
)
|
||
|
|
print(f"\n股本结构:\n{equity_structure.head()}")
|
||
|
|
|
||
|
|
# ============== 融资融券数据 ==============
|
||
|
|
print("\n=== 融资融券数据 ===")
|
||
|
|
|
||
|
|
# 获取融资融券汇总
|
||
|
|
margin_summary = adapter.get_margin_summary(
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
print(f"融资融券汇总:\n{margin_summary.head()}")
|
||
|
|
|
||
|
|
# 获取个股融资融券明细
|
||
|
|
margin_detail = adapter.get_margin_detail(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20241201,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
# ============== 交易异动数据 ==============
|
||
|
|
print("\n=== 交易异动数据 ===")
|
||
|
|
|
||
|
|
# 获取龙虎榜
|
||
|
|
longhu = adapter.get_longhu_bang(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20241201,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
print(f"龙虎榜数据:\n{longhu.head()}")
|
||
|
|
|
||
|
|
# 获取大宗交易
|
||
|
|
block_trade = adapter.get_block_trading(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date=20241201,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
print(f"\n大宗交易:\n{block_trade.head()}")
|
||
|
|
|
||
|
|
# ============== 指数数据 ==============
|
||
|
|
print("\n=== 指数数据 ===")
|
||
|
|
|
||
|
|
# 获取指数成分股 (沪深300)
|
||
|
|
index_constituents = adapter.get_index_constituents(['000300.SH'])
|
||
|
|
for code, df in index_constituents.items():
|
||
|
|
print(f"\n{code} 成分股数量: {len(df)}")
|
||
|
|
print(df.head())
|
||
|
|
|
||
|
|
# 获取指数成分股权重
|
||
|
|
index_weights = adapter.get_index_weights(
|
||
|
|
codes=['000300.SH', '000905.SH'], # 沪深300和中证500
|
||
|
|
start_date=20241201,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
# ============== ETF数据 ==============
|
||
|
|
print("\n=== ETF数据 ===")
|
||
|
|
|
||
|
|
# 获取ETF申赎数据
|
||
|
|
etf_info, etf_constituents = adapter.get_etf_pcf(['510050.SH'])
|
||
|
|
print(f"ETF基本信息:\n{etf_info.head()}")
|
||
|
|
|
||
|
|
# 获取基金份额
|
||
|
|
fund_share = adapter.get_fund_share(
|
||
|
|
codes=['510050.SH'],
|
||
|
|
start_date=20240101,
|
||
|
|
end_date=20241231
|
||
|
|
)
|
||
|
|
|
||
|
|
# ============== 可转债数据 ==============
|
||
|
|
print("\n=== 可转债数据 ===")
|
||
|
|
|
||
|
|
# 获取可转债发行数据
|
||
|
|
kzz_codes = adapter.get_code_list(SecurityType.KZZ)
|
||
|
|
print(f"可转债数量: {len(kzz_codes)}")
|
||
|
|
|
||
|
|
if kzz_codes:
|
||
|
|
kzz_issuance = adapter.get_kzz_issuance(kzz_codes[:3])
|
||
|
|
for code, df in list(kzz_issuance.items())[:1]:
|
||
|
|
print(f"\n{code} 发行信息:\n{df.head()}")
|
||
|
|
|
||
|
|
finally:
|
||
|
|
# 断开连接
|
||
|
|
adapter.disconnect()
|
||
|
|
|
||
|
|
|
||
|
|
def demo_data_processing():
|
||
|
|
"""数据处理示例 - 展示如何加工获取的数据"""
|
||
|
|
|
||
|
|
adapter = create_adapter(
|
||
|
|
username='your_username',
|
||
|
|
password='your_password',
|
||
|
|
host='your_host',
|
||
|
|
port=8080
|
||
|
|
)
|
||
|
|
|
||
|
|
if not adapter.connect():
|
||
|
|
return
|
||
|
|
|
||
|
|
try:
|
||
|
|
# 获取平安银行(000001.SZ)的日K线数据
|
||
|
|
kline_data = adapter.get_kline(
|
||
|
|
codes=['000001.SZ'],
|
||
|
|
start_date='20240101',
|
||
|
|
end_date='20241231',
|
||
|
|
period=Period.DAILY
|
||
|
|
)
|
||
|
|
|
||
|
|
df = kline_data['000001.SZ']
|
||
|
|
|
||
|
|
# 计算技术指标
|
||
|
|
# 1. 移动平均线
|
||
|
|
df['MA5'] = df['close'].rolling(window=5).mean()
|
||
|
|
df['MA10'] = df['close'].rolling(window=10).mean()
|
||
|
|
df['MA20'] = df['close'].rolling(window=20).mean()
|
||
|
|
|
||
|
|
# 2. 涨跌幅
|
||
|
|
df['return'] = df['close'].pct_change()
|
||
|
|
|
||
|
|
# 3. 波动率 (20日)
|
||
|
|
df['volatility'] = df['return'].rolling(window=20).std() * (252 ** 0.5)
|
||
|
|
|
||
|
|
# 4. 成交量移动平均
|
||
|
|
df['volume_MA5'] = df['volume'].rolling(window=5).mean()
|
||
|
|
|
||
|
|
print("加工后的数据:")
|
||
|
|
print(df[['close', 'MA5', 'MA10', 'MA20', 'return', 'volatility']].tail(10))
|
||
|
|
|
||
|
|
# 获取复权因子并计算复权价格
|
||
|
|
adj_factor = adapter.get_backward_factor(['000001.SZ'])
|
||
|
|
|
||
|
|
# 合并K线和复权因子
|
||
|
|
df['trade_date'] = df.index.strftime('%Y%m%d').astype(int)
|
||
|
|
df = df.merge(
|
||
|
|
adj_factor[['000001.SZ']].reset_index(),
|
||
|
|
left_on='trade_date',
|
||
|
|
right_on='index',
|
||
|
|
how='left'
|
||
|
|
)
|
||
|
|
df = df.rename(columns={'000001.SZ': 'adj_factor'})
|
||
|
|
|
||
|
|
# 计算后复权价格
|
||
|
|
df['adj_close'] = df['close'] * df['adj_factor']
|
||
|
|
|
||
|
|
print("\n复权后的价格:")
|
||
|
|
print(df[['close', 'adj_factor', 'adj_close']].tail(10))
|
||
|
|
|
||
|
|
finally:
|
||
|
|
adapter.disconnect()
|
||
|
|
|
||
|
|
|
||
|
|
def demo_batch_processing():
|
||
|
|
"""批量处理示例"""
|
||
|
|
|
||
|
|
adapter = create_adapter(
|
||
|
|
username='your_username',
|
||
|
|
password='your_password',
|
||
|
|
host='your_host',
|
||
|
|
port=8080
|
||
|
|
)
|
||
|
|
|
||
|
|
if not adapter.connect():
|
||
|
|
return
|
||
|
|
|
||
|
|
try:
|
||
|
|
# 获取沪深300成分股
|
||
|
|
index_constituents = adapter.get_index_constituents(['000300.SH'])
|
||
|
|
hs300_codes = index_constituents['000300.SH']['CON_CODE'].tolist()
|
||
|
|
|
||
|
|
print(f"沪深300成分股数量: {len(hs300_codes)}")
|
||
|
|
|
||
|
|
# 批量获取财务数据 (分批处理避免超时)
|
||
|
|
batch_size = 50
|
||
|
|
all_balance_sheets = {}
|
||
|
|
|
||
|
|
for i in range(0, len(hs300_codes), batch_size):
|
||
|
|
batch_codes = hs300_codes[i:i+batch_size]
|
||
|
|
print(f"处理第 {i//batch_size + 1} 批,共 {len(batch_codes)} 只股票")
|
||
|
|
|
||
|
|
batch_data = adapter.get_balance_sheet(
|
||
|
|
codes=batch_codes,
|
||
|
|
start_date=20240930,
|
||
|
|
end_date=20240930
|
||
|
|
)
|
||
|
|
all_balance_sheets.update(batch_data)
|
||
|
|
|
||
|
|
# 合并所有数据
|
||
|
|
combined_data = []
|
||
|
|
for code, df in all_balance_sheets.items():
|
||
|
|
if not df.empty:
|
||
|
|
df['code'] = code
|
||
|
|
combined_data.append(df)
|
||
|
|
|
||
|
|
if combined_data:
|
||
|
|
result_df = pd.concat(combined_data, ignore_index=True)
|
||
|
|
print(f"\n合并后的数据形状: {result_df.shape}")
|
||
|
|
print(result_df[['code', 'REPORTING_PERIOD', 'TOTAL_ASSETS', 'TOTAL_CUR_ASSETS']].head())
|
||
|
|
|
||
|
|
finally:
|
||
|
|
adapter.disconnect()
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print("=" * 60)
|
||
|
|
print("AmazingData 数据源适配器 - 使用示例")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
# 注:实际运行前请替换用户名、密码和服务器地址
|
||
|
|
print("\n提示: 请先在代码中替换 username, password, host, port 为实际值")
|
||
|
|
|
||
|
|
# demo_basic_usage()
|
||
|
|
# demo_data_processing()
|
||
|
|
# demo_batch_processing()
|