commit;
This commit is contained in:
parent
df08ba3f16
commit
e8a6fdcac5
|
|
@ -21,4 +21,6 @@ pymongo==4.13.0
|
|||
scikit-learn==1.6.1
|
||||
dbutils==3.1.2
|
||||
pyyaml==6.0.3
|
||||
xtquant==250516.1.1
|
||||
xtquant==250516.1.1
|
||||
tushare>=1.4.24
|
||||
akshare==1.17.82
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
# QMT交易配置
|
||||
qmt_config:
|
||||
# 客户端路径
|
||||
client_path: "C:\\中金财富QMT个人版交易端\\userdata_mini"
|
||||
|
||||
# 账户配置
|
||||
account:
|
||||
account_id: "79367690" # 资金账号
|
||||
account_type: "STOCK" # 账号类型:STOCK(股票) CREDIT(信用) FUTURE(期货)
|
||||
|
||||
# 数据库配置
|
||||
database:
|
||||
host: "192.168.18.199"
|
||||
port: 3307
|
||||
user: "root"
|
||||
password: "Chlry$%.8_07"
|
||||
database: "trading_cs"
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level: "INFO"
|
||||
log_dir: "../logs"
|
||||
log_format: "%(asctime)s - %(levelname)s - %(message)s"
|
||||
|
||||
# Redis 配置
|
||||
redis:
|
||||
host: "192.168.18.208"
|
||||
port: 6379
|
||||
db: 14
|
||||
password: "wlkj2018"
|
||||
socket_timeout: 5
|
||||
|
||||
# 计划同步配置(从MySQL同步到Redis)
|
||||
plan_sync:
|
||||
interval_seconds: 60 # 定时同步周期,秒
|
||||
|
||||
# 交易策略配置
|
||||
strategy:
|
||||
# 买入配置
|
||||
buy:
|
||||
amount: 50000 # 每只股票买入金额(元)
|
||||
enabled: true # 是否启用买入策略
|
||||
|
||||
# 卖出配置
|
||||
sell:
|
||||
enabled: true # 是否启用卖出策略
|
||||
# 卖出策略:当价格高于目标价时卖出全部持仓
|
||||
|
||||
# 订单配置
|
||||
order:
|
||||
timeout: 300 # 订单超时时间(秒),默认5分钟
|
||||
cooldown: 60 # 同股票下单冷却时间(秒),避免频繁下单
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
# QMT交易配置
|
||||
qmt_config:
|
||||
# 客户端路径
|
||||
client_path: "C:\\中金财富QMT个人版交易端\\userdata_mini"
|
||||
|
||||
# 账户配置
|
||||
account:
|
||||
account_id: "79355243" # 资金账号
|
||||
account_type: "STOCK" # 账号类型:STOCK(股票) CREDIT(信用) FUTURE(期货)
|
||||
|
||||
# 数据库配置
|
||||
database:
|
||||
host: "192.168.18.199"
|
||||
port: 3306
|
||||
user: "root"
|
||||
password: "Chlry#$.8"
|
||||
database: "db_gp_cj"
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level: "INFO"
|
||||
log_dir: "../logs"
|
||||
log_format: "%(asctime)s - %(levelname)s - %(message)s"
|
||||
|
||||
# Redis 配置
|
||||
redis:
|
||||
host: "192.168.18.208"
|
||||
port: 6379
|
||||
db: 13
|
||||
password: "wlkj2018"
|
||||
socket_timeout: 5
|
||||
|
||||
# 计划同步配置(从MySQL同步到Redis)
|
||||
plan_sync:
|
||||
interval_seconds: 60 # 定时同步周期,秒
|
||||
|
||||
# 交易策略配置
|
||||
strategy:
|
||||
# 买入配置
|
||||
buy:
|
||||
amount: 50000 # 每只股票买入金额(元)
|
||||
enabled: true # 是否启用买入策略
|
||||
|
||||
# 卖出配置
|
||||
sell:
|
||||
enabled: true # 是否启用卖出策略
|
||||
# 卖出策略:当价格高于目标价时卖出全部持仓
|
||||
|
||||
# 订单配置
|
||||
order:
|
||||
timeout: 300 # 订单超时时间(秒),默认5分钟
|
||||
cooldown: 60 # 同股票下单冷却时间(秒),避免频繁下单
|
||||
|
|
@ -186,7 +186,7 @@ if __name__ == '__main__':
|
|||
# 启动每10分钟持仓快照覆盖更新线程(只更新DB,不叠加)
|
||||
start_position_snapshot_monitor(xt_trader, acc, logger, interval_seconds=600)
|
||||
# 下载股票数据
|
||||
xtdata.download_sector_data()
|
||||
# xtdata.download_sector_data()
|
||||
|
||||
# 创建买入策略回调函数
|
||||
buy_strategy_callback = create_buy_strategy_callback(xt_trader, acc, buy_amount, logger)
|
||||
|
|
|
|||
|
|
@ -57,18 +57,42 @@ class RedisStateManager:
|
|||
return {k: json.loads(v) for k, v in data.items()} if data else {}
|
||||
|
||||
def get_pending(self, stock_code: str) -> Optional[Dict]:
|
||||
# 优先从独立key读取(带过期时间)
|
||||
pending_item_key = f"{PENDING_KEY}:{stock_code}"
|
||||
v = self.r.get(pending_item_key)
|
||||
if v:
|
||||
return json.loads(v)
|
||||
# 如果独立key不存在,尝试从Hash读取(兼容旧数据)
|
||||
v = self.r.hget(PENDING_KEY, stock_code)
|
||||
return json.loads(v) if v else None
|
||||
|
||||
def set_pending(self, stock_code: str, order_info: Dict) -> None:
|
||||
# 使用独立的key以支持过期时间(6小时)
|
||||
pending_item_key = f"{PENDING_KEY}:{stock_code}"
|
||||
self.r.setex(
|
||||
pending_item_key,
|
||||
6 * 3600, # 6小时过期
|
||||
json.dumps(order_info, ensure_ascii=False)
|
||||
)
|
||||
# 同时在Hash中记录,方便get_all_pending查询
|
||||
self.r.hset(PENDING_KEY, stock_code, json.dumps(order_info, ensure_ascii=False))
|
||||
self._touch_meta('pending_updated_at')
|
||||
|
||||
def del_pending(self, stock_code: str) -> None:
|
||||
# 删除独立key和Hash中的记录
|
||||
pending_item_key = f"{PENDING_KEY}:{stock_code}"
|
||||
self.r.delete(pending_item_key)
|
||||
self.r.hdel(PENDING_KEY, stock_code)
|
||||
self._touch_meta('pending_updated_at')
|
||||
|
||||
def clear_pending(self) -> None:
|
||||
# 删除Hash中的所有记录
|
||||
stock_codes = list(self.r.hkeys(PENDING_KEY))
|
||||
# 删除所有独立的pending key
|
||||
if stock_codes:
|
||||
pending_keys = [f"{PENDING_KEY}:{code}" for code in stock_codes]
|
||||
self.r.delete(*pending_keys)
|
||||
# 删除Hash本身
|
||||
self.r.delete(PENDING_KEY)
|
||||
self._touch_meta('pending_cleared_at')
|
||||
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger):
|
|||
实时行情回调函数
|
||||
检查当前价格是否低于目标价格,如果满足条件则买入
|
||||
"""
|
||||
# logger.info(f"收到买入行情数据: {datetime.datetime.now()}")
|
||||
logger.info(f"收到买入行情数据: {datetime.datetime.now()}")
|
||||
|
||||
# 获取当前时间
|
||||
current_time = datetime.datetime.now().time()
|
||||
|
|
@ -232,7 +232,7 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger):
|
|||
target_price = plan_info['target_price']
|
||||
buy_amount = plan_info['buy_amount']
|
||||
|
||||
# logger.info(f"[买入监控] {stock_code} 当前价格: {current_price:.2f}, 目标价格: {target_price:.2f}")
|
||||
logger.info(f"[买入监控] {stock_code} 当前价格: {current_price:.2f}, 目标价格: {target_price:.2f}")
|
||||
|
||||
# 判断是否满足买入条件:当前价格低于目标价格
|
||||
if current_price < target_price:
|
||||
|
|
@ -240,12 +240,12 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger):
|
|||
# 检查持仓(Redis)
|
||||
current_qty = r.get_position(stock_code)
|
||||
if current_qty > 0:
|
||||
# logger.info(f"{stock_code} 已有持仓 {current_qty}股,跳过买入")
|
||||
logger.info(f"{stock_code} 已有持仓 {current_qty}股,跳过买入")
|
||||
continue
|
||||
|
||||
# 检查是否有在途订单(Redis)
|
||||
if is_stock_pending_order(stock_code):
|
||||
# logger.info(f"{stock_code} 有在途订单,跳过买入")
|
||||
logger.info(f"{stock_code} 有在途订单,跳过买入")
|
||||
continue
|
||||
|
||||
# 集合竞价时段:只观察,不下单
|
||||
|
|
@ -280,9 +280,11 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger):
|
|||
|
||||
# 添加到在途订单(同时记录到数据库)
|
||||
add_pending_order(stock_code, order_id, buy_volume, current_price, target_price, 'buy', logger)
|
||||
|
||||
|
||||
# 单次更新账户资金(不阻塞回调)
|
||||
update_account_funds_once(xt_trader, acc, logger)
|
||||
|
||||
logger.info(f"已提交买入订单: {stock_code} {buy_volume}股,价格{target_price},订单ID: {order_id}")
|
||||
update_account_funds_periodically(xt_trader, acc, logger)
|
||||
else:
|
||||
logger.warning(f"买入数量计算为0,跳过 {stock_code}")
|
||||
else:
|
||||
|
|
@ -376,7 +378,8 @@ def create_sell_strategy_callback(xt_trader, acc, logger):
|
|||
add_pending_order(stock_code, order_id, sell_volume, current_price, target_price, 'sell', logger)
|
||||
|
||||
logger.info(f"已提交卖出订单: {stock_code} {sell_volume}股,价格{target_price},订单ID: {order_id}")
|
||||
update_account_funds_periodically(xt_trader, acc, logger)
|
||||
# 单次更新账户资金(不阻塞回调)
|
||||
update_account_funds_once(xt_trader, acc, logger)
|
||||
else:
|
||||
logger.warning(f"卖出数量为0,跳过 {stock_code}")
|
||||
else:
|
||||
|
|
@ -389,15 +392,73 @@ def create_sell_strategy_callback(xt_trader, acc, logger):
|
|||
|
||||
return f
|
||||
|
||||
def _update_account_funds_sync(xt_trader, acc, logger):
|
||||
"""同步更新账户资金信息(内部函数,在后台线程中执行)"""
|
||||
try:
|
||||
# 获取账户资金信息
|
||||
account_info = xt_trader.query_stock_asset(acc)
|
||||
|
||||
if account_info:
|
||||
# 计算相关数据
|
||||
available_cash = getattr(account_info, 'm_dCash', 0.0)
|
||||
frozen_cash = getattr(account_info, 'm_dFrozenCash', 0.0)
|
||||
market_value = getattr(account_info, 'm_dMarketValue', 0.0)
|
||||
total_asset = available_cash + frozen_cash + market_value
|
||||
|
||||
# 尝试获取盈亏信息,如果属性不存在则设为0
|
||||
try:
|
||||
profit_loss = getattr(account_info, 'm_dProfitLoss', 0.0)
|
||||
except AttributeError:
|
||||
# 如果m_dProfitLoss不存在,尝试其他可能的属性名
|
||||
profit_loss = getattr(account_info, 'm_dProfit', 0.0)
|
||||
|
||||
# 计算盈亏比例
|
||||
if total_asset > 0:
|
||||
profit_loss_ratio = (profit_loss / total_asset) * 100
|
||||
else:
|
||||
profit_loss_ratio = 0.0
|
||||
|
||||
# 更新到数据库
|
||||
db_manager = initialize_database_manager(logger)
|
||||
success = db_manager.update_account_funds(
|
||||
account_id=acc.account_id,
|
||||
account_type=acc.account_type, # 修复:去掉引号
|
||||
total_asset=total_asset,
|
||||
available_cash=available_cash,
|
||||
frozen_cash=frozen_cash,
|
||||
market_value=market_value,
|
||||
profit_loss=profit_loss,
|
||||
profit_loss_ratio=profit_loss_ratio
|
||||
)
|
||||
|
||||
if success:
|
||||
logger.info(f"账户资金更新成功 - 总资产: {total_asset:.2f}, 可用资金: {available_cash:.2f}, 市值: {market_value:.2f}")
|
||||
else:
|
||||
logger.warning("账户资金更新失败")
|
||||
else:
|
||||
logger.warning("无法获取账户资金信息")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"更新账户资金信息时出错: {str(e)}")
|
||||
|
||||
def update_account_funds_once(xt_trader, acc, logger):
|
||||
"""单次更新账户资金信息到数据库(异步执行,不阻塞回调函数)"""
|
||||
# 在后台线程中执行,避免阻塞行情回调
|
||||
thread = threading.Thread(
|
||||
target=_update_account_funds_sync,
|
||||
args=(xt_trader, acc, logger),
|
||||
daemon=True
|
||||
)
|
||||
thread.start()
|
||||
|
||||
def update_account_funds_periodically(xt_trader, acc, logger):
|
||||
"""每小时更新账户资金信息到数据库"""
|
||||
"""每小时更新账户资金信息到数据库(用于后台线程,包含循环)"""
|
||||
while True:
|
||||
try:
|
||||
# 获取账户资金信息
|
||||
account_info = xt_trader.query_stock_asset(acc)
|
||||
|
||||
if account_info:
|
||||
|
||||
# 计算相关数据
|
||||
available_cash = getattr(account_info, 'm_dCash', 0.0)
|
||||
frozen_cash = getattr(account_info, 'm_dFrozenCash', 0.0)
|
||||
|
|
@ -421,7 +482,7 @@ def update_account_funds_periodically(xt_trader, acc, logger):
|
|||
db_manager = initialize_database_manager(logger)
|
||||
success = db_manager.update_account_funds(
|
||||
account_id=acc.account_id,
|
||||
account_type="acc.account_type",
|
||||
account_type=acc.account_type, # 修复:去掉引号
|
||||
total_asset=total_asset,
|
||||
available_cash=available_cash,
|
||||
frozen_cash=frozen_cash,
|
||||
|
|
|
|||
379
src/app.py
379
src/app.py
|
|
@ -46,6 +46,7 @@ from src.valuation_analysis.index_analyzer import IndexAnalyzer
|
|||
# 导入股票日线数据采集器
|
||||
from src.scripts.stock_daily_data_collector import collect_stock_daily_data, collect_stock_daily_data_optimized
|
||||
from src.scripts.stock_daily_data_collector_v2 import collect_stock_daily_data_v2
|
||||
from src.scripts.stock_daily_data_collector_v3 import collect_stock_daily_data_v3
|
||||
|
||||
from valuation_analysis.financial_analysis import FinancialAnalyzer
|
||||
from src.valuation_analysis.stock_price_collector import StockPriceCollector
|
||||
|
|
@ -53,6 +54,23 @@ from src.quantitative_analysis.batch_stock_price_collector import fetch_and_stor
|
|||
from src.quantitative_analysis.hk_stock_price_collector import fetch_and_store_hk_stock_data
|
||||
from src.quantitative_analysis.momentum_analysis import MomentumAnalyzer
|
||||
|
||||
# 导入Tushare实时行情采集器
|
||||
from src.tushare_scripts.realtime_quote_collector import collect_realtime_quote
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
# 导入Tushare港股日线数据采集器
|
||||
from src.tushare_scripts.hk_daily_data_collector import collect_hk_daily_data
|
||||
|
||||
# 导入Tushare美股日线数据采集器
|
||||
from src.tushare_scripts.us_daily_data_collector import collect_us_daily_data
|
||||
|
||||
# 导入Tushare其他数据采集器
|
||||
from src.tushare_scripts.auction_data_collector import collect_auction_data
|
||||
from src.tushare_scripts.chip_data_collector import collect_chip_data
|
||||
from src.tushare_scripts.chip_distribution_collector import collect_chip_distribution
|
||||
from src.tushare_scripts.stock_factor_collector import collect_stock_factor
|
||||
from src.tushare_scripts.stock_factor_pro_collector import collect_stock_factor_pro
|
||||
|
||||
# 设置日志
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
|
|
@ -206,59 +224,279 @@ def update_stock_realtime_price():
|
|||
|
||||
@app.route('/scheduler/stockDaily/collection', methods=['GET'])
|
||||
def run_stock_daily_collection1():
|
||||
"""执行股票日线数据采集任务 下午3点四十开始"""
|
||||
"""执行股票日线数据采集任务(使用Tushare V3版本) 下午3点四十开始"""
|
||||
try:
|
||||
logger.info("开始执行股票日线数据采集")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
# collect_stock_daily_data(db_url, today)
|
||||
collect_stock_daily_data_v2(db_url)
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票日线数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "success"
|
||||
}), 200
|
||||
|
||||
@app.route('/scheduler/stockDailyHK/collection', methods=['GET'])
|
||||
def run_stock_daily_collection2():
|
||||
"""执行股票日线数据采集任务 下午4点开始"""
|
||||
try:
|
||||
logger.info("开始执行股票日线数据采集")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
collect_stock_daily_data_optimized(db_url, today)
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票日线数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "success"
|
||||
}), 200
|
||||
|
||||
|
||||
@app.route('/scheduler/usStockDaily/collection', methods=['GET'])
|
||||
def run_us_stock_daily_collection():
|
||||
"""执行美股日线数据采集任务"""
|
||||
try:
|
||||
logger.info("开始执行美股日线数据采集")
|
||||
logger.info("开始执行股票日线数据采集(V3-Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 导入美股采集函数
|
||||
# V1版本(已废弃,使用雪球数据源)
|
||||
# collect_stock_daily_data(db_url, today)
|
||||
|
||||
# V2版本(已废弃,使用雪球+东方财富数据源)
|
||||
# collect_stock_daily_data_v2(db_url)
|
||||
|
||||
# V3版本(推荐使用,基于Tushare官方API,稳定可靠)
|
||||
|
||||
collect_stock_daily_data_v3(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='daily', # 每日增量采集
|
||||
date=today,
|
||||
table_name='gp_day_data',
|
||||
basic_table_name='gp_day_basic'
|
||||
)
|
||||
|
||||
logger.info("股票日线数据采集完成(V3-Tushare)")
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票日线数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "股票日线数据采集完成(V3-Tushare)"
|
||||
}), 200
|
||||
|
||||
@app.route('/scheduler/stockDailyHK/collection', methods=['GET'])
|
||||
def run_stock_daily_collection2():
|
||||
"""执行港股日线数据采集任务(使用Tushare数据源)下午5点开始"""
|
||||
try:
|
||||
logger.info("开始执行港股日线数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 旧版本(已废弃,使用其他数据源)
|
||||
collect_stock_daily_data_optimized(db_url, today)
|
||||
|
||||
# 新版本(推荐使用,基于Tushare官方API,稳定可靠)
|
||||
# collect_hk_daily_data(
|
||||
# db_url=db_url,
|
||||
# tushare_token=TUSHARE_TOKEN,
|
||||
# mode='daily', # 每日增量采集
|
||||
# date=today
|
||||
# )
|
||||
|
||||
logger.info("港股日线数据采集完成")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "港股日线数据采集完成"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动港股日线数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/usStockDaily/collection', methods=['GET'])
|
||||
def run_us_stock_daily_collection():
|
||||
"""执行美股日线数据采集任务(使用Tushare数据源)每天早上6点后执行"""
|
||||
try:
|
||||
logger.info("开始执行美股日线数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 旧版本(已废弃,使用其他数据源)
|
||||
from src.quantitative_analysis.us_stock_daily_data_collector_v2 import collect_us_stock_daily_data_v2
|
||||
collect_us_stock_daily_data_v2(db_url)
|
||||
|
||||
# 新版本(推荐使用,基于Tushare官方API,稳定可靠)
|
||||
# collect_us_daily_data(
|
||||
# db_url=db_url,
|
||||
# tushare_token=TUSHARE_TOKEN,
|
||||
# mode='daily', # 每日增量采集
|
||||
# date=today
|
||||
# )
|
||||
|
||||
logger.info("美股日线数据采集完成")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "美股日线数据采集完成"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动美股日线数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "success"
|
||||
}), 200
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/auctionData/collection', methods=['GET'])
|
||||
def run_auction_data_collection():
|
||||
"""执行股票集合竞价数据采集任务(使用Tushare数据源)每天18后执行"""
|
||||
try:
|
||||
logger.info("开始执行股票集合竞价数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 采集开盘和收盘集合竞价数据
|
||||
collect_auction_data(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='daily', # 每日增量采集
|
||||
date=today
|
||||
)
|
||||
logger.info("股票集合竞价数据采集完成(Tushare)")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "股票集合竞价数据采集完成(Tushare数据源)"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票集合竞价数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/chipData/collection', methods=['GET'])
|
||||
def run_chip_data_collection():
|
||||
"""执行每日筹码及胜率数据采集任务(使用Tushare数据源)每天18后执行"""
|
||||
try:
|
||||
logger.info("开始执行每日筹码及胜率数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 采集每日筹码及胜率数据
|
||||
collect_chip_data(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='daily', # 每日增量采集
|
||||
date=today
|
||||
)
|
||||
|
||||
logger.info("每日筹码及胜率数据采集完成(Tushare)")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "每日筹码及胜率数据采集完成(Tushare数据源)"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动每日筹码及胜率数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/chipDistribution/collection', methods=['GET'])
|
||||
def run_chip_distribution_collection():
|
||||
"""执行每日筹码分布数据采集任务(使用Tushare数据源)每天17:30后执行"""
|
||||
try:
|
||||
logger.info("开始执行每日筹码分布数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://fac_pattern:Chlry$%.8pattern@192.168.16.150:3306/factordb_mysql'
|
||||
|
||||
# 采集每日筹码分布数据(按年分表)
|
||||
collect_chip_distribution(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='full'
|
||||
)
|
||||
# collect_chip_distribution(
|
||||
# db_url=db_url,
|
||||
# tushare_token=TUSHARE_TOKEN,
|
||||
# mode='daily', # 每日增量采集
|
||||
# date=today,
|
||||
# batch_size=100 # 每100只股票批量入库一次
|
||||
# )
|
||||
|
||||
logger.info("每日筹码分布数据采集完成(Tushare)")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "每日筹码分布数据采集完成(Tushare数据源)"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动每日筹码分布数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/stockFactor/collection', methods=['GET'])
|
||||
def run_stock_factor_collection():
|
||||
"""执行股票技术因子数据采集任务(使用Tushare数据源)每天18:00后执行"""
|
||||
try:
|
||||
logger.info("开始执行股票技术因子数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# 采集股票技术因子数据
|
||||
collect_stock_factor(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='daily', # 每日增量采集
|
||||
date=today
|
||||
)
|
||||
|
||||
logger.info("股票技术因子数据采集完成(Tushare)")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "股票技术因子数据采集完成(Tushare数据源)"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票技术因子数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/stockFactorPro/collection', methods=['GET'])
|
||||
def run_stock_factor_pro_collection():
|
||||
"""执行股票技术因子专业版数据采集任务(使用Tushare数据源)每天18:00后执行"""
|
||||
try:
|
||||
logger.info("开始执行股票技术因子专业版数据采集(Tushare)")
|
||||
# 获取当天日期
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 定义数据库连接地址
|
||||
db_url = 'mysql+pymysql://fac_pattern:Chlry$%.8pattern@192.168.16.150:3306/factordb_mysql'
|
||||
|
||||
# 采集股票技术因子专业版数据
|
||||
collect_stock_factor_pro(
|
||||
db_url=db_url,
|
||||
tushare_token=TUSHARE_TOKEN,
|
||||
mode='daily', # 每日增量采集
|
||||
date=today
|
||||
)
|
||||
|
||||
logger.info("股票技术因子专业版数据采集完成(Tushare)")
|
||||
return jsonify({
|
||||
"status": "success",
|
||||
"message": "股票技术因子专业版数据采集完成(Tushare数据源)"
|
||||
}), 200
|
||||
except Exception as e:
|
||||
logger.error(f"启动股票技术因子专业版数据采集任务失败: {str(e)}")
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/scheduler/rzrq/collection', methods=['GET'])
|
||||
|
|
@ -1421,11 +1659,21 @@ def comprehensive_analysis():
|
|||
# 获取企业市值信息
|
||||
market_value_results = {}
|
||||
try:
|
||||
from src.valuation_analysis.stock_price_collector import StockPriceCollector
|
||||
price_collector = StockPriceCollector()
|
||||
# 旧版本(已废弃,使用东方财富接口)
|
||||
# from src.valuation_analysis.stock_price_collector import StockPriceCollector
|
||||
# price_collector = StockPriceCollector()
|
||||
# for stock_code in input_stock_codes:
|
||||
# price_data = price_collector.get_stock_price_data(stock_code)
|
||||
# if price_data and 'total_market_value' in price_data:
|
||||
# market_value_results[stock_code] = price_data['total_market_value']
|
||||
# else:
|
||||
# market_value_results[stock_code] = None
|
||||
|
||||
# 新版本(推荐使用,从gp_day_data和gp_day_basic表获取)
|
||||
from src.scripts.stock_daily_data_collector_v3 import get_stock_price_data_from_db
|
||||
|
||||
for stock_code in input_stock_codes:
|
||||
price_data = price_collector.get_stock_price_data(stock_code)
|
||||
price_data = get_stock_price_data_from_db(stock_code)
|
||||
if price_data and 'total_market_value' in price_data:
|
||||
market_value_results[stock_code] = price_data['total_market_value']
|
||||
else:
|
||||
|
|
@ -2892,7 +3140,7 @@ def test_mongo_structure():
|
|||
|
||||
@app.route('/api/stock/real_time_price', methods=['GET'])
|
||||
def get_real_time_price():
|
||||
"""获取股票实时价格接口
|
||||
"""获取股票实时价格接口(从数据库获取最新日线数据)
|
||||
|
||||
参数:
|
||||
- stock_code: 股票代码(必填)
|
||||
|
|
@ -2926,20 +3174,22 @@ def get_real_time_price():
|
|||
"status": "error",
|
||||
"message": "缺少必要参数: stock_code"
|
||||
}), 400
|
||||
|
||||
# 导入股票价格采集器
|
||||
from src.valuation_analysis.stock_price_collector import StockPriceCollector
|
||||
|
||||
# 创建采集器实例
|
||||
collector = StockPriceCollector()
|
||||
# 旧版本(已废弃,使用东方财富接口)
|
||||
# from src.valuation_analysis.stock_price_collector import StockPriceCollector
|
||||
# collector = StockPriceCollector()
|
||||
# price_data = collector.get_stock_price_data(stock_code)
|
||||
|
||||
# 获取实时价格数据
|
||||
price_data = collector.get_stock_price_data(stock_code)
|
||||
# 新版本(推荐使用,从gp_day_data和gp_day_basic表获取)
|
||||
from src.scripts.stock_daily_data_collector_v3 import get_stock_price_data_from_db
|
||||
|
||||
# 获取价格数据
|
||||
price_data = get_stock_price_data_from_db(stock_code)
|
||||
|
||||
if not price_data:
|
||||
return jsonify({
|
||||
"status": "error",
|
||||
"message": f"获取股票 {stock_code} 的实时价格失败"
|
||||
"message": f"获取股票 {stock_code} 的价格数据失败,可能该股票数据尚未采集"
|
||||
}), 404
|
||||
|
||||
# 构建响应数据
|
||||
|
|
@ -2955,7 +3205,12 @@ def get_real_time_price():
|
|||
"low": price_data.get('low'),
|
||||
"open": price_data.get('open'),
|
||||
"pre_close": price_data.get('pre_close'),
|
||||
"update_time": price_data.get('update_time')
|
||||
"update_time": price_data.get('update_time'),
|
||||
# 额外返回估值指标
|
||||
"pe": price_data.get('pe'),
|
||||
"pb": price_data.get('pb'),
|
||||
"ps": price_data.get('ps'),
|
||||
"total_market_value": price_data.get('total_market_value')
|
||||
}
|
||||
|
||||
return jsonify({
|
||||
|
|
@ -3191,12 +3446,18 @@ def get_momentum_by_plate():
|
|||
|
||||
@app.route('/scheduler/batch_stock_price/collection', methods=['GET'])
|
||||
def run_batch_stock_price_collection():
|
||||
"""批量采集A股行情并保存到数据库"""
|
||||
"""批量采集A股实时行情并保存到Redis(使用Tushare数据源)"""
|
||||
try:
|
||||
fetch_and_store_stock_data(use_proxy=True)
|
||||
return jsonify({"status": "success", "message": "批量采集A股行情并保存到数据库成功"})
|
||||
# 旧版雪球数据源(已废弃,不稳定)
|
||||
# fetch_and_store_stock_data(use_proxy=True)
|
||||
|
||||
# 新版Tushare数据源(推荐使用,稳定可靠)
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
collect_realtime_quote(db_url, TUSHARE_TOKEN, batch_size=49)
|
||||
|
||||
return jsonify({"status": "success", "message": "批量采集A股实时行情并保存到Redis成功(Tushare数据源)"})
|
||||
except Exception as e:
|
||||
logger.error(f"批量采集A股行情失败: {str(e)}")
|
||||
logger.error(f"批量采集A股实时行情失败: {str(e)}")
|
||||
return jsonify({"status": "error", "message": str(e)})
|
||||
|
||||
@app.route('/scheduler/batch_hk_stock_price/collection', methods=['GET'])
|
||||
|
|
|
|||
|
|
@ -0,0 +1,741 @@
|
|||
stock_code,admin_expense_ratio,rd_amortize_ratio,asset_liability_ratio,avg_distance_factor,gross_profit_margin,growth_score,supplier_concentration,customer_concentration,admin_expense_ratio_score,rd_amortize_ratio_score,asset_liability_ratio_score,avg_distance_factor_score,gross_profit_margin_score,growth_score_score,supplier_concentration_score,customer_concentration_score,total_score,rank
|
||||
SZ300274,1.7484422834411448,0.01157001319074792,64.15608903766453,4.8619979985783734,35.13398041146573,0.6348144268093936,21.96,19.79,94.05405405405405,96.01648351648352,80.67567567567568,59.915014164305944,77.55102040816327,79.05405405405406,72.6027397260274,80.52126200274348,17.4716123237133,1
|
||||
SH603197,5.936062252483996,0.03399539236935287,66.2459995549706,4.534646122320443,23.246376485328728,0.5674516673048031,17.67,33.55,57.027027027027025,74.31318681318682,83.24324324324324,83.0028328611898,51.42857142857142,70.54054054054055,82.46575342465754,58.161865569272976,14.537896240729346,2
|
||||
SZ000333,2.766468590246237,0.0,61.93568960086592,5.314178503495426,25.447136293126256,0.9915234881533542,7.780000000000001,13.63,85.27027027027027,99.86263736263736,75.67567567567568,40.226628895184135,57.95918367346938,99.86486486486487,99.04109589041096,91.08367626886145,14.087830549689976,3
|
||||
SH688301,4.83612733350934,0.007076733055461776,47.636555562559465,4.553581510767134,48.921547744544824,0.5240958755703722,33.36,18.97,66.21621621621621,98.21428571428571,50.810810810810814,81.30311614730878,91.02040816326532,57.97297297297297,48.35616438356164,82.1673525377229,13.09310418998939,4
|
||||
BJ839493,4.704179971717204,0.04425246307000614,78.09539059741762,,25.325811573917285,0.7448009026839127,36.49,26.479999999999997,67.56756756756756,65.93406593406593,94.45945945945947,0.0,57.278911564625844,87.70270270270271,41.71232876712329,69.54732510288066,12.854437554053376,5
|
||||
SZ300373,4.976794113216211,0.02961351555974408,35.77344339942803,4.384034187499096,34.60300748497635,0.737598998875887,28.249999999999996,13.47,65.27027027027027,78.98351648351648,30.945945945945947,91.92634560906515,76.46258503401361,87.02702702702703,58.49315068493151,91.49519890260632,12.830934808223851,6
|
||||
SH688596,10.868858337610595,0.026253944806988422,63.9396261726327,4.3121384790010495,26.404809822523102,0.6203581156849459,14.529999999999998,26.36,27.567567567567565,82.14285714285714,80.27027027027027,95.3257790368272,60.136054421768705,77.97297297297298,90.41095890410959,69.82167352537722,12.765916231231584,7
|
||||
SH601058,3.046872800357938,0.04451795867320054,49.56338406545672,4.86794247545168,24.736386921231905,0.5011045231049976,28.4,18.78,82.56756756756756,65.65934065934066,54.864864864864856,59.63172804532577,54.96598639455782,43.91891891891892,58.21917808219178,83.1275720164609,12.745725971749996,8
|
||||
SH688676,6.1842998778617915,0.04029130364078291,54.51492290276499,5.456465751265419,24.93340698034374,0.5935417750648436,20.27,19.2,54.864864864864856,69.5054945054945,62.972972972972975,35.977337110481585,55.51020408163265,74.05405405405405,76.3013698630137,81.89300411522633,12.583222428739518,9
|
||||
SZ301031,6.358712250155177,0.02205888900586895,49.421959886240266,4.362555266974865,38.55665698568375,0.8791738157664548,30.17,39.51,52.43243243243243,86.95054945054946,54.59459459459459,92.91784702549575,82.85714285714286,95.13513513513514,53.56164383561644,47.87379972565158,12.5602650885962,10
|
||||
SH603737,7.516754236000551,0.07920394293545369,77.1545080060118,4.75665122266235,31.04616200082883,0.5626401661965138,22.78,2.71,43.10810810810811,44.917582417582416,94.1891891891892,68.41359773371106,71.0204081632653,69.32432432432432,70.68493150684931,99.45130315500685,12.51030958481985,11
|
||||
SH600160,4.0855662145251745,0.03568506783331279,32.84543501305628,4.813825585389573,28.41711232400792,0.8119990784790011,22.29,11.51,73.37837837837837,73.62637362637363,25.675675675675674,64.16430594900851,63.94557823129252,91.8918918918919,71.91780821917808,93.27846364883402,12.268457948223507,12
|
||||
SH603650,5.516038939368053,0.12314918823394992,59.51853534812558,4.471651430988794,25.210824968702966,0.5670075644806364,27.12,27.399999999999995,60.810810810810814,32.417582417582416,71.21621621621622,87.25212464589235,56.59863945578232,70.4054054054054,60.82191780821917,68.17558299039781,12.259133433831447,13
|
||||
SH600989,2.5882608240002307,0.14465262014363056,50.63313362148342,5.052252623348623,35.362918733755905,0.8190091729587651,16.27,18.42,86.89189189189189,29.258241758241756,56.351351351351354,52.266288951841354,78.0952380952381,92.29729729729729,86.57534246575342,83.81344307270233,12.230888230598948,14
|
||||
SZ300222,6.278701751437904,0.024314824399498374,62.99896056033201,4.813547150486469,22.008285450530494,0.5756343558135232,8.57,43.52,53.51351351351351,84.34065934065934,78.37837837837837,64.30594900849859,47.21088435374149,71.89189189189189,98.4931506849315,41.49519890260631,12.120189675414087,15
|
||||
SZ002976,9.497699143423992,0.04890622743900786,61.86976113462441,4.6421786668738765,23.762742021544394,0.8945779164506645,19.03,33.14,33.24324324324325,62.08791208791209,75.54054054054053,75.77903682719547,52.925170068027214,95.8108108108108,79.04109589041096,59.12208504801097,12.073689625566109,16
|
||||
SZ002430,6.580043483046303,0.07264563522541542,56.24522074139867,4.475803274723997,21.45468919368759,0.510450028926191,23.99,22.22,50.13513513513514,47.93956043956044,65.81081081081082,86.96883852691218,45.30612244897959,51.75675675675676,67.3972602739726,75.85733882030179,12.045705741946778,17
|
||||
SZ300797,14.504083611721136,0.008703566178122407,41.078554004644836,4.663787069989844,44.89207361929138,0.9061921987768404,14.26,14.11,18.783783783783782,97.8021978021978,39.32432432432432,74.5042492917847,88.70748299319729,96.48648648648648,91.36986301369862,89.7119341563786,12.027523362919254,18
|
||||
SZ300870,4.2763152431383435,0.013302128039097617,54.68532706201176,4.890533525610682,19.104950578395012,0.5259071998888573,11.58,37.62,71.75675675675676,95.05494505494505,63.37837837837837,58.35694050991501,40.40816326530612,58.78378378378378,95.47945205479452,51.440329218106996,11.975132546763492,19
|
||||
SZ002371,5.7709278929988095,0.17193698894200482,49.995774389823936,4.508232358285154,43.015650241431246,0.7559423794590617,16.32,27.88,58.37837837837838,25.137362637362635,55.67567567567567,84.56090651558074,86.66666666666667,88.24324324324324,86.43835616438355,66.39231824417008,11.936814915991231,20
|
||||
SZ300221,6.196413783303242,0.01887282989903833,38.91851089489905,4.235345889077772,18.81328358814508,0.645778503579922,18.19,19.31,54.59459459459459,89.56043956043956,36.08108108108108,97.87535410764873,39.183673469387756,80.13513513513514,80.89041095890411,81.4814814814815,11.936572905307878,21
|
||||
SZ300014,3.3178972448148434,0.0455104722395322,61.979876561694965,5.077835152157814,17.15927484827219,0.5415110848484719,32.84,21.44,80.67567567567568,65.10989010989012,75.94594594594595,51.13314447592068,34.5578231292517,63.24324324324324,50.0,77.09190672153635,11.928871314650426,22
|
||||
SH600035,2.099634449645206,76.41306181472576,49.76028186790438,5.146731940456457,36.5543124738462,0.48626798432304574,21.22,4.37,91.21621621621621,0.0,55.270270270270274,47.875354107648725,80.0,36.08108108108108,74.24657534246575,98.90260631001372,11.83948424042431,23
|
||||
SH600869,2.0131139969388,0.040863525107100965,78.65001838304832,4.31468267191499,10.691294861516944,0.7003515027461129,39.89,10.71,92.16216216216216,69.0934065934066,94.86486486486486,95.04249291784703,20.408163265306122,84.32432432432432,35.75342465753425,93.96433470507544,11.80834738232571,24
|
||||
SZ002448,5.83894448375896,0.05473188376688351,32.206658502578335,4.557508003783679,27.788532950781097,0.5778297327735388,20.48,24.41,57.83783783783784,58.65384615384615,24.45945945945946,81.16147308781869,62.857142857142854,72.16216216216216,75.61643835616438,71.94787379972564,11.704172598099204,25
|
||||
SH600812,5.207219186856145,0.4664016873911199,69.30134573861767,4.340687779005352,29.442151307277175,0.5837360644829501,18.96,7.8,63.378378378378386,9.890109890109889,87.43243243243242,94.19263456090651,66.25850340136054,72.83783783783784,79.17808219178082,96.70781893004116,11.657975616558083,26
|
||||
SZ301606,3.6176506896602185,0.0035202267978264143,23.880634748630083,5.095342225155959,38.006545904276834,0.7943754549695013,22.91,17.81,77.56756756756756,99.31318681318682,12.972972972972974,50.56657223796034,82.17687074829932,91.08108108108108,70.27397260273973,84.49931412894375,11.632254623862483,27
|
||||
SZ002886,4.873775926118635,0.07603244643789447,51.09170976181058,4.507413974645956,15.756788556759677,0.5344856362453748,24.08,22.67,65.81081081081082,46.42857142857143,56.89189189189189,84.70254957507082,31.564625850340132,61.48648648648649,67.26027397260275,74.07407407407408,11.597870150319533,28
|
||||
SZ300059,73.21612883494147,0.02739525123023653,74.87665646006518,4.34060673023487,83.99195100074552,0.7940687468125501,36.61,6.99,0.8108108108108136,80.9065934065934,92.02702702702703,94.3342776203966,99.18367346938776,90.94594594594595,41.50684931506849,97.25651577503429,11.59600895999806,29
|
||||
SZ002380,4.8590651704362875,0.015351712302389388,39.461269103445105,6.249831295458968,39.18241397610072,0.6091189731459814,7.86,11.22,66.08108108108108,92.58241758241759,36.75675675675676,20.679886685552407,83.40136054421768,76.35135135135135,98.76712328767124,93.68998628257887,11.549883779800243,30
|
||||
SZ300606,6.885758489284542,0.10273548404934392,42.24149231205365,4.974084256502919,25.41410283775141,0.5357658555295504,31.819999999999997,23.78,47.56756756756757,36.126373626373635,41.08108108108108,54.957507082152965,57.82312925170068,62.16216216216216,50.68493150684932,72.15363511659808,11.47704881981588,31
|
||||
BJ836720,4.498093069565176,0.031311725596214264,43.747357325488636,,20.482658279739553,0.8224472194807158,33.23,30.48,69.72972972972973,76.92307692307692,43.78378378378379,0.0,43.53741496598639,92.56756756756756,48.9041095890411,62.55144032921811,11.469667157740835,32
|
||||
SH603602,6.930893491922954,0.008794844679130893,56.97082785674229,4.622800948853725,19.137380899238316,0.9356684914242561,22.79,45.32,46.89189189189189,97.66483516483517,67.56756756756756,77.33711048158641,40.816326530612244,97.70270270270271,70.54794520547945,39.2318244170096,11.461373972985843,33
|
||||
SZ000988,1.991477224999376,0.07227281461628482,47.52375374870517,5.170870805361317,20.486921739478646,0.851218233317646,13.449999999999998,29.26,92.29729729729729,48.35164835164834,50.4054054054054,46.17563739376771,43.673469387755105,94.1891891891892,92.87671232876711,64.6090534979424,11.436516970801236,34
|
||||
SZ300553,10.058576969909206,0.014531789990774969,38.57271428625677,4.632642052160707,37.491591511012764,0.5967304557977804,26.229999999999997,21.81,29.594594594594593,93.95604395604396,35.270270270270274,76.77053824362606,81.49659863945578,75.13513513513513,62.465753424657535,76.26886145404663,11.421592462252423,35
|
||||
SZ300812,5.821335488489898,0.020924364778235262,45.6251199769386,4.405278654875468,34.63668967068415,0.650895157649313,20.25,58.39,57.97297297297297,87.77472527472527,46.62162162162162,90.79320113314448,76.59863945578232,80.8108108108108,76.43835616438356,20.98765432098766,11.420106136172707,36
|
||||
SZ300358,9.425792471822907,0.1476346462211054,67.06232920208105,4.620593642923575,29.760419391586268,0.5434317811117938,9.33,7.91,33.648648648648646,28.15934065934066,85.0,77.47875354107649,67.3469387755102,63.91891891891892,98.08219178082192,96.57064471879286,11.381711818221335,37
|
||||
SZ002061,1.4745023033600424,0.00853169817384127,76.27216621719978,5.380944785582868,7.402004931084341,0.8022504099016277,15.109999999999998,34.19,95.4054054054054,97.93956043956044,93.24324324324324,38.10198300283286,12.380952380952381,91.62162162162161,88.63013698630137,56.92729766803841,11.354832756079965,38
|
||||
SH688669,5.049867433724278,0.07689386422727032,69.77882552847495,4.677606804278207,12.499708245545756,0.6031492673060853,28.82,15.52,64.72972972972973,46.01648351648352,87.83783783783784,73.08781869688386,23.809523809523807,76.08108108108108,57.53424657534247,87.17421124828533,11.238128301258813,39
|
||||
SZ002670,65655.27437051499,2.0070949583814968,76.37462434471605,4.570899812654717,,0.8479922652714486,25.319999999999997,4.53,0.0,2.6098901098901117,93.51351351351352,80.59490084985835,0.0,93.91891891891892,64.17808219178083,98.76543209876543,11.210226356702215,40
|
||||
SH603097,3.5806337660316787,0.043721299417715735,56.171104558801844,4.907665583678436,20.33221644946762,0.44964916013555106,25.47,33.83,78.10810810810811,66.89560439560441,65.67567567567568,57.36543909348442,43.26530612244898,28.37837837837838,63.835616438356155,57.475994513031544,11.190871371476492,41
|
||||
SH688400,8.663941853697617,0.02812641267364051,33.57322949527636,5.023163316411955,35.78203483003838,0.9139283154180337,22.2,17.6,37.29729729729729,80.21978021978022,27.16216216216216,53.399433427762034,78.50340136054422,96.89189189189189,72.05479452054794,84.63648834019205,11.180525363389675,42
|
||||
SZ002708,3.99296397062611,0.08001785737375974,52.455731579960464,4.447968245344583,16.85226631262981,0.5147931071562108,17.17,34.77,74.32432432432432,44.230769230769226,58.513513513513516,88.95184135977338,33.74149659863945,54.45945945945946,83.42465753424658,56.24142661179698,11.172719035376124,43
|
||||
SZ300054,8.662951091815867,0.07343615788534835,34.47106951857368,4.571921873483674,48.81983753171355,0.6901377532832528,16.01,26.649999999999995,37.43243243243243,47.66483516483516,29.324324324324323,80.45325779036827,90.88435374149661,83.51351351351352,87.12328767123287,69.27297668038408,11.120190252528694,44
|
||||
SZ002407,5.968187085681106,0.08763213597683883,54.28447696857525,4.59816463275748,13.469685390050456,0.5694921116461656,22.31,28.71,56.75675675675676,41.895604395604394,62.16216216216216,78.75354107648725,27.074829931972786,71.08108108108108,71.78082191780821,65.15775034293553,11.111089122580678,45
|
||||
SZ002324,2.613933849096099,0.037518101961657245,58.76486990098903,5.240409920499447,14.613609846523973,0.5662012768067566,33.81,22.43,86.62162162162163,71.7032967032967,70.27027027027027,42.917847025495746,29.795918367346943,70.0,46.986301369863014,75.17146776406037,11.11106329406366,46
|
||||
SZ301510,7.949648931188932,0.00964188279484959,12.344311988326986,4.426010864741268,48.56383048701206,0.7250075276689772,23.98,15.15,41.21621621621622,96.84065934065934,2.837837837837838,89.80169971671388,90.61224489795919,86.21621621621621,67.53424657534246,88.20301783264746,11.104210096933093,47
|
||||
SZ300041,4.728350553610429,0.0669132825880029,54.66087605618544,4.615958218578202,21.811813481538238,0.5009673022698886,39.58,18.91,67.43243243243244,51.373626373626365,63.24324324324324,77.76203966005666,46.802721088435376,43.648648648648646,36.438356164383556,82.57887517146776,11.09187596244976,48
|
||||
SH688568,14.378175000638072,0.13326183467186284,43.34671716133753,4.20119455686917,49.122025711423106,0.9553962992402592,14.91,12.01,19.05405405405406,30.76923076923077,42.972972972972975,98.58356940509914,91.29251700680273,99.32432432432432,88.9041095890411,92.72976680384087,11.05333082265093,49
|
||||
SZ001696,1.9756175875797932,0.12598217481185267,53.78225245555124,4.553010629961146,13.239861590983567,0.5883995922174597,14.39,24.8,92.43243243243244,31.868131868131865,60.54054054054055,81.44475920679886,25.98639455782313,73.37837837837839,90.75342465753424,71.33058984910836,11.049568989027588,50
|
||||
SZ002899,6.8255970966725465,0.06755863741107226,40.68177796695899,4.568116853615077,25.38450069199869,0.5048885471383584,19.07,39.35,47.83783783783784,51.098901098901095,38.648648648648646,80.73654390934844,57.68707482993197,48.10810810810811,78.9041095890411,48.35390946502057,10.981008928339005,51
|
||||
SH600105,6.4932811101254035,0.060476530864129116,59.38263303535077,5.000251851775107,14.646495484915867,0.9480136735697554,23.46,32.43,51.35135135135135,54.807692307692314,70.67567567567568,54.107648725212464,30.068027210884352,98.37837837837839,68.76712328767123,59.945130315500684,10.955131121178002,52
|
||||
SH688509,21.807993514099746,0.03257562234570953,58.37817984773908,4.354338586085547,28.98834371366697,0.525041503378356,16.48,23.47,7.567567567567568,75.54945054945054,69.72972972972973,93.48441926345609,64.89795918367346,58.37837837837838,85.54794520547946,72.56515775034293,10.950120015286698,53
|
||||
SZ002171,0.7585627404555083,0.029799481085711697,59.4845400170139,4.3990555780493805,3.4038689135111384,0.5392003969725677,33.04,13.56,99.1891891891892,78.57142857142857,70.94594594594594,91.21813031161473,4.353741496598639,62.83783783783784,49.31506849315068,91.22085048010973,10.9410584006319,54
|
||||
SZ002152,6.602331790647757,0.041055245322464094,42.28644823241838,5.112754804750525,30.890124160865383,0.4683884582325092,23.03,21.24,49.86486486486486,68.95604395604396,41.21621621621622,49.57507082152974,70.34013605442176,32.2972972972973,69.72602739726028,77.57201646090535,10.937753238422628,55
|
||||
SZ002632,6.74591977888991,0.096788878969663,33.71446881936067,4.260338772533206,29.26818730292969,0.5951365119995057,22.45,10.09,47.97297297297297,38.324175824175825,27.56756756756757,97.45042492917847,65.578231292517,74.45945945945947,71.36986301369863,94.65020576131687,10.821596841622915,56
|
||||
SZ300376,3.9361774902170623,0.041305025101532375,43.875865301876914,5.602891330942457,32.643961944506444,0.4807929806549468,22.5,19.97,74.72972972972973,68.68131868131869,44.32432432432433,32.01133144475921,73.06122448979592,35.13513513513514,71.23287671232876,80.24691358024691,10.785939804974758,57
|
||||
SZ302132,7.335461923275406,0.04150338245716249,81.53979153479462,4.123692955440542,11.053269443623225,0.4902350376282667,10.0,22.89,44.18918918918919,68.54395604395604,96.35135135135135,99.85835694050992,20.952380952380953,37.432432432432435,97.26027397260275,73.25102880658436,10.778285896711328,58
|
||||
SH688800,4.26640498170722,0.04695842373155007,51.12898321885546,6.238196150776694,23.741721970830028,0.8293738438398812,13.44,37.64,72.16216216216216,64.14835164835165,57.027027027027025,21.10481586402266,52.7891156462585,93.10810810810811,93.01369863013699,51.30315500685872,10.73338228327541,59
|
||||
BJ831396,8.516658194985245,0.023406283890791926,43.99990803323223,,19.73164381835025,0.513551897095942,19.55,27.55,38.108108108108105,85.43956043956044,44.5945945945946,0.0,42.17687074829932,53.51351351351351,77.53424657534246,67.3525377229081,10.696571875691943,60
|
||||
SZ002871,6.006079729401915,0.06335374517240731,32.83625338042011,5.377684148205741,37.501280167358395,0.5967175488287659,14.48,22.79,56.486486486486484,53.57142857142857,25.54054054054054,38.385269121813025,81.63265306122449,75.0,90.54794520547945,73.86831275720165,10.693882312707661,61
|
||||
SH600875,4.111925234904114,0.04461196902242907,70.14124968238032,8.440771915953428,16.624151456642647,0.6792669921090347,11.0,15.49,73.24324324324326,65.38461538461539,88.10810810810811,8.073654390934848,33.605442176870746,83.24324324324324,96.02739726027397,87.37997256515774,10.689625573073025,62
|
||||
SZ300567,11.233366621015438,0.05552559166225663,55.206623503975784,4.5491093166707195,41.74741011974735,0.5084569758956476,17.53,45.46,26.621621621621617,57.82967032967032,64.1891891891892,82.1529745042493,85.17006802721089,50.94594594594595,83.08219178082193,39.09465020576132,10.651116536164789,63
|
||||
SH605589,3.828272524468664,0.057979121042136296,33.84259068091763,5.41756167431397,24.133190452108952,0.9055451662021736,25.11,8.87,76.21621621621621,56.043956043956044,27.837837837837835,37.25212464589235,53.87755102040816,96.35135135135135,64.79452054794521,95.33607681755831,10.649879776675947,64
|
||||
SH688271,5.319747796962291,0.08797560588484399,29.68593726464296,4.723063744487916,49.94022298326784,0.5042954471390978,16.92,10.61,62.567567567567565,41.62087912087912,20.675675675675677,71.10481586402267,91.83673469387756,47.43243243243243,83.83561643835617,94.10150891632372,10.642869264553811,65
|
||||
SH601608,6.177262124254961,0.08595070846623923,51.59308715163008,5.259253613953434,18.96666263098711,0.5012859546721213,22.04,20.11,55.270270270270274,42.44505494505495,57.2972972972973,42.20963172804532,39.72789115646258,44.45945945945946,72.32876712328768,79.69821673525377,10.632808835569941,66
|
||||
SZ000798,4.04865280309544,0.014181282206782215,74.40800008304393,5.458657241470991,5.9715871410123915,0.5781500310204603,25.91,14.069999999999999,73.78378378378379,94.5054945054945,91.62162162162161,35.835694050991506,8.571428571428571,72.2972972972973,63.219178082191775,89.98628257887518,10.627326296857209,67
|
||||
SZ300623,8.142543234768027,0.05522414045794278,26.191395759836805,4.459307974302904,39.93363737040679,0.5665712433819697,25.1,15.39,40.13513513513514,58.1043956043956,15.675675675675677,87.81869688385268,83.94557823129252,70.27027027027027,64.93150684931507,87.79149519890261,10.626120623856531,68
|
||||
SH603082,2.1584780494421043,0.011986079229859364,60.26845832172572,4.673098791510914,18.045175642628642,0.5074118142925006,39.05,42.49,90.4054054054054,95.74175824175825,73.1081081081081,73.37110481586402,36.19047619047619,50.13513513513514,37.534246575342465,42.93552812071331,10.60742330779446,69
|
||||
SZ002747,9.00797450101681,0.15573854720775357,82.37503848026745,4.659170169903949,28.26809531348422,0.5050071270710208,17.82,25.629999999999995,35.67567567567568,27.060439560439566,97.02702702702702,74.78753541076487,63.53741496598639,48.37837837837838,81.78082191780823,70.50754458161865,10.597063608772052,70
|
||||
BJ837023,6.897601591017071,0.07162234116772427,48.973096416039596,,24.554473738345653,0.5548296231650782,22.94,53.32,47.432432432432435,48.626373626373635,53.10810810810811,0.0,54.69387755102041,67.16216216216216,70.0,27.297668038408784,10.592252043606528,71
|
||||
SZ002340,2.7942990525550084,0.1835111371489222,65.17525859842901,4.51967518055352,13.08013500806274,0.5432932101300233,16.4,33.2,85.0,23.901098901098905,81.62162162162161,83.85269121813032,25.442176870748302,63.78378378378379,86.16438356164385,58.984910836762694,10.557578278625236,72
|
||||
SH601966,3.0185665113430873,0.06042113051251018,54.30672506976904,4.78964235296375,14.916725281572393,0.46591993539211746,25.590000000000003,16.93,83.10810810810811,54.94505494505495,62.43243243243243,66.0056657223796,30.34013605442177,31.351351351351354,63.561643835616444,85.59670781893004,10.55573929281631,73
|
||||
SH688131,11.191806536316989,0.03972396177243359,47.959314100475716,6.505855253036703,48.5834894716017,0.7950096710668607,15.879999999999999,14.469999999999999,26.891891891891895,70.46703296703296,51.35135135135135,18.130311614730875,90.74829931972789,91.21621621621621,87.53424657534246,88.95747599451303,10.548795384324775,74
|
||||
SH603713,1.7546107094344472,0.4159902779564981,68.3317810491289,4.458041783124295,11.611770347889939,0.5543138615487282,21.86,14.88,93.91891891891892,11.538461538461542,86.21621621621621,87.96033994334277,22.448979591836736,67.02702702702703,72.73972602739727,88.47736625514403,10.514042446625377,75
|
||||
SH688003,11.041652788324601,0.10177674781777427,46.862268199105486,4.93649908915882,30.439322412036624,0.5935389641593274,18.34,27.639999999999997,27.432432432432428,36.675824175824175,49.45945945945946,56.23229461756374,69.65986394557822,73.91891891891892,80.27397260273973,67.07818930041152,10.50219324718809,76
|
||||
SZ300660,9.484933990805937,0.07904235857111203,38.257539786568906,4.684337190124231,27.182971927990142,0.7728804154615945,19.35,32.67,33.37837837837838,45.05494505494505,34.45945945945946,72.94617563739376,61.224489795918366,89.45945945945945,78.35616438356165,59.465020576131685,10.49694753624125,77
|
||||
SZ002409,5.2106873937536085,0.13209430085557133,41.779974979247946,4.360956302402533,28.499559581269462,0.5500476152580716,16.89,44.4,63.24324324324324,30.90659340659341,40.54054054054054,93.34277620396601,64.35374149659864,65.81081081081082,84.10958904109589,40.192043895747595,10.476353421998276,78
|
||||
SH603728,15.608841031640003,0.02384916091410915,31.800645621635432,4.592345656925919,36.86785961910283,0.5599140432438294,22.35,14.23,16.081081081081084,84.89010989010988,23.783783783783786,79.1784702549575,80.81632653061224,68.78378378378378,71.5068493150685,89.43758573388203,10.471859321428738,79
|
||||
SZ002465,6.637215139361557,0.023892316886467937,34.147148870477125,4.751642729204267,27.36649679410052,0.5307111290184785,10.73,46.08,49.05405405405405,84.61538461538461,28.37837837837838,68.69688385269122,61.904761904761905,60.67567567567568,96.30136986301369,37.44855967078189,10.47056261170847,80
|
||||
SZ002170,3.912306435235438,0.7121038811191278,47.15838563090007,4.6161835246621505,31.171961910340183,0.716119757928145,31.759999999999998,11.24,75.27027027027027,6.593406593406592,50.13513513513514,77.62039660056656,71.29251700680273,85.27027027027026,50.82191780821918,93.55281207133059,10.444704410098641,81
|
||||
SH688981,6.179962867502378,0.04423730549820621,32.8130529248307,4.711082797838415,23.09686134389214,0.8947938267111339,,,55.13513513513513,66.07142857142857,25.405405405405407,71.81303116147308,50.884353741496604,95.94594594594594,0.0,0.0,10.44400698807866,82
|
||||
SH601500,2.81112504481685,0.07715858337708673,61.232557282638545,4.46014550882852,13.526743530775603,0.48887107243383465,27.79,29.34,84.72972972972973,45.87912087912088,74.86486486486487,87.6770538243626,27.48299319727891,37.16216216216216,59.178082191780824,64.4718792866941,10.442956209219219,83
|
||||
SH688518,12.034162213778963,0.027741665057922346,56.11212712451464,4.8796299061094315,26.025588190780613,0.7069605627230431,16.03,51.15,24.459459459459467,80.63186813186813,65.4054054054054,58.78186968838527,59.455782312925166,84.5945945945946,86.98630136986301,30.452674897119337,10.442585616952373,84
|
||||
SH601789,2.8309422132835294,0.01937916302007237,81.93647664917651,4.7163553445536746,7.790070924782769,0.3454769327461526,23.21,13.100000000000001,84.5945945945946,89.01098901098901,96.75675675675676,71.38810198300283,13.46938775510204,15.54054054054054,69.17808219178082,91.76954732510289,10.43261563653383,85
|
||||
SZ002074,4.822818605187243,0.17000160371102296,72.80927276214213,4.844967079288913,18.280823862500704,0.592022528920743,24.24,37.54,66.35135135135135,25.274725274725274,89.72972972972974,61.331444759206796,36.87074829931973,73.78378378378379,66.64383561643837,51.577503429355275,10.431072649955317,86
|
||||
SZ000301,0.7965809107285676,0.13416449734718627,82.16911844835994,4.532805969576384,9.891809358776275,0.5162323744455464,30.09,20.13,99.05405405405405,30.35714285714286,96.89189189189189,83.14447592067988,18.775510204081634,55.270270270270274,53.83561643835617,79.56104252400549,10.383776158710585,87
|
||||
SZ002230,7.58570877646387,0.3627124325790691,54.63234931091729,4.910796543148243,40.181171673703375,0.5447138635155893,15.98,19.48,42.83783783783783,13.324175824175821,63.108108108108105,57.22379603399433,84.21768707482993,64.32432432432432,87.32876712328768,81.06995884773663,10.38155130836721,88
|
||||
SZ300803,28.701203590680485,0.09013540462777253,80.78471051398762,5.901620273829004,90.15999604348805,0.8969277059598321,18.62,2.25,4.729729729729726,40.7967032967033,95.8108108108108,25.495750708215294,99.72789115646259,96.08108108108108,79.72602739726027,99.58847736625515,10.36036724768978,89
|
||||
SH603220,5.409773563679381,0.024790635478364714,73.1273878355909,4.593552660730621,19.743370683352484,0.26950006680468525,25.91,29.23,61.75675675675676,83.65384615384616,90.0,79.03682719546742,42.31292517006803,10.945945945945947,63.219178082191775,64.74622770919068,10.34394915108989,90
|
||||
SH600808,1.0940276637028734,0.09621270658965468,65.33766919693782,4.791767404589877,2.703474629534823,0.5290582290809867,20.0,11.0,97.56756756756756,38.598901098901095,81.89189189189189,65.86402266288952,3.6734693877551026,60.27027027027027,76.84931506849315,93.82716049382715,10.32575436814091,91
|
||||
SZ000055,6.050169602754336,0.04305027969736205,52.44013598686853,4.853574111509218,21.682806046286636,0.3628798971331284,18.44,27.57,55.94594594594595,67.17032967032968,58.37837837837838,60.90651558073654,45.98639455782313,17.2972972972973,79.86301369863014,67.2153635116598,10.311705491544766,92
|
||||
SZ002455,1.576254500474237,0.10480971067817405,81.3249440889762,4.6420131517301275,9.46621729770806,0.5049190051059307,30.159999999999997,13.79,95.13513513513514,35.302197802197796,96.21621621621622,75.92067988668555,17.27891156462585,48.24324324324324,53.6986301369863,90.6721536351166,10.304351255273373,93
|
||||
SZ002590,4.757496153380132,0.07576441298793951,49.704027312363024,4.723537175876301,14.260146967763085,0.5105963291514146,11.71,41.11,66.89189189189189,46.565934065934066,55.13513513513514,70.96317280453258,28.97959183673469,52.16216216216216,95.06849315068493,45.40466392318244,10.290413846187484,94
|
||||
SZ300713,14.575496628021614,0.03170828448386007,44.83377589869188,4.967713852589974,27.395995453565885,0.5113645102713088,22.56,26.87,18.243243243243246,76.37362637362637,45.54054054054054,55.240793201133144,62.04081632653061,52.83783783783784,71.0958904109589,68.72427983539094,10.290326025223212,95
|
||||
SH603486,3.6089287226093307,0.05679021062150437,47.80700844927389,9.61717938518672,49.684072519689686,0.5202562284444484,14.57,22.23,77.7027027027027,57.280219780219774,51.08108108108108,4.532577903682721,91.56462585034014,56.21621621621622,89.86301369863014,75.7201646090535,10.265049126367117,96
|
||||
SH603324,5.216030328189965,0.047069487483456914,53.94100111860878,4.449814253189331,22.822362481070503,0.5249849011099372,24.92,63.83,63.108108108108105,63.873626373626365,61.21621621621621,88.6685552407932,49.65986394557823,58.24324324324325,65.20547945205479,14.814814814814813,10.263591480552343,97
|
||||
SZ301598,15.22340628327955,0.032885482084167195,46.38064665940465,4.45230511564069,46.04927048281835,0.5449779133722952,20.12,48.08,16.75675675675675,75.0,48.24324324324324,88.52691218130312,89.38775510204081,64.5945945945946,76.71232876712328,34.84224965706447,10.235972523086206,98
|
||||
SZ301303,5.859914279018822,0.0341336222625421,22.215385818632306,5.188145642753261,40.69924890330376,0.5865122883920232,16.68,35.51,57.567567567567565,74.17582417582418,10.945945945945947,45.3257790368272,84.76190476190476,73.1081081081081,84.79452054794521,55.00685871056241,10.223124465082329,99
|
||||
SZ002402,3.9876126643856558,0.10508276091780784,53.67437911288956,4.927378474012953,19.527233499103,0.6292135881485635,13.62,50.36999999999999,74.45945945945947,35.16483516483516,60.40540540540541,56.798866855524075,41.63265306122449,78.64864864864865,92.67123287671232,31.275720164609055,10.214827365200948,100
|
||||
SH688626,7.4880887797417,0.04772651497590055,34.05694220448604,4.55021211414064,65.30360186091633,0.3482077887510163,13.919999999999998,12.53,43.24324324324324,63.324175824175825,28.10810810810811,81.86968838526913,96.73469387755102,15.945945945945947,91.91780821917807,92.18106995884774,10.190983026333644,101
|
||||
SZ300666,6.239845173311797,0.08207745220994253,50.246421936654784,4.428462127592068,32.38579413669049,0.873892880433084,53.75,37.31,53.91891891891891,43.269230769230774,55.945945945945944,89.66005665722379,72.51700680272108,94.86486486486486,19.31506849315069,51.85185185185186,10.114186021678755,102
|
||||
SZ000821,4.591160876498341,0.046484541018274,69.11516026266641,5.527047806117974,19.147299034957797,0.43315253101299556,20.72,27.48,68.64864864864865,64.42307692307692,87.16216216216216,34.419263456090654,40.95238095238095,25.270270270270267,75.20547945205479,67.90123456790124,10.097992436529909,103
|
||||
SH603600,5.139942256495503,0.09139763260151244,45.60489355155906,4.799882894168791,20.647435102572288,0.7155841227392968,14.580000000000002,52.459999999999994,63.64864864864865,40.38461538461539,46.35135135135135,65.43909348441926,44.353741496598644,85.13513513513513,89.72602739726028,28.66941015089163,10.08964523308546,104
|
||||
SH600525,13.329447762134164,0.04889272453993872,76.86060769367229,5.296398439919763,33.936449097571895,0.4298731813095374,9.92,13.76,20.81081081081081,62.22527472527473,93.91891891891892,41.07648725212465,75.37414965986395,24.864864864864867,97.3972602739726,90.87791495198903,10.089117225451469,105
|
||||
SH603150,10.031585508907828,0.057639178034267324,63.038189215591004,4.492810756685828,22.255657711082506,0.7152767036872786,11.93,61.72,30.000000000000004,56.456043956043956,78.51351351351352,85.26912181303116,47.89115646258503,85.0,94.79452054794521,17.832647462277095,10.083604089445071,106
|
||||
SZ300616,9.113499131750478,0.3344823079580242,56.28008521529026,4.637082965727814,35.232950384666076,0.5062368842989103,21.63,5.17,35.40540540540541,13.736263736263732,65.94594594594595,76.34560906515581,77.82312925170068,49.18918918918919,73.42465753424658,98.35390946502058,10.08186543849184,107
|
||||
SH600577,0.9753248821069587,0.06480273646533989,53.88944111149825,4.283919909435442,5.5740066186587915,0.6865098036883356,49.67,11.64,98.1081081081081,52.60989010989011,60.945945945945944,96.3172804532578,7.482993197278912,83.37837837837839,24.246575342465746,93.14128943758573,10.06419402536687,108
|
||||
SH688187,4.622230368904529,0.0954133067244539,32.965312154947675,4.622824337574489,33.499832203660326,0.7587658445571199,20.63,53.15,68.37837837837839,39.42307692307693,25.945945945945947,77.19546742209631,74.421768707483,88.37837837837837,75.34246575342466,27.9835390946502,10.050142918214611,109
|
||||
SH603296,1.853520520213949,0.016611361986581266,70.84520280151496,4.813026893623577,8.41585874476516,0.8865110192818025,37.43,56.72999999999999,93.24324324324324,90.7967032967033,88.37837837837837,64.44759206798867,14.557823129251702,95.4054054054054,40.54794520547945,23.456790123456795,10.027781971564053,110
|
||||
SZ002284,4.398097542503743,0.024331634209084775,57.814917454133386,5.07188216839199,19.106697366437405,0.5028769010243278,17.55,59.08,70.67567567567568,84.06593406593407,69.05405405405406,51.27478753541077,40.54421768707483,46.21621621621622,82.87671232876713,19.890260631001368,10.027062697830377,111
|
||||
SZ300869,7.2197382290456025,0.02237789869310503,32.769367831820475,15.78570538538311,58.14766846180341,0.8734002467470651,16.41,17.24,44.5945945945946,86.81318681318682,25.270270270270267,0.9915014164305958,95.10204081632652,94.72972972972973,86.02739726027397,85.04801097393691,10.014100077379023,112
|
||||
SZ301577,7.236159386331127,0.018601531067169632,29.430104289448,4.954839556858968,24.816694278305693,0.545477644640281,26.899999999999995,35.7,44.45945945945946,89.97252747252747,20.135135135135133,55.38243626062322,55.23809523809524,64.72972972972974,61.50684931506849,54.45816186556927,10.010401009092226,113
|
||||
SZ002897,5.018770300033279,0.042260298935749015,60.634549963628245,4.756221937609181,18.76875819114428,0.4765629098071079,32.55,51.03,65.13513513513513,67.85714285714286,74.1891891891892,68.55524079320114,38.63945578231293,34.18918918918919,50.136986301369866,30.72702331961591,10.00758940293237,114
|
||||
SZ002042,2.4831776044620537,0.16355528319649537,66.86066902568471,4.188059936770303,5.762091422105615,0.4806245903264848,14.05,18.51,87.97297297297297,26.098901098901095,84.72972972972973,99.0084985835694,7.755102040816326,35.0,91.64383561643835,83.40192043895748,9.99860128221904,115
|
||||
SH688102,4.629082890325904,0.054937244582562134,48.53667668429208,4.60541887084353,22.613761094119944,0.673756128697293,65.97,29.68,68.1081081081081,58.37912087912087,52.02702702702703,78.18696883852692,48.435374149659864,82.56756756756756,10.75342465753425,64.19753086419753,9.98955376979174,116
|
||||
SH600885,9.789094012034889,0.0408314162997351,38.49422272180581,6.016550289159101,33.76530029724666,0.8974953952217647,19.45,23.37,32.16216216216217,69.23076923076923,35.0,23.796033994334277,74.82993197278913,96.21621621621622,77.8082191780822,72.9766803840878,9.988180112086098,117
|
||||
SZ300161,17.821466923823593,0.1303451914463679,61.76722639390518,4.5409977724487005,35.01330449257773,0.5038915459537407,11.68,25.78,12.297297297297295,31.043956043956044,75.4054054054054,82.71954674220963,77.14285714285715,47.2972972972973,95.2054794520548,70.0960219478738,9.985898645791444,118
|
||||
SH688082,4.427430100311595,0.02725776193331166,36.06038236624041,5.746299215668556,50.87231674911745,0.954114958839537,26.05,52.239999999999995,70.13513513513514,81.45604395604396,31.08108108108108,27.620396600566576,92.78911564625851,99.05405405405405,62.87671232876713,29.08093278463649,9.977761098408115,119
|
||||
SZ002471,3.71102581181109,0.04956189934532851,68.72609777671859,5.047869974735635,10.456765850527661,0.5019514229206256,36.62,21.39,76.75675675675674,61.675824175824175,86.89189189189189,52.69121813031161,19.727891156462583,45.40540540540541,41.36986301369863,77.22908093278463,9.975342044435028,120
|
||||
SZ002202,4.476258321441717,0.22025865499509856,73.05021070442648,4.8789954415138,21.775327140779957,0.5076429710877128,32.93,31.980000000000004,69.86486486486487,20.192307692307686,89.86486486486487,58.92351274787535,46.53061224489796,50.4054054054054,49.726027397260275,60.90534979423868,9.95055846642551,121
|
||||
SH688320,6.5947464554539685,0.016918552979141986,35.16401535008342,4.946051678677166,22.209076483356174,0.4659375654722378,13.98,23.39,50.0,90.65934065934066,30.0,55.6657223796034,47.755102040816325,31.486486486486488,91.78082191780823,72.8395061728395,9.947742081884256,122
|
||||
SZ003022,6.835783146353386,0.16698388947092707,62.8449262827624,4.6269147125827255,18.77056075729793,0.7178535950340054,,,47.7027027027027,25.549450549450547,77.56756756756756,76.91218130311614,38.775510204081634,85.54054054054055,0.0,0.0,9.94749281837015,123
|
||||
SZ001308,2.3800495450577994,0.00309902486585714,47.023790198844345,4.936311003625648,13.361671434506755,0.6676963063922216,49.3,33.43,88.78378378378379,99.58791208791209,49.72972972972973,56.37393767705383,26.39455782312925,82.43243243243244,24.520547945205486,58.43621399176955,9.936617720343154,124
|
||||
SZ002006,8.333901361428756,0.025329163580375035,42.9508422964651,4.425347245338821,33.136016839472724,0.4081080221912608,10.63,44.17,38.64864864864865,83.24175824175825,42.2972972972973,89.94334277620398,73.74149659863946,21.891891891891895,96.43835616438356,40.603566529492454,9.91761096484156,125
|
||||
SH688561,17.150900312094947,0.032730994853963614,41.98154702295888,5.537368682692249,53.78552502037969,0.5730755117029799,12.659999999999998,27.76,13.648648648648653,75.27472527472527,40.81081081081081,33.994334277620396,93.60544217687075,71.62162162162163,93.97260273972603,66.66666666666667,9.907724433638657,126
|
||||
SZ300806,6.173219620556864,0.020844651309908653,70.88305663512327,5.578176816073604,22.88644471300637,0.49890859225551704,40.71,28.21,55.4054054054054,87.91208791208791,88.51351351351352,33.14447592067988,49.93197278911565,40.67567567567568,34.794520547945204,65.98079561042525,9.893437701499064,127
|
||||
SH603709,2.877391676701895,0.07433017589792433,60.493165821705915,5.0693652674187275,22.594487801926913,0.4560297410533231,23.92,48.29,83.91891891891892,46.97802197802198,73.78378378378379,51.69971671388103,48.29931972789115,29.594594594594593,67.94520547945206,34.43072702331962,9.88343756792854,128
|
||||
SZ002730,6.616034513686471,0.04778410261799967,42.04792009736243,5.411436236598826,40.35341177098524,0.4240763695582136,19.59,8.45,49.5945945945946,63.18681318681318,40.945945945945944,37.393767705382444,84.48979591836735,23.783783783783786,77.3972602739726,95.88477366255144,9.880247131332975,129
|
||||
SZ002045,5.748594186184052,0.02547367495531016,55.59963540406393,4.481271085624294,13.38683229917972,0.5157577135088892,11.84,62.99,58.648648648648646,82.82967032967032,64.72972972972974,86.40226628895185,26.666666666666668,55.00000000000001,94.93150684931507,15.775034293552814,9.879179379345072,130
|
||||
SZ002090,6.145242070017486,0.014358999301450284,49.396254366283294,5.277506198322255,26.70136940893526,0.42080617997175634,7.15,41.04,55.54054054054054,94.23076923076923,54.45945945945946,41.64305949008499,60.68027210884354,23.243243243243246,99.17808219178083,45.67901234567901,9.878166940100265,131
|
||||
SH688372,6.688003980940984,0.016534883590391576,48.672254836079915,4.80074332778505,32.66903640867493,0.9534809872617691,65.97,41.87,48.378378378378386,90.93406593406593,52.43243243243243,65.29745042492918,73.19727891156462,98.78378378378379,10.75342465753425,44.03292181069959,9.858899566875344,132
|
||||
SZ002676,8.037997237269282,0.0899859108034465,63.38521076348352,5.431222511894077,18.498287770149847,0.5201207601531522,29.2,39.46,40.67567567567567,40.934065934065934,79.32432432432432,36.54390934844193,37.41496598639456,56.08108108108109,56.57534246575342,48.01097393689986,9.853054072188048,133
|
||||
SH601609,0.6469870827773102,0.027872806410990242,67.62686065643685,6.0556256576337635,2.8640789514465843,0.5341300601980254,29.94,6.529999999999999,99.32432432432432,80.4945054945055,85.67567567567568,23.087818696883854,3.9455782312925165,61.35135135135135,54.58904109589041,97.80521262002743,9.851499917748553,134
|
||||
SZ300740,5.76675874841971,0.07053529843203812,48.99027877751516,4.527440007030051,63.755124849490116,0.5019223529586475,69.36,10.13,58.513513513513516,49.45054945054945,53.24324324324324,83.28611898016997,96.3265306122449,45.27027027027027,8.082191780821912,94.51303155006858,9.845141819690575,135
|
||||
SZ300083,4.752955419460801,0.19306958569537122,54.299899222663115,4.737060101233759,23.02869451140768,0.6650386293037575,46.75,28.67,67.16216216216216,22.939560439560434,62.29729729729729,69.40509915014164,50.476190476190474,82.02702702702702,27.260273972602743,65.29492455418382,9.839664481084224,136
|
||||
SZ300681,3.687465879511124,0.018706884562492383,60.46613097582051,4.808691601326448,14.998116605586631,0.5137467274999306,23.96,66.45,76.8918918918919,89.83516483516483,73.64864864864865,64.58923512747876,30.476190476190478,53.783783783783775,67.8082191780822,13.305898491083678,9.821707352908586,137
|
||||
SZ002600,3.4115669445502843,0.07061413298568128,54.097940056451534,4.734814809248331,15.152192595585944,0.5645133981759455,31.019999999999996,56.04,79.72972972972973,49.31318681318682,61.62162162162163,69.83002832861189,30.74829931972789,69.86486486486486,52.53424657534247,23.93689986282579,9.821684346110578,138
|
||||
SH688665,7.645743399786495,0.01970374333708672,29.472913431953213,7.461425667615999,43.49503509458216,0.8248033385973887,17.14,25.429999999999996,42.567567567567565,88.73626373626374,20.27027027027027,12.181303116147312,87.07482993197279,92.7027027027027,83.56164383561644,70.71330589849109,9.820429352975257,139
|
||||
SZ001314,3.9251478634714703,0.018785937013915805,30.388216978556866,4.789107633718567,17.041474711311388,0.7912014450839855,34.37,39.87,75.0,89.6978021978022,21.891891891891895,66.28895184135976,34.14965986394558,90.67567567567568,45.68493150684931,47.18792866941015,9.814945179158363,140
|
||||
SZ301260,9.038380362474031,0.0867854769279446,56.96507202873592,5.5689692680324505,35.10536157753133,0.5425311605153268,20.83,46.41,35.54054054054055,42.170329670329664,67.43243243243244,33.286118980169974,77.41496598639456,63.64864864864865,74.93150684931507,36.89986282578875,9.812795976863205,141
|
||||
SH605088,6.999774157473141,0.1530523948804304,54.86370954239435,5.8432627051327515,25.178271428983575,0.6418155161436988,20.34,28.34,46.62162162162162,27.609890109890113,63.51351351351351,26.203966005665723,56.19047619047619,79.72972972972973,76.16438356164383,65.4320987654321,9.800484799363135,142
|
||||
SH688726,4.738924581866182,0.02735923349779795,61.9620491915931,5.335323509687897,32.41058426920891,0.5,12.39,76.17,67.29729729729729,81.04395604395604,75.8108108108108,39.80169971671388,72.6530612244898,42.09459459459459,94.3835616438356,7.818930041152261,9.798503734955284,143
|
||||
SZ002386,3.9979663654391184,0.16529381908551405,62.20594155124518,4.480685822705167,6.139544057312855,0.5209843369383329,24.16,15.879999999999999,74.1891891891892,25.82417582417582,76.8918918918919,86.68555240793201,8.979591836734693,56.486486486486484,66.98630136986301,86.55692729766804,9.793616670499576,144
|
||||
SZ002530,14.28841763163524,0.07553898711911634,32.589307435695744,5.169661016205613,33.49208991896649,0.9699604370493442,15.5,12.21,19.324324324324326,46.7032967032967,25.135135135135133,46.317280453257794,74.28571428571429,99.72972972972973,87.94520547945206,92.5925925925926,9.791151422141482,145
|
||||
SZ300703,10.002775111506605,0.04696994438486989,45.783039286927846,7.281552792280246,35.43844497697147,0.8259244591415449,22.74,21.11,30.675675675675674,64.01098901098901,47.16216216216216,13.172804532577908,78.2312925170068,92.83783783783784,70.82191780821918,78.18930041152264,9.77805203148859,146
|
||||
SZ300729,4.345665343744959,0.09159215892956388,63.82207645788481,4.670542640991276,25.92598458223548,0.3930045755000628,43.42,14.469999999999999,71.21621621621621,40.24725274725275,80.13513513513514,73.51274787535411,59.183673469387756,20.135135135135133,31.23287671232877,88.95747599451303,9.755957869913665,147
|
||||
SZ002741,5.130249572668791,0.03184533334276608,46.62999058509417,4.824049906514642,11.533920982736026,0.7175403880594166,51.57000000000001,15.79,63.783783783783775,76.23626373626374,48.91891891891892,62.889518413597735,22.176870748299322,85.4054054054054,21.91780821917808,86.8312757201646,9.745498523124976,148
|
||||
SZ300311,46.361746148471724,0.02532706257183821,48.17901735766398,4.420480409332351,47.36137623040619,0.5664961904142469,23.0,49.87,2.1621621621621623,83.37912087912088,51.486486486486484,90.22662889518413,89.79591836734694,70.13513513513514,69.86301369863014,31.82441700960219,9.74245214215647,149
|
||||
SH603703,13.58234366574187,0.1648624013463964,56.78888962433493,4.5035755645398075,25.85312831377931,0.5583601418507946,30.0,23.5,20.13513513513514,25.96153846153846,67.02702702702703,84.84419263456091,58.77551020408164,68.51351351351352,54.24657534246575,72.42798353909465,9.732824859396079,150
|
||||
SZ301200,4.5816320473182035,0.010040693549704806,38.767857082601196,19.215999572048172,29.623564896019605,0.6095583528749674,25.14,22.6,68.78378378378378,96.56593406593407,35.54054054054054,0.14164305949008194,66.53061224489795,76.48648648648648,64.65753424657534,74.48559670781893,9.730010459011265,151
|
||||
SH603861,4.932390372438712,0.09295543914366383,62.251220076319655,4.8713156822685315,18.828351992187585,0.5037472824306195,20.84,55.7,65.54054054054055,39.972527472527474,77.02702702702703,59.20679886685553,39.31972789115646,47.16216216216216,74.7945205479452,24.417009602194785,9.729074002689703,152
|
||||
SH603225,1.2886324062315948,0.05907420092465785,71.36608737811262,5.069452248400918,6.5135285328580235,0.5184046302960598,41.23,10.46,96.89189189189189,55.63186813186813,89.1891891891892,51.55807365439094,9.931972789115646,55.67567567567567,33.698630136986296,94.23868312757202,9.711249137954571,153
|
||||
SZ301608,2.333451618155533,0.014794388229101368,19.93107175846078,5.578979937597494,21.771976546919333,0.772206561627503,15.410000000000002,41.45,89.45945945945945,93.54395604395604,7.837837837837839,33.0028328611898,46.394557823129254,89.32432432432432,88.08219178082192,44.92455418381345,9.709464645984887,154
|
||||
SZ002655,8.312336907022578,0.0584323557300652,58.29769665612251,4.600190866245259,32.50889385491028,0.5384564128724744,57.2,42.48,38.91891891891892,55.769230769230774,69.45945945945947,78.61189801699717,72.78911564625851,62.70270270270271,17.260273972602736,43.07270233196159,9.699211551863304,155
|
||||
SH603308,8.201729831578785,0.14697761836298615,57.09163876780837,5.015305787586749,36.82919326053133,0.5180249154780083,42.67,16.72,39.59459459459459,28.434065934065934,67.97297297297298,53.82436260623229,80.54421768707482,55.54054054054054,32.054794520547944,86.28257887517147,9.68872873646481,156
|
||||
SH603283,5.789547678704379,0.0164452174419597,43.3745382506019,4.641944611352587,42.718385716082864,0.4293869001238307,16.48,63.96999999999999,58.10810810810811,91.20879120879121,43.24324324324324,76.06232294617563,86.39455782312925,24.594594594594597,85.54794520547946,14.677640603566534,9.656629043609055,157
|
||||
SZ300523,28.77718987028542,0.21164605069391912,65.67661961487897,4.490951559723316,41.05560141907464,0.5227779055616748,13.86,31.319999999999997,4.594594594594592,20.879120879120883,82.16216216216216,85.41076487252126,84.89795918367346,57.567567567567565,92.05479452054794,61.45404663923182,9.653218807954415,158
|
||||
SH688186,3.625524301854092,0.06969142463433389,66.21375483392492,4.791782731358295,19.33387466698623,0.6495906294253075,36.94,63.79,77.43243243243244,50.137362637362635,82.83783783783784,65.72237960339945,41.49659863945578,80.67567567567568,41.0958904109589,14.951989026063096,9.629712880303618,159
|
||||
SZ300227,11.697109654706223,0.06867764967031574,46.20382415320577,4.271616742834254,30.73887825646263,0.47051965486265906,12.990000000000002,39.81,25.67567567567568,50.54945054945055,47.97297297297297,96.88385269121812,70.06802721088435,32.972972972972975,93.56164383561644,47.46227709190672,9.62682560256276,160
|
||||
SH688379,2.036205283416949,0.06534493656938742,59.57533034957414,4.7719783237695195,10.632288833326232,0.942204385225254,50.05,38.45,91.75675675675676,52.335164835164825,71.35135135135135,66.85552407932012,20.136054421768705,98.24324324324324,23.424657534246574,49.51989026063101,9.61107792299577,161
|
||||
SZ002669,5.940898930984275,0.17900051212002666,57.05126720813855,4.778427475603558,15.859143938514439,0.5109033189437518,35.3,37.73,56.8918918918919,24.587912087912088,67.7027027027027,66.71388101983003,31.83673469387755,52.2972972972973,44.10958904109589,51.028806584362144,9.609821540844143,162
|
||||
SZ002185,4.535213665373622,0.03653632757798596,48.7874868643426,4.649312234131754,9.001372539591513,0.3476423268704428,14.540000000000001,19.1,69.32432432432432,72.80219780219781,52.702702702702695,75.4957507082153,16.054421768707485,15.675675675675677,90.20547945205479,82.03017832647463,9.60626444804049,163
|
||||
SH603933,5.033223752577193,0.04397278764211986,43.975885911174736,4.513421971611185,24.54244219617717,0.4754472582393246,56.47,18.83,65.0,66.34615384615384,44.45945945945946,84.41926345609065,54.5578231292517,33.91891891891892,17.808219178082197,82.7846364883402,9.599022869856453,164
|
||||
BJ831832,8.139134404943599,0.03957415738589527,53.42876633939922,,40.53281305197928,0.09729648023895358,19.6,22.57,40.4054054054054,70.60439560439559,59.86486486486486,0.0,84.62585034013605,3.783783783783784,77.26027397260273,74.62277091906722,9.593902978287087,165
|
||||
SH603887,9.933958756925037,0.03853850738876845,65.66463538680603,5.04477904044265,19.09961106253581,0.5029465643134895,29.87,48.43,31.216216216216218,71.15384615384616,82.02702702702702,52.97450424929179,40.27210884353741,46.62162162162162,55.00000000000001,34.15637860082305,9.5799415196445,166
|
||||
SH688141,7.375202405121027,0.008964882439768318,50.294491564280044,4.386755500777437,29.686628465400954,0.5266117916029359,68.98,40.7,43.78378378378378,97.52747252747253,56.21621621621622,91.78470254957507,66.93877551020408,59.189189189189186,8.493150684931505,46.364883401920444,9.575980458806116,167
|
||||
SZ001289,1.3018847453940088,2.806599936686113,66.65674936323875,4.666340378156519,42.605211326907764,0.45894482024664535,29.719999999999995,35.2,96.75675675675676,1.7857142857142905,83.64864864864865,73.93767705382437,85.98639455782313,30.0,55.47945205479452,55.55555555555556,9.57537376995494,168
|
||||
BJ873806,3.209834100515389,0.012480066425442768,57.15836845606725,,13.438335534883953,0.49203560127122126,14.38,60.42000000000001,81.35135135135135,95.46703296703298,68.10810810810811,0.0,26.93877551020408,37.83783783783784,90.95890410958904,18.930041152263378,9.538596339266707,169
|
||||
SH600129,6.185833349334453,0.2018829779170306,73.87467133562798,5.675335086739971,28.863868670085964,0.4449531183530606,13.11,6.58,54.72972972972974,21.978021978021978,90.67567567567568,29.17847025495751,64.62585034013605,27.837837837837835,93.42465753424658,97.66803840877914,9.53708088738347,170
|
||||
SH688721,4.562691938829192,0.037155613077875974,5.657037112760933,4.4569592645975495,52.439909971956325,0.5,,,69.05405405405405,72.25274725274726,0.40540540540540543,88.10198300283287,93.33333333333333,42.09459459459459,0.0,0.0,9.534129163779154,171
|
||||
SH603029,12.295964514826489,0.03294065646676146,56.64325638714577,4.759189005599314,29.46636720103386,0.5081517215047021,9.69,63.62,23.648648648648653,74.86263736263736,66.75675675675676,68.27195467422096,66.39455782312925,50.810810810810814,97.80821917808218,15.226337448559669,9.524158725573997,172
|
||||
SH603366,7.747241854729841,0.12462378443862714,44.497290716461954,5.6586639524206195,29.328048902993853,0.5142948997636232,10.22,15.7,41.891891891891895,32.280219780219774,45.0,29.886685552407933,65.85034013605441,54.054054054054056,96.84931506849314,86.96844993141289,9.51870841513589,173
|
||||
SZ300322,9.939343551826608,0.04932276095359529,67.19498598349126,14.319201829085763,24.698604710694923,0.69766090845567,11.28,29.830000000000002,31.081081081081084,61.81318681318682,85.27027027027026,1.2747875354107596,54.82993197278911,84.05405405405405,95.61643835616438,63.923182441700966,9.513096631562817,174
|
||||
SZ002692,1.3712318562870356,0.040139185606187226,59.824866095414876,5.311946483878458,9.880484803460583,0.6046255628508125,51.76,25.679999999999996,96.08108108108108,69.78021978021978,72.02702702702702,40.36827195467422,18.639455782312925,76.21621621621621,21.643835616438356,70.23319615912209,9.49256525104821,175
|
||||
SZ002851,2.7885782145203186,0.011693193968023487,47.58218910849405,7.453141409538985,22.95166833308599,0.34805651458002484,13.23,19.78,85.13513513513513,95.87912087912088,50.67567567567568,12.322946175637394,50.204081632653065,15.81081081081081,93.28767123287672,80.65843621399176,9.492050191210886,176
|
||||
SH601107,6.1076176206394095,,66.61579875058719,5.630490122318223,44.86585984716677,0.5315197692976147,78.0,5.08,55.81081081081081,0.0,83.51351351351352,31.161473087818692,88.57142857142857,60.945945945945944,4.246575342465753,98.49108367626886,9.485398311937645,177
|
||||
SH688615,4.805742095230045,0.01480435070001039,22.759847533478876,7.0310624186519615,85.59982804127884,0.6121770654453044,41.49,7.960000000000001,66.48648648648648,93.4065934065934,11.756756756756758,14.44759206798867,99.45578231292517,76.62162162162161,33.42465753424657,96.43347050754458,9.481407493875508,178
|
||||
SH603215,3.5982468188697556,0.06940712380631255,60.29793657885878,5.06256805193092,12.70049930863994,0.7355009615778115,18.01,64.0,77.97297297297298,50.41208791208791,73.24324324324324,51.841359773371096,24.625850340136054,86.89189189189189,81.36986301369863,14.54046639231824,9.48129238645392,179
|
||||
SH605268,5.780137376940868,0.11975423891825542,60.50862973437653,9.682610884427916,27.478885277570946,0.5536231652769201,23.05,4.83,58.243243243243235,32.692307692307686,73.91891891891892,4.39093484419264,62.31292517006802,66.48648648648648,69.58904109589041,98.62825788751715,9.479851793669965,180
|
||||
SH603186,2.508625075552832,0.10536018435979513,76.50696041812134,5.694644475148599,12.591756285726458,0.948264197631034,44.49,16.92,87.70270270270271,35.027472527472526,93.64864864864865,28.47025495750708,24.081632653061224,98.51351351351352,29.863013698630137,85.73388203017834,9.473815545078239,181
|
||||
SH605358,3.3872998098387406,0.047847766132780585,57.469913651805484,5.232002179199467,13.066887480954179,0.44144833752047175,21.7,38.7,80.13513513513514,62.91208791208791,68.64864864864865,43.48441926345609,25.30612244897959,26.62162162162162,73.28767123287672,49.382716049382715,9.465192220394886,182
|
||||
SZ300815,6.696770604452347,1.1099847496870505,48.55619305506891,4.341635752959341,24.75954977839719,0.5988365396191843,33.53,13.25,48.108108108108105,3.9835164835164805,52.16216216216216,94.05099150141642,55.10204081632652,75.4054054054054,47.397260273972606,91.6323731138546,9.463000529735993,183
|
||||
SH600455,36.66186613289701,,62.13625448420073,4.213002980730308,36.84220156484814,0.5944623530658191,79.38,1.5,3.7837837837837784,0.0,76.48648648648648,98.30028328611898,80.68027210884354,74.32432432432432,3.8356164383561597,99.72565157750343,9.44015176368584,184
|
||||
SZ300428,1.7847379836432704,0.02382169489671442,66.78417800609277,4.6038734574605895,8.833250179382897,0.33592414877907134,41.48,22.64,93.78378378378378,85.02747252747253,84.32432432432432,78.328611898017,15.646258503401361,14.72972972972973,33.56164383561644,74.21124828532236,9.437392370093637,185
|
||||
SZ002866,5.102015708657117,0.045691380667633626,49.318884244274045,5.722821421647237,22.593285303509163,0.7309242757929345,28.96,56.84,63.91891891891892,64.83516483516483,54.18918918918919,28.045325779036823,48.16326530612245,86.62162162162163,57.26027397260274,23.182441700960222,9.436944467579744,186
|
||||
SZ300057,2.691515463918345,0.08075760153760408,49.778246865071225,4.3440683505800735,6.564146698782926,0.6486040359105695,39.88,33.94,86.35135135135134,43.81868131868132,55.4054054054054,93.90934844192634,10.068027210884352,80.54054054054053,35.890410958904106,57.20164609053497,9.426387565740118,187
|
||||
SH688559,13.445187190050593,0.027298561376493568,74.33728280952407,4.297245961184219,17.560216985549616,0.38322627869254866,10.96,42.18,20.54054054054054,81.31868131868131,91.35135135135135,95.60906515580736,34.965986394557824,19.054054054054053,96.16438356164385,43.34705075445816,9.42574425610133,188
|
||||
SH688071,9.347821642657625,0.10409368813000094,52.150616789390014,5.99313375939447,29.04450781907908,0.7443548405132852,24.3,34.38,34.32432432432433,35.43956043956044,57.83783783783784,24.22096317280453,65.03401360544217,87.43243243243242,66.43835616438356,56.790123456790134,9.424701851834008,189
|
||||
SZ301589,7.036746368226305,0.010082899061253042,30.08684963918254,4.670449705605721,59.12439335474028,0.42729357051188144,36.45,27.21,46.081081081081074,96.42857142857143,21.216216216216218,73.65439093484419,95.37414965986395,24.18918918918919,42.054794520547944,68.3127572016461,9.414359691677788,190
|
||||
SH688389,6.205604259083539,0.029801233418427785,26.132290646385425,4.7326433410412605,64.97247715384465,0.1706455053852445,16.87,25.89,54.45945945945946,78.43406593406593,15.405405405405407,70.39660056657225,96.5986394557823,6.756756756756757,84.24657534246576,69.9588477366255,9.408646401979246,191
|
||||
SH603936,4.053168634635777,0.06558462914159542,53.794794735353236,5.841974918503215,13.200216680593321,0.5029110425730897,31.34,24.85,73.64864864864865,52.19780219780219,60.67567567567568,26.345609065155806,25.850340136054424,46.35135135135135,51.917808219178085,71.19341563786008,9.401080249053482,192
|
||||
SZ300682,10.016161227273864,0.0315095875664757,28.387111027308837,5.152250822599846,48.386399784089974,0.7462493511676532,8.78,54.37,30.135135135135137,76.64835164835165,18.783783783783782,47.59206798866855,90.34013605442178,87.83783783783784,98.35616438356163,25.514403292181065,9.381541409917725,193
|
||||
SH688133,7.003868784009465,0.11353370188614044,40.757621975923996,5.6858174231815015,23.248968115709996,0.692856389082361,25.82,6.419999999999999,46.48648648648649,33.791208791208796,38.91891891891892,28.611898016997173,51.56462585034014,83.64864864864865,63.42465753424658,97.94238683127571,9.361479472568048,194
|
||||
SZ002080,5.700383841522381,0.1527730377421125,55.48833488328631,6.22856870519247,18.54173748453008,0.8390353369202442,12.21,33.27,59.05405405405406,27.747252747252748,64.45945945945945,21.246458923512744,37.55102040816327,93.64864864864865,94.52054794520548,58.71056241426611,9.3533420778534,195
|
||||
SH601868,3.768484974490631,0.20197231552042014,76.98227149093051,7.744035002197229,11.179332301118453,0.5480905961932424,4.56,7.01,76.48648648648648,21.84065934065934,94.05405405405406,10.623229461756377,21.63265306122449,65.4054054054054,99.72602739726028,97.11934156378601,9.348549621434683,196
|
||||
SH603618,1.7242763519523308,0.025632200063078616,69.5584060331975,5.114791242306726,12.552650728853035,0.39971358252613826,46.81,17.07,94.45945945945947,82.41758241758241,87.56756756756758,49.150141643059484,23.945578231292515,21.486486486486488,26.84931506849315,85.32235939643347,9.342174635153253,197
|
||||
SZ300751,2.5418738280602358,0.008968708720527819,66.83075673110872,4.838398172673489,29.096562520230897,0.09216505451982178,31.920000000000005,57.04,87.56756756756756,97.39010989010988,84.5945945945946,61.756373937677054,65.3061224489796,3.5135135135135136,50.54794520547945,22.90809327846365,9.340302303982153,198
|
||||
SZ301380,2.122313935032263,0.07028223594767088,42.899866494929825,4.931469083272554,16.37878955928737,0.5555520480168195,36.25,49.37,90.81081081081082,49.72527472527473,42.027027027027025,56.5155807365439,32.7891156462585,67.56756756756756,42.73972602739726,32.78463648834019,9.308466538255306,199
|
||||
SZ000859,4.397501199677538,0.04291279371662755,35.748556955086805,4.771811072525142,4.535270372385145,0.5046209112497803,19.46,18.44,70.8108108108108,67.58241758241759,30.810810810810814,66.9971671388102,5.442176870748299,47.7027027027027,77.67123287671232,83.67626886145405,9.302665697897467,200
|
||||
SH600353,5.7437115964125045,0.08830520690256062,41.22833429616169,6.287390894619907,23.829832021322204,0.64145190701469,33.55,16.97,58.78378378378378,41.48351648351648,39.45945945945946,20.113314447592067,53.06122448979592,79.5945945945946,47.26027397260274,85.45953360768176,9.291428986851972,201
|
||||
SH603341,1.4873685172458013,0.015275081091953175,77.30383730545788,4.66532604012635,7.4480624286472565,0.660022187127726,43.61,82.21,95.27027027027027,92.85714285714286,94.32432432432432,74.22096317280453,12.653061224489795,81.89189189189189,30.82191780821918,4.389574759945125,9.28979752505163,202
|
||||
SZ300661,3.627106221808435,0.022018065519225364,22.497849470069056,4.312495844787363,49.06532926161055,0.5357542548334677,89.04,35.56,77.29729729729729,87.08791208791209,11.486486486486488,95.18413597733712,91.15646258503402,62.027027027027025,0.8219178082191747,54.80109739368999,9.273574099455674,203
|
||||
SH600959,15.077926374173897,0.68562276062747,37.76141607139985,4.489655619534773,23.01889523667187,0.8014181423916444,7.8100000000000005,3.17,17.2972972972973,7.14285714285714,33.513513513513516,85.69405099150141,50.34013605442177,91.48648648648648,98.9041095890411,99.1769547325103,9.255802227991499,204
|
||||
SZ300975,1.2567132861274735,0.1450125544665341,62.86786358045687,4.69964761506599,12.480268616193955,0.5279880142297013,53.03,20.54,97.02702702702702,28.983516483516482,77.83783783783784,72.23796033994334,23.6734693877551,59.72972972972973,19.999999999999996,78.87517146776406,9.250881874981683,205
|
||||
SZ002767,8.999641029686032,0.037317507198519964,27.384254559937222,4.401696067966734,33.90293738630595,0.44587989262581856,29.909999999999997,22.82,35.810810810810814,71.97802197802197,16.756756756756758,91.07648725212465,75.10204081632654,27.972972972972972,54.794520547945204,73.52537722908093,9.24422416962655,206
|
||||
SZ002368,19.90790349867106,0.5356296970684489,63.62274075319394,4.350173352004653,28.204418296436547,0.4996313203756416,12.83,15.97,9.999999999999998,8.791208791208794,79.86486486486486,93.62606232294618,63.40136054421769,41.08108108108108,93.69863013698631,86.41975308641976,9.243578100881612,207
|
||||
SZ300231,2.3662206774835637,0.11841880176575308,38.823981255188336,4.80104498030491,20.638620036266527,0.5219237851790381,44.7,30.53,89.05405405405405,32.829670329670336,35.67567567567568,65.15580736543909,44.21768707482993,57.027027027027025,29.589041095890412,62.27709190672154,9.239747195002778,208
|
||||
SH688411,2.890925244648452,0.015597765442590714,64.61118052462915,4.90255100495325,18.697585871842648,0.5,66.66,40.17,83.64864864864865,92.03296703296704,81.21621621621622,57.93201133144477,38.23129251700681,42.09459459459459,9.86301369863014,47.05075445816187,9.234962176972395,209
|
||||
SZ002580,2.7390296843347226,0.030223400477651027,38.21230399930805,4.6983834044640815,18.651828889156448,0.5216978107586505,64.62,28.74,85.94594594594595,77.74725274725274,34.18918918918919,72.37960339943344,37.95918367346939,56.89189189189189,11.369863013698634,65.02057613168724,9.223375989397201,210
|
||||
SH601677,0.8918938088742915,0.030110707027524573,30.954330294182054,5.1510807594904024,6.636940635459398,0.6403753057404886,38.78,8.46,98.78378378378379,78.02197802197803,22.432432432432435,47.733711048158646,10.612244897959183,79.45945945945945,37.945205479452056,95.74759945130316,9.220422286470907,211
|
||||
SH603499,6.326143909199473,0.0956097433466347,41.56685888417483,5.579282196939809,28.950317524123605,0.6201615344436165,16.47,53.04,52.97297297297297,39.14835164835166,40.0,32.86118980169972,64.76190476190476,77.83783783783784,85.82191780821917,28.12071330589849,9.213808070883816,212
|
||||
SZ003021,6.038610804544551,0.023890440795639664,21.841949076103724,4.818897842087157,31.688385737872572,0.49041357045589484,17.99,46.62,56.081081081081074,84.75274725274726,10.27027027027027,63.1728045325779,71.70068027210884,37.7027027027027,81.5068493150685,36.62551440329218,9.21350439841066,213
|
||||
SZ000032,2.7316368922023675,0.04405276708338563,81.769887390525,5.7109581172075545,8.415491080439654,0.07828406724196259,5.52,13.94,86.08108108108108,66.20879120879121,96.48648648648648,28.328611898016998,14.421768707482993,2.9729729729729732,99.58904109589041,90.39780521262003,9.212939804640682,214
|
||||
SH603958,5.220779259776563,1.384118001563517,53.16864525536013,5.045839858086752,39.28562981693213,0.5066256634032684,33.5,24.52,62.972972972972975,3.7087912087912067,59.32432432432433,52.832861189801704,83.53741496598639,49.5945945945946,47.67123287671233,71.60493827160495,9.185594211259954,215
|
||||
SH600963,2.8104482872251957,0.07244799518246756,59.937490891684185,4.58622699207732,9.221380485209794,0.46936424178114167,43.3,20.68,84.86486486486487,48.21428571428571,72.16216216216216,79.74504249291785,16.598639455782312,32.567567567567565,31.506849315068497,78.73799725651578,9.180124357690676,216
|
||||
SH688019,4.669915037929441,0.02112721923311108,20.042729001777403,4.375762382396055,55.70159565181251,0.8164008996031278,46.65,74.67,67.83783783783784,87.36263736263736,8.108108108108109,92.3512747875354,94.14965986394557,92.16216216216216,27.53424657534247,8.916323731138542,9.132912554319029,217
|
||||
SH688383,5.059803689186619,0.032706534630177614,51.24047086268776,8.471164747149452,33.23083755346267,0.45319967991786797,13.41,41.42,64.32432432432432,75.41208791208791,57.16216216216217,7.932011331444755,73.87755102040816,28.91891891891892,93.15068493150685,45.13031550068587,9.131044099345608,218
|
||||
SZ300596,4.341015755743046,0.07987159172819906,48.378293042250085,8.118486660224576,21.52233336635772,0.5068554996104806,24.46,13.51,71.35135135135135,44.64285714285714,51.891891891891895,9.49008498583569,45.714285714285715,49.72972972972973,66.16438356164383,91.35802469135803,9.128487167847954,219
|
||||
SH601528,27.253580644899422,,91.66109840250667,5.163764053601514,,0.7628076310559065,,,5.5405405405405395,0.0,99.45945945945947,46.60056657223796,0.0,88.78378378378379,0.0,0.0,9.128149009307306,220
|
||||
SZ300088,2.1245072858918563,0.042182381875894126,45.80264896454838,4.637347846963954,9.664427201780676,0.6480966935598442,35.5,58.4,90.67567567567568,67.9945054945055,47.43243243243243,76.20396600566572,17.82312925170068,80.4054054054054,43.83561643835616,20.850480109739365,9.126257467876645,221
|
||||
SZ300078,5.324169680668637,0.26315827924524704,62.491779581622474,4.281894790486195,5.5447447857693435,0.5159867655704163,21.28,28.26,62.29729729729729,17.170329670329664,77.43243243243244,96.60056657223795,7.07482993197279,55.13513513513514,74.10958904109589,65.70644718792866,9.120671756612602,222
|
||||
SZ002442,4.27248718104041,0.07994127241763127,59.6134234703872,5.586269732531163,9.389496012571428,0.5105028210164555,30.81,33.33,72.02702702702703,44.36813186813187,71.62162162162163,32.71954674220963,16.870748299319725,51.891891891891895,52.87671232876712,58.57338820301783,9.119555697831458,223
|
||||
SZ300772,1.109869510114036,0.013826840897140933,83.99822486304161,4.1609856021456295,10.46934309644426,0.3423815002228125,46.46,53.17000000000001,97.43243243243244,94.64285714285714,97.83783783783784,99.15014164305948,20.0,15.27027027027027,27.94520547945205,27.846364883401918,9.10394879720886,224
|
||||
SH688106,8.322451413212628,0.2300468034916968,52.529509911268526,4.52279399180143,28.49058245122793,0.31515540720718727,17.67,10.32,38.78378378378379,19.64285714285714,58.648648648648646,83.56940509915015,64.21768707482994,12.972972972972974,82.46575342465754,94.3758573388203,9.102564629067093,225
|
||||
SZ300520,13.182869685909285,0.023468797186189605,56.31276696744263,5.15607093351781,42.636554353239916,0.11134522503798136,12.09,35.56,21.756756756756758,85.3021978021978,66.08108108108108,47.30878186968839,86.25850340136054,4.1891891891891895,94.65753424657535,54.80109739368999,9.09996163119647,226
|
||||
SH600186,3.4962228159193574,0.08914961067740053,54.129846934904634,5.660632918189821,30.66873645975693,0.5576447015020468,75.2,9.6,78.9189189189189,41.208791208791204,61.75675675675676,29.74504249291785,69.79591836734694,68.10810810810811,5.205479452054796,95.19890260631001,9.097851962927606,227
|
||||
SH600206,2.226389326492916,0.024827054636050942,33.021193015214244,5.161948049608127,6.673262013682553,0.9543733033937449,30.67,39.79,90.13513513513513,83.51648351648352,26.08108108108108,46.88385269121813,10.748299319727892,99.1891891891892,53.28767123287671,47.59945130315501,9.097285918178507,228
|
||||
SH600459,0.5779117040505599,0.036093629136149045,55.18543273354859,6.054643006905386,2.5463721155457972,0.5277180848014228,29.73,21.89,99.5945945945946,73.35164835164835,64.05405405405405,23.229461756373937,3.4013605442176873,59.5945945945946,55.342465753424655,76.13168724279835,9.095617385146479,229
|
||||
SH603015,13.429360413649096,0.04206999441518238,34.17825715211027,4.870699356219927,36.13829245156794,0.5474340285276645,34.47,42.69,20.675675675675677,68.26923076923077,28.64864864864865,59.34844192634561,78.91156462585033,65.0,45.06849315068493,42.524005486968456,9.077938683994546,230
|
||||
SH600736,4.779641972793973,1.4106025912751512,75.8937687573315,4.764707989163826,9.025689182550693,0.5985967868831134,35.17,8.1,66.62162162162161,3.57142857142857,93.10810810810811,67.56373937677054,16.19047619047619,75.27027027027027,44.589041095890416,96.2962962962963,9.062578831852054,231
|
||||
SH600576,12.576141946753522,3.571082848498913,37.26931913593533,4.330154972593135,50.047100765628585,0.6755850155991929,33.11,9.61,23.108108108108105,1.098901098901095,32.972972972972975,94.47592067988668,92.24489795918367,82.97297297297297,49.178082191780824,95.06172839506173,9.056420842062796,232
|
||||
SZ300478,3.040106873027959,0.03167601125171434,79.4955194523493,4.8069392629225876,5.2469341652621475,0.5455226233592896,73.87,29.189999999999998,82.83783783783784,76.51098901098901,95.54054054054055,64.73087818696884,6.394557823129252,64.86486486486487,5.890410958904113,64.88340192043896,9.051263075158376,233
|
||||
SZ301118,6.529967752023734,0.08236102458449682,44.84620548977525,4.415430690066814,13.717481750096953,0.7443700537489951,50.97999999999999,29.98,50.94594594594595,43.13186813186813,45.67567567567568,90.5099150141643,27.89115646258503,87.56756756756758,22.46575342465753,63.78600823045267,9.044641452461297,234
|
||||
SH688079,8.817365237326328,0.03916919988186268,54.44140676004239,5.627482264892631,29.907178701173066,0.5283083613044832,27.250000000000004,63.13999999999999,36.891891891891895,70.74175824175823,62.70270270270271,31.303116147308785,68.16326530612244,60.0,60.41095890410959,15.637860082304522,9.039804708959426,235
|
||||
SZ001288,6.5438526577063545,0.04619287786830287,53.464590209782735,6.823050449878417,30.33843209011775,0.6784121014205268,12.42,71.87,50.67567567567568,64.69780219780219,60.13513513513513,15.864022662889521,69.38775510204081,83.1081081081081,94.24657534246576,10.150891632373115,9.015144526187562,236
|
||||
SZ000717,0.9339502393761399,0.06690274170270337,61.328670860892444,4.887494597995226,0.15094339718013386,0.5065760056161386,33.92,34.04,98.37837837837837,51.51098901098901,75.27027027027027,58.640226628895185,2.1768707482993195,49.45945945945946,46.71232876712329,57.06447187928669,9.013673962696613,237
|
||||
SH688768,14.977618727667732,0.012079946897455193,14.250749209315018,5.715154499334476,65.60551669449102,0.6657852652374574,18.23,30.490000000000002,17.567567567567565,95.6043956043956,4.1891891891891895,28.186968838526916,97.14285714285714,82.16216216216216,80.68493150684931,62.41426611796983,9.010860528592374,238
|
||||
SZ300031,7.686810582877223,0.07608690061134273,32.407996988021644,4.2334426360845665,38.547411310960506,0.47955099106496096,24.17,47.11,42.2972972972973,46.291208791208796,24.864864864864867,98.01699716713881,82.72108843537414,34.86486486486486,66.84931506849314,36.008230452674894,8.98499712063445,239
|
||||
SH603920,3.2863658302393066,0.028596224636935834,24.60873083828327,5.327255576762123,22.672268892167086,0.913189755891607,48.02,33.69,80.94594594594595,79.67032967032968,14.054054054054054,40.084985835694056,48.707482993197274,96.75675675675676,25.34246575342466,57.8875171467764,8.978659826896846,240
|
||||
SZ002314,3.371931399581752,3.441118983683262,75.34508752346115,6.460457851781422,21.970663110396167,0.5528776426580916,28.89,10.0,80.27027027027027,1.2362637362637319,92.83783783783784,18.555240793201133,47.074829931972786,66.21621621621621,57.397260273972606,94.78737997256516,8.97126315103305,241
|
||||
SH600509,3.319671348092432,0.9511994374491658,71.34173025638808,4.805281284947307,23.09069489805764,0.5135608924930034,32.95,46.13,80.54054054054053,4.94505494505495,89.05405405405405,64.87252124645893,50.7482993197279,53.648648648648646,49.58904109589041,37.31138545953361,8.93556220749518,242
|
||||
SH601615,3.4554713666304777,0.2919296529851603,68.69539157700243,4.732513374617752,13.188546803695186,0.49922990556031716,24.55,41.46,79.32432432432432,15.796703296703296,86.75675675675676,70.53824362606233,25.578231292517007,40.81081081081081,66.02739726027397,44.650205761316876,8.93495227030297,243
|
||||
BJ839719,7.751319000492432,0.020506558596419037,62.188097399005414,,17.108659322728034,0.4830408391809804,44.66,34.53,41.75675675675675,88.04945054945054,76.75675675675676,0.0,34.285714285714285,35.54054054054054,29.726027397260268,56.51577503429355,8.930000866471195,244
|
||||
SZ300353,21.45044718203508,0.2997474413749312,41.54521370289753,4.43952234668404,39.50345915652628,0.557516162593404,19.34,27.889999999999997,7.837837837837835,15.247252747252748,39.86486486486486,89.23512747875354,83.6734693877551,67.97297297297298,78.4931506849315,66.2551440329218,8.923128171364837,245
|
||||
SZ002838,2.5638256372655173,0.03548711873702087,48.87278320596678,9.041822001260332,13.43035433678012,0.7799366794242627,31.45,37.08,87.29729729729729,73.76373626373626,52.972972972972975,5.524079320113318,26.802721088435373,90.0,51.50684931506849,52.40054869684499,8.908062553503624,246
|
||||
SH688590,7.051847112195753,0.20134556375348717,49.125728614575706,5.652647044260932,29.982690989350967,0.507652329836395,39.2,29.54,45.81081081081081,22.252747252747252,53.783783783783775,30.169971671388108,68.57142857142857,50.54054054054053,36.986301369863014,64.33470507544581,8.906048991888019,247
|
||||
SZ300240,3.967331123855223,0.4468059103453585,56.80876087736758,5.4289035551483575,7.121353092688085,0.7004061658215356,19.37,18.33,74.59459459459458,10.439560439560436,67.16216216216216,36.96883852691219,11.700680272108844,84.45945945945947,78.21917808219179,84.0877914951989,8.890829256553081,248
|
||||
SZ000061,6.912746398933079,4.804142531002443,60.30391757293053,4.675830024530053,22.015704438811255,0.494676553459022,25.19,14.91,47.027027027027025,0.6868131868131844,73.37837837837839,73.22946175637394,47.3469387755102,38.513513513513516,64.52054794520548,88.34019204389575,8.887403070958518,249
|
||||
SH688289,12.294794924793125,0.1076704109445082,23.248147087832375,4.360997335886709,76.71315159869899,0.5438627465254235,37.63,16.78,23.783783783783786,34.47802197802198,12.162162162162163,93.20113314447592,98.50340136054422,64.05405405405405,40.205479452054796,86.14540466392319,8.878505001303228,250
|
||||
SZ002182,2.3949188407156146,0.03997849251182639,54.044757702690084,5.279000977115555,9.718940063357955,0.35567786280384417,31.42,17.26,88.64864864864866,70.05494505494505,61.48648648648649,41.50141643059491,18.095238095238095,16.756756756756758,51.64383561643835,84.91083676268862,8.868954326853547,251
|
||||
SH600986,2.410213911018344,0.040257113598920195,41.75756616557698,4.283293535526294,7.8125446931050195,0.907298907647266,77.03,38.26,88.37837837837837,69.64285714285714,40.4054054054054,96.45892351274787,13.60544217687075,96.62162162162163,4.520547945205477,49.79423868312757,8.868873588496552,252
|
||||
SZ002445,3.6065948609256555,0.04904491452197923,19.311146048452557,4.513613797500124,14.4447545931275,0.5305781681810944,26.83,43.19,77.83783783783784,61.95054945054945,7.162162162162162,84.27762039660055,29.25170068027211,60.54054054054055,61.64383561643836,41.9753086419753,8.85015078617811,253
|
||||
SZ002463,2.0964800399965196,0.021116573138789202,44.7843523734098,7.312346045120463,32.75492275268128,0.7271222808502648,54.48,49.78,91.48648648648648,87.5,45.27027027027027,13.031161473087815,73.33333333333333,86.48648648648648,18.904109589041095,32.098765432098766,8.844668373451656,254
|
||||
SZ002475,2.344922089369613,0.0303981396194977,62.906004951752145,4.655883519645872,11.179331692942466,0.9966801752294008,62.29,78.5,89.32432432432432,77.47252747252747,77.97297297297298,75.07082152974505,21.496598639455783,100.0,12.602739726027401,6.584362139917699,8.836226940782922,255
|
||||
SZ300687,8.39495540535815,0.10033143655599451,26.97153723517407,5.016888865564968,30.206777658387253,0.5582586545548591,34.43,38.22,38.24324324324324,37.22527472527473,16.486486486486488,53.682719546742206,68.9795918367347,68.37837837837839,45.47945205479452,49.93141289437586,8.833270111435638,256
|
||||
SH688181,5.5916548671180974,0.04039495796807516,31.735538707033722,4.293824890976507,42.62566638965389,0.6666023403917289,45.81,82.9,60.405405405405396,69.36813186813187,23.513513513513516,95.89235127478753,86.12244897959184,82.2972972972973,28.424657534246577,4.183813443072704,8.82662830598072,257
|
||||
SZ300620,9.82739248036303,0.06016263691295089,36.6929954647545,6.5066223168221535,26.903139820351306,0.7749489128991435,16.53,38.12,32.027027027027025,55.219780219780226,31.756756756756754,17.988668555240793,60.952380952380956,89.5945945945946,85.34246575342466,50.20576131687242,8.821528636795932,258
|
||||
SH601208,1.974417269121768,0.10265840489779164,56.61021438625227,10.529490304066938,16.394467288737953,0.6561975149839739,35.63,14.82,92.56756756756756,36.26373626373627,66.62162162162161,2.832861189801694,32.92517006802721,81.21621621621622,43.56164383561644,88.61454046639233,8.818838918048113,259
|
||||
SH688599,5.054664591183269,0.06993557518081299,74.97213565693475,5.036383981060705,6.612391274538082,0.18436122161817592,14.679999999999998,19.99,64.45945945945945,49.862637362637365,92.16216216216216,53.25779036827196,10.204081632653061,7.837837837837839,89.58904109589041,80.10973936899863,8.812605258893438,260
|
||||
SZ002369,6.345937027068131,0.023319530009181754,82.66237281593403,4.8164616124612385,4.0390996173961815,0.5439583206810823,18.27,83.99,52.83783783783784,85.85164835164835,97.16216216216216,63.59773371104816,5.034013605442176,64.1891891891892,80.54794520547945,3.703703703703709,8.79847814011576,261
|
||||
SH600580,8.275727572755427,0.3621360043707337,55.70685870671668,5.64528338646148,24.35017045286695,0.5058813369615723,18.64,14.099999999999998,39.054054054054056,13.461538461538458,64.86486486486487,30.59490084985835,54.421768707483,48.91891891891892,79.58904109589041,89.84910836762688,8.79611957489612,262
|
||||
SZ300157,31.67616046800812,0.20817675917835665,90.13150341860589,5.1777986135663205,44.31955090949886,0.7263927106107528,27.54,41.6,4.189189189189191,21.153846153846157,98.91891891891892,45.75070821529745,88.16326530612245,86.35135135135134,60.0,44.17009602194787,8.789285238394731,263
|
||||
SZ301556,10.31056901873436,0.03539109518996887,17.364345487647583,8.067754971995237,38.41870660781918,0.5514401523141245,10.41,14.21,29.18918918918919,73.9010989010989,5.9459459459459465,9.631728045325783,82.58503401360544,65.94594594594595,96.7123287671233,89.57475994513031,8.749946901006531,264
|
||||
SH605196,3.544122948832872,0.059966163774364506,58.411356826641004,4.83972845947054,15.627045468079265,0.3567013932731324,47.34,27.449999999999996,78.37837837837837,55.35714285714286,69.86486486486486,61.61473087818696,31.15646258503401,16.89189189189189,26.3013698630137,68.03840877914952,8.739691727589973,265
|
||||
SZ300493,1.853421457154745,0.0410704367022999,41.05289543736415,4.371100507297149,10.467076835095348,0.5230184449385139,74.55,30.03,93.37837837837839,68.81868131868131,39.189189189189186,92.4929178470255,19.86394557823129,57.7027027027027,5.47945205479452,63.64883401920439,8.734083751170788,266
|
||||
SZ300956,3.4097921123342743,0.0358751086679465,53.83194548557388,4.487127615919768,10.211827316538765,0.4642249393887908,11.6,90.52,79.86486486486486,73.48901098901099,60.810810810810814,85.97733711048159,19.047619047619047,30.675675675675674,95.34246575342465,1.6460905349794275,8.715595245074095,267
|
||||
SH600584,3.05208145235938,0.04392741009038983,43.715841017162994,4.859606763383888,12.63347206070751,0.816000368477473,49.98,52.32,82.43243243243244,66.75824175824177,43.648648648648646,60.62322946175638,24.217687074829932,92.02702702702703,23.6986301369863,28.9437585733882,8.713165175593996,268
|
||||
BJ835579,9.39823015984007,0.02269698207566754,53.19164027991845,,18.65619071127762,0.3970461969969223,19.81,42.87,33.91891891891892,86.53846153846155,59.45945945945946,0.0,38.095238095238095,20.945945945945947,77.12328767123287,42.249657064471876,8.702977345923085,269
|
||||
SH688037,19.941054904188505,0.02367145279579667,50.244977551474335,4.889089463646455,34.294221226176695,0.31939685707238374,20.86,36.65,9.72972972972973,85.16483516483517,55.81081081081081,58.49858356940509,75.51020408163265,13.378378378378377,74.65753424657534,53.49794238683128,8.693981853177043,270
|
||||
SZ301202,4.362912253634461,0.04434158054249474,33.09323292926247,5.848469458453107,19.31220500957361,0.9303880534048916,39.78,38.14,71.0810810810811,65.7967032967033,26.216216216216214,25.920679886685548,41.36054421768707,97.43243243243244,36.02739726027397,50.06858710562414,8.689841272312398,271
|
||||
SZ002922,5.078158918170245,0.047400605528937996,54.44248619885978,5.304279792181378,15.71006965531008,0.40939364085552,20.52,51.800000000000004,64.05405405405405,63.46153846153846,62.83783783783784,40.65155807365439,31.428571428571427,22.162162162162165,75.47945205479452,29.492455418381347,8.686685603833634,272
|
||||
BJ871981,4.966339670624043,0.032177481764413186,35.512437124062636,,15.64400813679723,0.7840565023225831,51.0,39.38,65.4054054054054,75.82417582417582,30.675675675675674,0.0,31.292517006802722,90.27027027027027,22.328767123287673,48.14814814814815,8.676549420674728,273
|
||||
SH603391,8.662653156819522,0.07130386534871606,27.901792154694228,5.213116262392164,36.54758745519569,0.4695871144385401,28.02,18.28,37.56756756756757,48.901098901098905,17.7027027027027,44.19263456090652,79.8639455782313,32.83783783783784,58.76712328767123,84.22496570644718,8.673078458920166,274
|
||||
SZ300444,8.352004335993879,0.2616082716025027,76.36735420948771,4.83040436219619,16.944761286410497,0.4774565995620189,29.01,20.32,38.51351351351351,17.307692307692314,93.37837837837839,62.3229461756374,33.87755102040816,34.5945945945946,56.986301369863014,79.21810699588477,8.67240843068178,275
|
||||
SH600017,2.8869702075578214,2.5645228337201984,59.591960080381746,4.834861422380394,23.336516753160357,0.4180174962138143,31.75,19.3,83.78378378378379,2.197802197802201,71.48648648648648,61.89801699716714,51.97278911564626,22.83783783783784,50.95890410958904,81.61865569272977,8.669572926776125,276
|
||||
SH688215,8.196398082211807,0.052801504722423745,39.819003152410026,9.496442669512646,32.81955988099299,0.553787062394927,34.1,15.439999999999998,39.72972972972973,59.89010989010989,37.432432432432435,4.674220963172804,73.60544217687075,66.62162162162161,46.16438356164384,87.65432098765432,8.651976121295403,277
|
||||
SZ301382,1.792231188290753,0.02442900010580138,39.151059001115904,6.473856771139453,18.064495484146118,0.6346472090516095,48.67,35.99,93.64864864864865,83.79120879120879,36.351351351351354,18.271954674220957,36.3265306122449,78.91891891891892,25.068493150684933,54.32098765432099,8.645595181329739,278
|
||||
SH603112,3.833405110141948,0.02312538218640803,46.16875013320309,6.598057444904466,23.969820964214385,0.5291522941384234,47.44,45.84,75.94594594594595,86.12637362637363,47.83783783783784,17.422096317280456,53.46938775510204,60.40540540540541,26.164383561643834,37.860082304526756,8.632796848719032,279
|
||||
SZ001339,2.76604860163819,0.023389047170651593,60.25241366495771,6.807046023450669,20.405628447104217,0.5614147227319155,47.24,54.25,85.4054054054054,85.57692307692308,72.97297297297297,16.005665722379604,43.40136054421769,69.1891891891892,26.575342465753426,25.720164609053498,8.632061119451581,280
|
||||
SH688533,7.852366840458508,0.055040394968249085,49.047701559491486,4.832222449250641,20.621187767714215,0.2708206193045874,27.11,47.09,41.486486486486484,58.241758241758234,53.51351351351351,62.03966005665722,44.08163265306123,11.081081081081082,60.95890410958904,36.21399176954733,8.63123082899152,281
|
||||
SZ002414,9.565649382533655,0.053247255039974045,33.74134225014866,7.513411890057013,52.163126021634156,0.8917091738466395,14.3,51.94,32.97297297297297,59.47802197802198,27.7027027027027,11.756373937677056,93.19727891156462,95.67567567567568,91.0958904109589,29.355281207133054,8.617612106556509,282
|
||||
SH600166,2.506579786103378,0.47756834026691336,74.43501436107087,5.789098105826572,10.898178274637647,0.5586680351503533,30.769999999999996,21.69,87.83783783783784,9.340659340659341,91.75675675675676,27.05382436260623,20.680272108843536,68.64864864864865,53.013698630136986,76.54320987654322,8.616532654802304,283
|
||||
SZ300903,4.199464831850484,0.030146173814946012,74.13425496788261,8.148178145091892,6.6334182940515785,0.5690477130977952,38.1,32.18,72.70270270270271,77.88461538461539,90.94594594594595,9.348441926345608,10.476190476190476,70.8108108108108,39.04109589041096,60.35665294924555,8.604518064950197,284
|
||||
SZ001267,6.353405265949435,0.00566930990969681,49.86489559205256,11.962992964381339,19.22387856626956,0.9403031946527733,29.74,49.81,52.702702702702695,98.76373626373626,55.54054054054054,1.9830028328611915,41.08843537414966,98.1081081081081,55.205479452054796,31.961591220850483,8.602477689216261,285
|
||||
SZ300929,13.51728783431432,0.8974136736058806,53.40875164495091,4.223186265799119,34.84528123385795,0.6172386726037762,21.36,53.63,20.270270270270274,5.219780219780223,59.72972972972973,98.15864022662889,77.00680272108843,77.02702702702703,73.83561643835617,26.474622770919066,8.602294827280826,286
|
||||
SH600879,14.668972529879134,0.07892231060259652,47.69685267657574,4.252988430069196,26.610865242076137,0.307796132585097,16.26,35.08,17.83783783783783,45.329670329670336,50.94594594594595,97.59206798866855,60.544217687074834,12.297297297297298,86.7123287671233,55.82990397805212,8.599544449777953,287
|
||||
BJ830964,6.620904070381142,0.02978838204719462,32.5743416130509,,14.525259182901731,0.38784760897522363,14.27,20.32,49.32432432432432,78.70879120879121,25.0,0.0,29.65986394557823,19.594594594594593,91.23287671232877,79.21810699588477,8.597104841716343,288
|
||||
SZ002122,14.547831879601409,0.18288338647227614,34.32318604858615,5.337594713918575,31.00618373106138,0.6566511289703872,18.03,22.79,18.37837837837838,24.03846153846154,28.91891891891892,39.6600566572238,70.74829931972789,81.35135135135135,81.23287671232877,73.86831275720165,8.596141043646103,289
|
||||
SZ002046,9.614442684268766,0.05837103871810334,33.56620682874306,6.731144819564482,29.805462680070494,0.5076034038170755,21.39,26.88,32.7027027027027,55.90659340659341,27.027027027027028,16.713881019830023,67.4829931972789,50.27027027027027,73.6986301369863,68.58710562414267,8.592994799014718,290
|
||||
SZ301607,3.8607892360611498,0.007584862372683682,58.541709290313825,5.0511122893665545,18.403424679511566,0.5,33.44,93.99,75.8108108108108,98.07692307692307,70.0,52.40793201133145,37.27891156462585,42.09459459459459,48.150684931506845,0.9602194787380003,8.58592263879958,291
|
||||
SH600895,1.308133260614639,,67.08686508954571,9.767571258032355,28.358621760152563,0.8497769422987969,60.03000000000001,48.18,96.62162162162163,0.0,85.13513513513513,3.82436260623229,63.8095238095238,94.05405405405406,14.520547945205475,34.70507544581619,8.584788438419437,292
|
||||
SZ002902,7.189243089079206,0.038058712832500924,65.85114713626672,5.345187116699815,8.618809452361093,0.4635463534976204,17.84,42.17,44.729729729729726,71.42857142857143,82.56756756756756,39.09348441926346,14.965986394557824,30.405405405405407,81.64383561643835,43.48422496570644,8.578161949796634,293
|
||||
SZ300214,2.897847149351961,0.1849648292467846,49.0628222571058,4.586813687307745,4.576926832177029,0.5009415429375405,33.28,15.52,83.51351351351352,23.489010989010993,53.648648648648646,79.60339943342775,5.578231292517007,43.513513513513516,48.561643835616444,87.17421124828533,8.576278991347065,294
|
||||
SH688545,3.9087617961670027,0.07865251412964676,28.511406967842245,5.638716417619017,27.331985807048287,0.5,34.04,40.92,75.4054054054054,45.46703296703297,18.91891891891892,30.878186968838527,61.63265306122449,42.09459459459459,46.369863013698634,45.953360768175585,8.568388885249636,295
|
||||
SZ000035,8.867400276658872,6.078622712425948,63.57582377169534,5.56851772108634,34.442104333867356,0.49510821785960624,18.39,18.83,36.48648648648649,0.5494505494505475,79.72972972972973,33.56940509915014,75.91836734693878,38.648648648648646,80.0,82.7846364883402,8.563726152962257,296
|
||||
SH600552,5.466831412774682,0.2153580546196067,60.36493146538183,6.592156351573779,17.740051447204337,0.6263994570238848,21.02,,61.08108108108108,20.741758241758244,73.51351351351352,17.56373937677054,35.23809523809524,78.51351351351352,74.38356164383562,0.0,8.554685217007206,297
|
||||
SZ300395,8.224872355252712,0.042170217842490997,18.38115348381428,10.355514137088246,49.95531869216601,0.77087596166906,27.390000000000004,19.42,39.45945945945945,68.13186813186813,6.621621621621622,3.257790368271951,91.97278911564626,89.1891891891892,60.273972602739725,81.27572016460906,8.547721573430325,298
|
||||
SH603010,7.360911852931505,0.08061556459505065,46.604612665184334,5.085254523257203,19.90756191467282,0.19060665254214468,17.73,19.42,43.91891891891891,43.956043956043956,48.78378378378378,50.70821529745042,42.585034013605444,8.108108108108109,81.91780821917808,81.27572016460906,8.546463867900568,299
|
||||
SZ002243,10.753819309699582,0.1270005576433556,49.339149827495895,4.860861232888882,19.094916286270365,0.6009906864811738,50.61,22.02,27.837837837837842,31.456043956043956,54.32432432432432,60.19830028328612,40.136054421768705,75.94594594594595,23.15068493150685,75.99451303155007,8.545330441913778,300
|
||||
SZ301489,6.376544692016729,0.029370108731543682,32.21457642575412,21.201299293875994,25.73541242008378,0.8658672114336468,57.489999999999995,45.27,52.2972972972973,79.12087912087912,24.594594594594597,0.0,58.36734693877551,94.45945945945947,16.98630136986301,39.43758573388203,8.533421403692575,301
|
||||
SH600330,9.353104162978699,0.0736391915752967,29.979701274646136,5.475777508577764,18.801878156260365,0.5222984404721897,17.62,32.89,34.189189189189186,47.527472527472526,21.08108108108108,35.552407932011334,39.04761904761905,57.432432432432435,82.73972602739725,59.25925925925925,8.51761915430822,302
|
||||
SZ301571,9.99492544391844,0.07245667502233988,26.63940226295209,4.395469850157004,36.06533786108093,0.7923482396786363,72.24,24.71,30.810810810810807,48.07692307692307,16.08108108108108,91.35977337110481,78.77551020408163,90.81081081081082,6.712328767123288,71.46776406035666,8.50772805565264,303
|
||||
SZ300863,2.5449825599290374,0.02653745594332822,56.13919918103338,4.716436736196441,11.818272789341652,0.636381660539879,72.13,62.29,87.43243243243244,81.73076923076923,65.54054054054053,71.24645892351275,22.721088435374153,79.1891891891892,6.849315068493156,17.009602194787377,8.505560761170155,304
|
||||
SZ002649,10.5686154055855,0.02436796516353518,27.685496868474544,5.3447936591578795,19.58018969969162,0.7430498850580338,25.290000000000003,41.5,28.37837837837838,83.92857142857143,17.2972972972973,39.23512747875354,41.76870748299319,87.29729729729729,64.38356164383562,44.44444444444444,8.500093793889464,305
|
||||
SH603729,6.404676603214968,0.0814914903505026,45.67446240698635,4.501453441253555,8.6666027026122,0.5694069319301889,43.85,40.26,51.75675675675675,43.68131868131868,46.89189189189189,84.98583569405099,15.238095238095239,70.94594594594594,30.136986301369863,46.776406035665296,8.49677994041112,306
|
||||
SZ300565,12.045575793364426,0.07334470479965242,62.02590916149755,4.392239283488734,18.62449520327864,0.5879779918750883,32.47,68.11,24.32432432432432,47.802197802197796,76.21621621621621,91.643059490085,37.823129251700685,73.24324324324324,50.273972602739725,12.208504801097398,8.493026642630934,307
|
||||
SZ301611,5.456515318649758,0.022634078425567382,22.438310439191202,5.479427566707686,57.10973578163253,0.6237783591226019,32.12,69.65,61.35135135135135,86.67582417582418,11.351351351351353,35.41076487252125,94.82993197278911,78.37837837837837,50.410958904109584,11.248285322359397,8.480758958536706,308
|
||||
SZ002797,74.41706046982549,,68.18399403673445,4.2659023739261706,,0.4986428533276083,,,0.6756756756756799,0.0,86.08108108108108,97.02549575070822,0.0,40.54054054054054,0.0,0.0,8.471827219835715,309
|
||||
SH603626,8.808637155764343,0.027307997601405346,60.13742666897507,4.153572205442454,4.820140769161529,0.4722017785841618,28.360000000000003,47.57,37.027027027027025,81.18131868131869,72.43243243243244,99.29178470254958,5.986394557823129,33.24324324324324,58.356164383561634,35.5281207133059,8.464666535026291,310
|
||||
SH688728,3.4998267948136292,0.0535788621646259,66.76902660115599,5.609000154919397,20.853051240612093,0.48320576579562224,59.18,39.35,78.78378378378379,59.34065934065934,84.18918918918918,31.58640226628895,44.625850340136054,35.67567567567568,14.7945205479452,48.35390946502057,8.458421666022048,311
|
||||
SZ300655,7.70914056345726,0.13657195190809288,29.59466054811048,4.74188276720628,23.046211942375496,0.6755540344979428,45.52,27.73,42.02702702702703,29.94505494505495,20.54054054054054,69.12181303116147,50.61224489795918,82.83783783783784,28.904109589041095,66.80384087791495,8.443307743674406,312
|
||||
SZ002444,6.220677262967341,0.12612462125046886,22.690956731306848,5.345576938098207,30.305096114402097,0.600846002937356,5.56,48.72,54.32432432432432,31.73076923076923,11.621621621621623,38.951841359773375,69.25170068027211,75.8108108108108,99.45205479452055,33.333333333333336,8.420343379935693,313
|
||||
SZ002137,5.8665967918433495,0.02830263393977449,16.761152858044618,4.80313123180828,23.097553127020575,0.5475892698277343,16.84,73.0,57.432432432432435,80.08241758241759,5.405405405405405,65.01416430594901,51.02040816326531,65.27027027027027,84.38356164383562,9.60219478737997,8.415208746026273,314
|
||||
SZ002953,2.7548541718615707,0.061045062868697084,47.38476802284255,4.300032126290353,11.898423768864392,0.5449724988252731,79.69,42.06,85.8108108108108,54.67032967032968,50.27027027027027,95.46742209631728,22.857142857142858,64.45945945945945,3.28767123287671,43.62139917695473,8.414938278086769,315
|
||||
SZ002036,6.319368297993135,0.3819645922000033,84.7535048309117,4.382350641474055,13.265031359238085,0.6212000076895816,39.77,51.21,53.10810810810811,12.225274725274726,97.97297297297297,92.20963172804532,26.122448979591837,78.10810810810811,36.16438356164383,29.972565157750342,8.406146154098225,316
|
||||
SH688683,6.689572260873228,0.16251471634525902,27.71513735618667,4.5498440330169805,21.750441347320155,0.658389509489254,46.12,22.38,48.24324324324324,26.37362637362637,17.43243243243243,82.01133144475921,46.25850340136054,81.48648648648648,28.08219178082192,75.30864197530865,8.405532581008886,317
|
||||
SH601778,9.72104643564836,3.8589905311819837,63.27561790244876,4.68444778835129,29.87095171519018,0.524938138759492,37.83,37.14,32.2972972972973,0.8241758241758212,79.1891891891892,72.80453257790369,68.02721088435374,58.108108108108105,39.726027397260275,52.12620027434842,8.399046116742722,318
|
||||
SH688246,21.563855206448174,0.039816308262866584,38.17202070685728,6.97021824940892,42.722742050485586,0.48871076667923186,12.48,17.33,7.702702702702702,70.32967032967032,34.054054054054056,14.730878186968843,86.53061224489797,37.027027027027025,94.10958904109589,84.77366255144034,8.377924807020314,319
|
||||
SZ002169,6.238563031180828,0.255041167555015,67.58427187778993,4.997375986788582,16.956665218470427,0.5105945033209968,52.21,22.27,54.054054054054056,18.26923076923077,85.54054054054055,54.39093484419264,34.01360544217687,52.02702702702703,21.232876712328764,75.44581618655693,8.369235311844806,320
|
||||
SH603165,2.061713834773737,0.03320502972983902,48.629857610659144,5.221762669152115,13.49991671915749,0.418738250617257,58.82999999999999,14.41,91.62162162162161,74.58791208791209,52.2972972972973,43.62606232294618,27.2108843537415,22.972972972972975,15.342465753424662,89.30041152263375,8.366069199700519,321
|
||||
SH600956,2.105732976271741,0.472926615469113,66.76630314400046,5.171858975089139,23.618980765118618,0.6189019427316474,62.79,40.83,91.08108108108108,9.615384615384615,84.05405405405405,46.033994334277615,52.51700680272109,77.56756756756756,12.191780821917808,46.09053497942387,8.365238854032285,322
|
||||
SZ000600,3.3100461656464053,0.062354557810413117,61.24013850376434,5.566842381749335,19.237271383562955,0.6198949470877839,37.62,86.67,80.8108108108108,53.84615384615385,75.0,33.711048158640224,41.224489795918366,77.7027027027027,40.410958904109584,2.8806584362139898,8.363778033880964,323
|
||||
SH688757,15.758902787771687,0.01754565879337098,49.192934244093394,5.993423114671945,44.04800070574667,0.5,,,15.810810810810816,90.24725274725274,53.918918918918926,24.079320113314452,87.61904761904762,42.09459459459459,0.0,0.0,8.362710487631265,324
|
||||
BJ832876,2.8739546034475296,0.014882618654214898,38.384340643265276,,14.811372130258233,0.44254476681794974,25.040000000000003,54.25,84.05405405405405,93.26923076923077,34.72972972972973,0.0,30.20408163265306,27.16216216216216,65.06849315068493,25.720164609053498,8.361497197218068,325
|
||||
SZ002331,14.809830464375286,0.16320243974940157,40.19928722223976,4.814310257089385,22.68949099188653,0.4864730498562431,10.2,20.41,17.702702702702698,26.23626373626373,37.83783783783784,64.02266288951841,48.843537414965986,36.21621621621622,96.98630136986301,79.01234567901234,8.35438636709278,326
|
||||
SZ300790,7.171062317745245,0.036249733359831234,54.36673105632992,6.337607872033532,24.086905304201238,0.5251958705694171,47.25,51.16,44.86486486486486,73.21428571428572,62.56756756756757,19.54674220963173,53.74149659863946,58.513513513513516,26.43835616438356,30.315500685871054,8.34807946403001,327
|
||||
SH600621,72.68219242519798,1.560769881377911,83.39157169874429,4.130570368808854,,0.6589924265441253,,,0.9459459459459474,3.0219780219780223,97.56756756756756,99.71671388101983,0.0,81.75675675675676,0.0,0.0,8.332220497486333,328
|
||||
SH603185,5.51958939961628,0.05691156106738374,58.15104340013465,5.975923224806021,5.129270689444039,0.5908740066919193,29.38,43.25,60.67567567567568,57.005494505494504,69.32432432432432,24.362606232294613,6.258503401360545,73.64864864864865,56.16438356164384,41.838134430727024,8.327993863135722,329
|
||||
SZ301235,12.7325731508106,0.029928323131304974,55.065966757945276,17.483224118522543,22.69220815089095,0.56039338129845,26.16,35.28,22.432432432432435,78.15934065934066,63.78378378378379,0.5665722379603388,48.97959183673469,68.91891891891892,62.60273972602739,55.41838134430728,8.323393470082229,330
|
||||
SZ300491,10.461311376297697,0.01588360841129083,46.48625748307646,5.661373773782192,25.992136333227002,0.11949592189687504,22.93,20.16,28.648648648648646,91.75824175824175,48.64864864864865,29.603399433427757,59.31972789115646,4.72972972972973,70.13698630136986,79.42386831275721,8.322481989420258,331
|
||||
SZ300857,1.6144777519553515,0.02933606602665786,65.79655125047562,5.200585972241222,15.956926641026467,0.5071222005110587,69.2,55.230000000000004,95.0,79.25824175824175,82.2972972972973,44.759206798866856,31.97278911564626,50.0,8.356164383561648,24.691358024691358,8.314636930491881,332
|
||||
SZ300024,11.69847186607361,0.297659411955261,61.01044439330252,4.789382777571274,14.63749202416857,0.465632556230653,9.74,23.55,25.540540540540533,15.384615384615385,74.5945945945946,66.1473087818697,29.931972789115648,31.216216216216214,97.67123287671234,72.29080932784638,8.308068125185399,333
|
||||
SZ300912,8.899881143502844,0.04156324433474755,59.660114864981395,4.714183253492025,14.140723437152655,0.5030193040868466,28.71,76.21,36.35135135135135,68.4065934065934,71.75675675675676,71.52974504249292,28.29931972789116,46.75675675675676,57.67123287671233,7.68175582990398,8.304461863466473,334
|
||||
SH603759,18.312122149293266,73.25261048081546,60.2371280399029,5.854574461440568,41.29669753377003,0.7980254689992294,21.75,27.52,11.891891891891893,0.13736263736263687,72.83783783783784,25.77903682719547,85.03401360544217,91.35135135135135,73.01369863013699,67.48971193415639,8.298495122273719,335
|
||||
SH688183,4.375606376592869,0.04454321917804686,44.99989403878973,7.039577053492417,29.838471603172163,0.7238347303824408,60.14000000000001,46.24,70.94594594594594,65.52197802197803,46.08108108108108,14.305949008498587,67.75510204081633,86.08108108108108,14.24657534246575,37.174211248285324,8.28786738158637,336
|
||||
SH688376,8.591086331429656,0.12856904079086692,52.394396690674775,8.764662946001108,29.862060950986535,0.6136070574430836,35.48,30.42,37.83783783783784,31.318681318681318,58.24324324324325,6.373937677053821,67.89115646258503,76.75675675675676,43.97260273972603,62.894375857338815,8.265761779119824,337
|
||||
BJ837092,19.230487398517152,0.013451515771652402,42.69401171107141,,20.589151960419198,0.5284447057264298,29.600000000000005,45.66,10.81081081081081,94.91758241758241,41.891891891891895,0.0,43.945578231292515,60.13513513513513,55.75342465753425,38.47736625514403,8.265145101211756,338
|
||||
SZ000818,5.075210335607537,0.18462503369082228,67.3516189907993,4.795906593956428,18.23482143968294,0.4772782726653655,62.02000000000001,21.33,64.1891891891892,23.62637362637363,85.4054054054054,65.58073654390935,36.734693877551024,34.45945945945946,12.739726027397257,77.36625514403292,8.262601448746576,339
|
||||
SZ300568,8.140426885099702,0.030371885689339906,57.43382707750758,4.860613360522706,25.525740354328004,0.3240661401889207,44.22,50.43,40.27027027027027,77.60989010989012,68.51351351351352,60.48158640226629,58.0952380952381,13.918918918918918,30.000000000000004,31.13854595336076,8.248025406410303,340
|
||||
SH688249,3.448113441654145,0.24817454101034528,46.7535936893311,5.238944816001624,27.249296476448713,0.6935008692415428,38.75,61.31999999999999,79.45945945945945,18.818681318681318,49.18918918918919,43.05949008498584,61.49659863945578,83.78378378378379,38.082191780821915,18.381344307270233,8.245003678632077,341
|
||||
SZ300442,3.3934137040969645,0.0963875881485423,63.55779748358322,4.706693334047681,49.72502216640377,0.4366220671428631,45.26,90.82,80.0,38.46153846153846,79.45945945945945,72.09631728045326,91.70068027210885,25.675675675675674,29.04109589041096,1.5089163237311354,8.24000912671548,342
|
||||
SH603012,14.462372682369296,0.04666219070561033,47.89304377372985,5.652086704562347,48.083026522495345,0.178445160951337,18.35,27.67,18.918918918918916,64.28571428571428,51.21621621621622,30.31161473087819,90.20408163265307,7.297297297297297,80.13698630136986,66.94101508916323,8.235810500493715,343
|
||||
SH600120,9.598393024005663,28.80758577260419,64.83447839642128,5.111447934964613,5.549275681592851,0.8195718173723544,19.14,18.39,32.83783783783784,0.27472527472527375,81.35135135135135,49.71671388101983,7.346938775510205,92.43243243243244,78.69863013698631,83.9506172839506,8.233366103933093,344
|
||||
SZ301313,12.278383645635719,0.06468596387354354,43.52174872293368,7.716502572747354,25.787483020288388,0.5033604138066723,23.73,31.679999999999996,23.91891891891892,52.74725274725275,43.513513513513516,10.906515580736542,58.63945578231292,47.02702702702703,68.21917808219177,61.179698216735254,8.233330552553547,345
|
||||
SZ300862,12.724041447420523,0.030946518924166926,20.236418734818372,4.455456311627535,25.855016974248134,0.3439888411029086,26.119999999999997,19.66,22.567567567567572,77.1978021978022,8.64864864864865,88.24362606232295,58.911564625850346,15.405405405405407,62.73972602739726,80.93278463648834,8.226913497382006,346
|
||||
SZ002110,1.4316247242087263,0.11561106356289567,63.102911614804555,7.162432336059513,5.821389925453348,0.790393832390882,46.05,21.52,95.54054054054055,33.37912087912088,78.64864864864865,13.739376770538247,8.027210884353742,90.54054054054053,28.219178082191775,76.74897119341564,8.221146888572372,347
|
||||
SZ300680,3.518323059098163,0.061293446908460496,50.26243885735339,5.100718513360933,18.121077957584355,0.5187267227292045,53.43,61.15999999999999,78.64864864864865,54.532967032967036,56.08108108108109,50.283286118980165,36.59863945578231,55.81081081081081,19.589041095890416,18.518518518518523,8.213663458128934,348
|
||||
SZ300780,10.042631705265476,0.23778992859802542,45.09340014995076,4.211097565817212,6.780540034568151,0.5475870467893851,27.74,19.69,29.729729729729726,19.368131868131865,46.21621621621622,98.44192634560906,11.156462585034014,65.13513513513513,59.31506849315069,80.79561042524006,8.21151424696691,349
|
||||
SH688685,11.893816791509341,0.14491122246636254,69.70304125073942,4.480928319447879,64.24089184631754,0.845649783299224,62.97999999999999,88.33,25.0,29.120879120879117,87.70270270270271,86.54390934844193,96.4625850340136,93.78378378378378,12.05479452054794,2.3319615912208547,8.19508407909437,350
|
||||
SZ300084,37.78285012053905,0.25571180839598895,38.93741892791075,4.646242970987603,36.161395265527894,0.5062220426791981,16.72,31.679999999999996,3.378378378378377,18.131868131868135,36.21621621621622,75.63739376770539,79.04761904761905,49.05405405405405,84.52054794520548,61.179698216735254,8.191475184722394,351
|
||||
SH600601,4.5360236599512485,0.015558598699321816,43.870926942393304,6.790250509622238,21.90693086595279,0.5033025869403084,40.84,48.61,69.1891891891892,92.17032967032968,44.189189189189186,16.147308781869686,46.93877551020408,46.89189189189189,34.38356164383561,33.470507544581615,8.181125605258227,352
|
||||
SH600418,5.6876427904730855,0.21678987384951545,74.66121115078525,5.772101594065382,10.02509370634511,0.4716232482466558,14.17,28.28,59.189189189189186,20.60439560439561,91.8918918918919,27.3371104815864,18.911564625850342,33.108108108108105,91.5068493150685,65.56927297668038,8.176858205888184,353
|
||||
SZ002947,4.310139011290919,0.014735673075832234,18.07459538549053,5.192817162539353,30.115805088503024,0.8874921211663603,45.67,71.82,71.62162162162163,93.68131868131869,6.486486486486487,45.184135977337114,68.84353741496598,95.54054054054055,28.63013698630137,10.288065843621396,8.159540242711728,354
|
||||
SZ002870,6.903105649497091,0.43308962343290835,66.78996599164398,4.477680880442701,22.706785818072735,0.4921650281552462,18.66,68.34,47.297297297297305,10.851648351648347,84.45945945945947,86.8271954674221,49.1156462585034,37.972972972972975,79.45205479452055,11.934156378600825,8.157249669426431,355
|
||||
SH600226,3.4887532287762526,0.037104676011693,25.109486348989545,5.061205974132626,6.925237266063711,0.5540177704899107,46.52,22.26,79.1891891891892,72.39010989010988,15.0,51.98300283286119,11.292517006802722,66.8918918918919,27.671232876712327,75.58299039780522,8.153671611408422,356
|
||||
SH688629,8.833468902755678,0.07134401659499211,48.69916041302586,7.512704958538171,27.904882118627576,0.5957879820307159,33.88,52.35999999999999,36.75675675675676,48.76373626373627,52.567567567567565,11.898016997167138,62.99319727891156,74.72972972972973,46.84931506849315,28.80658436213992,8.146776843849217,357
|
||||
SH603108,6.261892507829864,0.1819982577617191,61.000621951112066,4.484964327911221,20.77930443705713,0.05884757157746336,42.07,12.23,53.78378378378379,24.450549450549453,74.45945945945947,86.26062322946176,44.48979591836735,1.7567567567567568,32.73972602739727,92.45541838134432,8.143611487249807,358
|
||||
SZ002812,6.972720216609321,0.04868557207617724,44.79432487105712,4.261602412474334,17.14047820707417,0.3069506277615958,28.449999999999996,49.51,46.75675675675676,62.362637362637365,45.40540540540541,97.1671388101983,34.42176870748299,12.162162162162163,58.08219178082192,32.64746227709191,8.143441370747869,359
|
||||
SH688525,4.691332928569041,0.01921370565200956,75.41569111299441,4.292146592038102,1.9864816494159412,0.4425608342689412,62.41,46.71,67.70270270270271,89.14835164835165,92.97297297297298,96.03399433427762,3.1292517006802725,27.297297297297295,12.465753424657533,36.35116598079561,8.142143681534494,360
|
||||
SZ300635,15.337095582449736,0.033086411496249586,71.05027259946796,7.833362050915847,22.64683968315152,0.46374452905735997,31.39,17.98,16.486486486486484,74.72527472527473,88.91891891891892,10.339943342776204,48.57142857142857,30.54054054054054,51.78082191780822,84.36213991769547,8.134969340310953,361
|
||||
SZ300738,2.401099785074123,0.32016017070987063,72.70187744309837,4.922411894992239,31.58456064388356,0.5212238061099144,67.95,56.45,88.51351351351352,14.28571428571429,89.45945945945945,56.94050991501416,71.56462585034014,56.75675675675676,9.452054794520548,23.593964334705074,8.125540088494745,362
|
||||
SZ300482,6.550194893514097,0.10803245857263014,18.68867458248069,5.657900856364597,66.67351769992274,0.467702987114132,24.87,11.5,50.54054054054053,34.34065934065934,7.027027027027027,30.028328611898015,97.27891156462584,32.16216216216216,65.47945205479452,93.4156378600823,8.12524330860602,363
|
||||
SZ300263,4.443883269790447,0.2002093316922992,50.99833084507661,6.853649526993901,21.8034511246323,0.35999109981771454,16.47,13.76,70.0,22.527472527472526,56.75675675675676,15.297450424929181,46.666666666666664,17.16216216216216,85.82191780821917,90.87791495198903,8.113933407316818,364
|
||||
SH603290,3.04656342665432,0.02321063180514217,31.80785348946945,4.8217337958641675,30.37749970812465,0.20624178918707162,60.77,33.47,82.70270270270271,85.98901098901099,23.91891891891892,63.03116147308783,69.52380952380952,8.783783783783784,13.972602739726025,58.29903978052127,8.107511873151282,365
|
||||
SZ002296,6.656068632183014,0.028324120706171147,24.188186699728348,5.246720096578096,68.19887250422,0.5079914362192355,39.75,53.66,48.91891891891892,79.94505494505495,13.243243243243244,42.77620396600567,97.68707482993197,50.67567567567568,36.3013698630137,26.337448559670783,8.104477812568675,366
|
||||
SH603535,5.8674632047632045,0.23389586584228517,43.77494071950672,4.969480247803474,38.75815265150451,0.4967843035780674,49.87,43.52,57.29729729729729,19.505494505494504,44.054054054054056,55.09915014164306,82.99319727891157,39.32432432432432,23.9041095890411,41.49519890260631,8.097058110027806,367
|
||||
SZ301396,1.347570496339494,0.003446309001668033,60.224271246068426,6.057922343704695,11.067472897054786,0.6454996568251458,51.910000000000004,75.33,96.35135135135135,99.45054945054946,72.70270270270271,22.94617563739377,21.08843537414966,79.86486486486486,21.50684931506849,8.367626886145407,8.087216808511663,368
|
||||
SZ300645,14.520559260606522,0.24349142483105232,53.095330049718115,6.116300953125913,42.126035415595965,0.4276895671757493,11.15,13.930000000000001,18.513513513513512,18.956043956043956,59.189189189189186,22.09631728045326,85.71428571428571,24.324324324324326,95.75342465753425,90.53497942386831,8.081092657457647,369
|
||||
SH603213,1.6965028637462976,0.055363851182567404,41.315632634352575,6.024732863248973,12.957351905644742,0.38554203599161785,32.91,13.99,94.72972972972973,57.967032967032964,39.5945945945946,23.512747875354112,25.170068027210885,19.324324324324323,49.863013698630134,90.12345679012346,8.075210402885368,370
|
||||
SH688502,17.092218563212995,0.02192939832147612,20.330828465293806,8.416744963610142,50.48552897926456,0.9369685035883141,21.62,43.49,13.918918918918921,87.22527472527473,9.054054054054054,8.356940509915011,92.51700680272108,97.83783783783784,73.56164383561644,41.70096021947873,8.074422319804759,371
|
||||
SH600733,5.521954074202973,0.9802232695094689,75.08129695316352,4.455269634281126,-7.509330728433494,0.5722570821201476,38.11,34.41,60.54054054054055,4.807692307692313,92.43243243243244,88.38526912181304,1.0884353741496597,71.35135135135135,38.90410958904109,56.65294924554184,8.067259901165858,372
|
||||
SZ002326,13.03592360801307,0.36672118869584913,73.89248777837255,5.530967337664115,18.34463983003176,0.4984339850928436,14.77,21.24,21.89189189189189,12.637362637362637,90.81081081081082,34.27762039660056,37.142857142857146,40.27027027027027,89.38356164383562,77.57201646090535,8.06142271117402,373
|
||||
SH688337,14.511837918124906,0.033206753179330924,17.19949384690421,4.1497996651408,56.147465202300936,0.3515239764345168,34.25,30.879999999999995,18.648648648648646,74.45054945054946,5.810810810810811,99.43342776203966,94.42176870748298,16.62162162162162,45.890410958904106,62.002743484224965,8.05910781341433,374
|
||||
SH688367,8.91886130232559,0.1301549256856185,19.47001490181435,4.59008300274527,30.902498983224756,0.5550763255640788,18.07,56.86,36.08108108108108,31.181318681318682,7.4324324324324325,79.46175637393767,70.47619047619048,67.29729729729729,81.0958904109589,23.04526748971193,8.053569267378435,375
|
||||
SZ300657,2.7605351990284057,0.14671514637045208,78.85434985278852,5.120216266076277,9.301673831473437,0.4676511762290005,27.500000000000004,52.07999999999999,85.67567567567568,28.57142857142857,95.13513513513514,48.86685552407932,16.73469387755102,32.027027027027025,60.136986301369866,29.218106995884774,8.044020092601595,376
|
||||
SZ301508,12.599118359983594,0.19138953219173915,23.45602752865514,5.175308570295848,45.921191505695305,0.6469778783376443,31.620000000000005,24.48,22.83783783783784,23.076923076923073,12.567567567567567,45.892351274787536,89.25170068027211,80.27027027027027,51.23287671232877,71.74211248285323,8.041853162102012,377
|
||||
SH688469,2.2618910391257527,0.10592675550631588,40.62223366753987,4.760780979337396,3.6705791064718247,0.5636091993646716,26.72,53.89000000000001,89.86486486486487,34.89010989010989,38.513513513513516,67.98866855524079,4.625850340136054,69.45945945945947,62.054794520547944,26.06310013717421,8.036753099620357,378
|
||||
SH600138,7.694592188251616,3.096822342056884,51.92815214581115,4.7691940548016625,20.547470887266243,0.4812290006117802,33.6,7.449999999999999,42.16216216216216,1.5109890109890056,57.567567567567565,67.28045325779037,43.80952380952381,35.270270270270274,47.12328767123287,96.98216735253772,8.03525153685313,379
|
||||
SH688386,11.36051625664765,0.13360099331570588,29.339045302489907,6.289882011345291,48.4793458528226,0.5894840905931437,22.8,30.44,26.216216216216214,30.631868131868135,19.864864864864863,19.971671388101985,90.47619047619048,73.51351351351352,70.41095890410959,62.68861454046639,8.027475637726921,380
|
||||
SZ002301,1.7199225679345633,0.8833950735180074,62.84927548929641,5.236452177293833,9.739945228376207,0.4976093665888171,6.22,48.57,94.5945945945946,5.494505494505497,77.7027027027027,43.201133144475925,18.231292517006803,39.86486486486486,99.31506849315068,33.6076817558299,8.010505849631219,381
|
||||
SZ301218,8.91635584363785,0.01729348533140617,38.58779979129795,4.613380576867787,7.688262576579446,0.46510787861185454,25.44,45.82,36.21621621621621,90.38461538461539,35.4054054054054,77.90368271954674,13.333333333333334,31.08108108108108,63.97260273972603,37.997256515775035,8.00086888161589,382
|
||||
SZ000555,3.0378735560535612,0.09748749704805837,58.375596488165904,5.298540644849062,12.760069563985866,0.44659476705675855,55.17999999999999,18.45,82.97297297297297,38.04945054945055,69.5945945945946,40.93484419263456,24.761904761904763,28.10810810810811,18.63013698630137,83.53909465020575,7.9932974527503555,383
|
||||
SZ300017,4.758220861948356,0.026676980930587183,17.96066973182612,4.842988888818806,30.96019067192935,0.5264213673068815,63.25999999999999,48.24,66.75675675675676,81.5934065934066,6.216216216216217,61.47308781869689,70.61224489795919,59.05405405405405,11.64383561643836,34.5679012345679,7.986086196690401,384
|
||||
BJ838924,8.541590517317289,0.015321774702770586,63.225050385053585,,23.115639833277342,0.5011459521854382,39.36,84.1,37.972972972972975,92.71978021978022,79.05405405405406,0.0,51.156462585034014,44.054054054054056,36.84931506849315,3.429355281207136,7.976376874236184,385
|
||||
SZ301500,2.349370008948685,0.4317999813762962,63.13750884414937,5.526591950574821,7.448553855330042,0.617755462738321,13.62,62.62,89.1891891891892,11.126373626373631,78.91891891891892,34.56090651558073,12.789115646258503,77.43243243243244,92.67123287671232,16.32373113854595,7.976308070737238,386
|
||||
SZ002418,4.201344637846276,0.12500594109485103,46.70281967731053,4.670243183427653,8.76756847021401,0.5564892132440303,38.39,57.78,72.56756756756756,32.14285714285714,49.05405405405405,73.79603399433428,15.510204081632653,67.7027027027027,38.49315068493151,22.08504801097394,7.958677059205519,387
|
||||
SZ301066,7.094072240554433,0.11721919861575367,34.35492533309655,7.566424725757976,47.896631554002575,0.4535719858725943,24.72,11.91,45.40540540540541,33.104395604395606,29.054054054054053,11.3314447592068,90.06802721088435,29.054054054054053,65.75342465753424,92.86694101508917,7.954623291461731,388
|
||||
SZ000815,16.517126223734568,0.039988520485932946,42.462731325124054,4.361157836077315,44.30272027331001,0.5013191672183656,50.82,57.09000000000001,14.729729729729735,69.91758241758241,41.486486486486484,93.05949008498584,88.02721088435375,44.5945945945946,23.013698630136993,22.770919067215367,7.954538263123043,389
|
||||
SZ300719,28.25425358837041,0.01987958520061405,38.351669954750015,4.197171388230548,38.2972191560683,0.31613886088015464,16.33,70.12,5.000000000000004,88.46153846153845,34.5945945945946,98.72521246458923,82.44897959183673,13.108108108108107,86.3013698630137,10.836762688614543,7.947395151309299,390
|
||||
SZ301628,5.460079826445922,0.019017274481437543,21.33679309432907,6.067591527971053,29.368411259631756,0.5,53.1,16.84,61.216216216216225,89.28571428571429,10.0,22.6628895184136,65.98639455782312,42.09459459459459,19.863013698630137,85.93964334705075,7.940604575271133,391
|
||||
SZ300364,10.857473962896702,1.4240889666094583,40.45900627726514,5.101229549074146,29.80946217846356,0.49956925124539414,23.62,16.84,27.702702702702698,3.434065934065933,38.37837837837838,50.14164305949009,67.61904761904762,40.945945945945944,68.35616438356165,85.93964334705075,7.932238832927221,392
|
||||
SH688362,7.012109916877615,0.09942870228711291,71.02603768788103,8.623761562196071,14.186806253541448,0.7605934195923265,37.05,37.65,46.216216216216225,37.5,88.78378378378379,7.223796033994335,28.57142857142857,88.51351351351352,40.95890410958904,51.16598079561043,7.928763162095124,393
|
||||
SZ001389,4.534193412712333,0.07206501340008271,41.624556117248105,5.592253783675598,35.191621004890806,0.8341568440622056,63.07000000000001,61.38,69.45945945945947,48.48901098901099,40.27027027027027,32.29461756373938,77.68707482993197,93.24324324324324,11.917808219178083,18.24417009602195,7.925098764449128,394
|
||||
SZ300816,5.4880304892848475,0.09819912778026305,61.277135811740116,5.218908905529683,26.351724028157893,0.5132244350688433,56.21000000000001,66.33,60.945945945945944,37.637362637362635,75.13513513513513,43.90934844192634,60.0,53.37837837837838,18.082191780821923,13.580246913580252,7.924967484393452,395
|
||||
SH688099,2.3717408020269657,0.05491409874762485,13.791621249954359,4.296424512679389,36.226927180881624,0.5939391145912278,87.28,63.190000000000005,88.91891891891892,58.51648351648351,3.3783783783783785,95.75070821529745,79.18367346938776,74.1891891891892,1.0958904109588996,15.500685871056241,7.922909716348572,396
|
||||
SH600255,1.7460067523875196,0.014498381261006062,57.639108186459644,6.367864058433649,7.105333011635824,0.5064649211856633,58.41,38.07,94.1891891891892,94.0934065934066,68.78378378378378,19.263456090651555,11.564625850340136,49.32432432432432,16.164383561643834,50.34293552812071,7.922820600883378,397
|
||||
SZ000619,5.34216226358301,0.2087484796359395,43.74760481856947,4.516932880550807,7.030028244070725,0.4953631386821717,38.68,15.479999999999999,62.027027027027025,21.016483516483518,43.91891891891892,83.9943342776204,11.428571428571429,38.78378378378378,38.21917808219178,87.51714677640604,7.921593090432024,398
|
||||
SH600198,37.24047854385371,0.13478843354113443,78.85409145186809,4.7105142944050655,27.244108933301465,0.5026685333750337,34.37,48.33,3.513513513513511,30.219780219780223,95.0,71.95467422096317,61.36054421768707,45.67567567567568,45.68493150684931,34.293552812071326,7.91402942395711,399
|
||||
SH688072,7.0447629166513055,0.009500242008890682,67.75818841362458,4.826658390627282,19.892254923047762,0.05006481715111111,33.48,62.33,45.945945945945944,96.97802197802197,85.94594594594595,62.74787535410764,42.44897959183673,1.2162162162162162,47.87671232876713,16.735253772290815,7.911597006706534,400
|
||||
SH688096,19.010816946033295,0.0686674724294252,53.35543545831558,6.922669393117224,27.406213317016892,0.7115706326613249,14.39,57.87,10.945945945945946,50.68681318681318,59.5945945945946,15.014164305949008,62.176870748299315,84.72972972972973,90.75342465753424,21.94787379972565,7.902431628005724,401
|
||||
SZ301236,5.348685654711478,0.14142092954451468,53.91135259623765,4.522651918836031,10.320304403238195,0.5392397466264327,53.790000000000006,47.91,61.891891891891895,29.53296703296703,61.08108108108108,83.71104815864024,19.183673469387756,62.972972972972975,19.17808219178082,35.116598079561044,7.902167377745978,402
|
||||
SZ300540,42.46255107105168,0.03678823990887624,43.05118834813607,4.577666223695163,36.493811784533634,0.2639946421545654,23.48,45.56,2.5675675675675635,72.66483516483517,42.567567567567565,80.16997167138811,79.59183673469387,10.675675675675675,68.63013698630137,38.820301783264746,7.901924013850047,403
|
||||
SZ002451,1.2406481948680617,0.05026159081522749,54.27364256614143,4.135530650211538,6.7752053638129945,0.4745237328166097,79.84,44.08,97.16216216216216,60.98901098901099,61.891891891891895,99.57507082152975,11.020408163265307,33.648648648648646,3.150684931506853,40.87791495198903,7.901609085154227,404
|
||||
SH603579,4.927529128275268,0.04958140705895902,38.10338277256069,7.4827812577044615,32.54337558100415,0.3692464909064089,24.24,44.37,65.67567567567568,61.53846153846154,33.91891891891892,12.039660056657219,72.92517006802721,17.972972972972972,66.64383561643837,40.32921810699589,7.899402049469723,405
|
||||
SZ002717,66.74061652781353,0.08160433602348977,91.68578570570828,5.082709762304039,-0.18553576819379655,0.5725686158175686,14.82,37.77,1.3513513513513487,43.543956043956044,99.5945945945946,50.849858356940516,1.7687074829931975,71.48648648648648,89.17808219178083,50.89163237311385,7.893138982700423,406
|
||||
SZ002055,8.180891117180328,0.49764983817187974,73.3841596417464,5.346553843925029,19.580947020340254,0.5581688062989933,,,39.86486486486487,9.203296703296704,90.13513513513513,38.81019830028328,41.904761904761905,68.24324324324324,0.0,0.0,7.892441031730967,407
|
||||
SZ002722,3.9001276705786374,0.07104097007572184,17.681253036166282,4.814510061539814,18.86916097163803,0.4569609117609335,43.76,14.760000000000002,75.54054054054053,49.03846153846154,6.081081081081082,63.88101983002833,39.455782312925166,29.864864864864867,30.410958904109584,88.7517146776406,7.873469034750501,408
|
||||
SZ300571,4.756490402056519,0.29265909903984055,66.2314748249108,4.4389161465363625,14.258951613726556,0.9154209230428688,51.72,79.71,67.02702702702703,15.659340659340659,82.97297297297297,89.37677053824362,28.843537414965986,97.16216216216216,21.780821917808225,6.035665294924552,7.871637208475626,409
|
||||
SH688213,1.7324094990334358,0.049778255255040996,46.24462116360206,5.260916506993353,22.79252086016362,0.5680563433234451,89.33,58.160000000000004,94.32432432432432,61.401098901098905,48.10810810810811,42.067988668555245,49.523809523809526,70.67567567567568,0.6849315068493178,21.536351165980793,7.868113232180962,410
|
||||
SZ002929,1.9612193208941822,0.05042124991961241,66.09186182017065,5.2347028106710844,14.07488630713619,0.3319630961859987,33.28,61.91,92.7027027027027,60.71428571428572,82.70270270270271,43.342776203966004,28.163265306122447,14.45945945945946,48.561643835616444,17.421124828532232,7.859290807980216,411
|
||||
BJ837748,17.44267314518757,0.1473306760328248,38.88092414959649,,27.578806244548232,0.5086082757787179,19.14,40.79,12.702702702702705,28.296703296703296,35.945945945945944,0.0,62.585034013605444,51.21621621621622,78.69863013698631,46.22770919067215,7.856818012717113,412
|
||||
SH600821,6.518029287534677,0.36283132920156824,75.07035080182929,5.556727510233159,50.42256340400246,0.1358610872409185,14.540000000000001,52.57000000000001,51.21621621621622,13.186813186813184,92.29729729729729,33.85269121813032,92.38095238095238,5.405405405405405,90.20547945205479,28.463648834019207,7.854451726197452,413
|
||||
SH688709,23.861476208543596,0.010037471878736014,22.216521986230457,4.4887682675114595,76.8754521908636,0.29087547815850506,41.73,24.9,6.216216216216219,96.7032967032967,11.081081081081082,85.83569405099149,98.77551020408163,11.891891891891893,33.28767123287671,71.0562414266118,7.854278631243603,414
|
||||
SH605289,18.619884653224553,0.286769355783827,42.400296025406405,4.897215924239813,29.641757465595052,0.4878266817427944,18.83,31.679999999999996,11.621621621621625,16.346153846153843,41.351351351351354,58.073654390934834,66.66666666666666,36.62162162162162,79.31506849315069,61.179698216735254,7.853428742308337,415
|
||||
SZ300048,1.0875297387180887,0.05285393719002546,62.36272694584022,5.113831045709869,9.02903793386483,0.5574453334687849,52.28,77.27,97.70270270270271,59.75274725274725,77.16216216216216,49.43342776203966,16.3265306122449,67.83783783783784,21.095890410958905,7.4074074074074066,7.85068197080491,416
|
||||
SH688195,7.634743281152708,0.043949721272683075,24.824821572376123,7.132479390117926,34.58989953568202,0.581009117831139,29.659999999999997,49.91,42.7027027027027,66.62087912087912,14.45945945945946,14.022662889518411,76.32653061224491,72.56756756756756,55.61643835616439,31.68724279835391,7.843666731892112,417
|
||||
SZ002156,2.146174588416078,0.028347207286252857,60.58327969950589,8.526208218323212,13.19660913084572,0.5010474498941667,26.76,68.99,90.54054054054053,79.8076923076923,74.05405405405405,7.648725212464591,25.71428571428571,43.78378378378379,61.917808219178085,11.52263374485597,7.823002650192981,418
|
||||
SZ000727,2.5860050918284454,0.4270957999508843,74.13519976845168,4.515944707830997,9.865108369321671,0.04834052277364254,34.46,27.49,87.02702702702703,11.263736263736268,91.08108108108108,84.13597733711048,18.503401360544217,1.0810810810810811,45.205479452054796,67.76406035665295,7.822059364149398,419
|
||||
SH600126,0.9230220322696511,0.15669711331209593,38.42273355782261,5.178729747740526,1.6186629823484349,0.4148820565631973,14.88,18.94,98.51351351351352,26.785714285714292,34.86486486486486,45.60906515580736,2.9931972789115644,22.56756756756757,89.04109589041096,82.3045267489712,7.820869236141278,420
|
||||
SZ300047,1.6418311196204307,0.444489677649489,52.218708877582124,5.276442230043263,8.057112339323828,0.7767530191939095,76.24,7.79,94.86486486486486,10.576923076923073,57.97297297297297,41.92634560906515,13.741496598639454,89.72972972972974,4.794520547945202,96.84499314128944,7.808839759184495,421
|
||||
SZ300063,1.8207740228791913,0.10194869558410657,46.900233607901576,5.000229308286981,6.107158505488349,0.5173547915662267,66.39,19.91,93.51351351351352,36.53846153846154,49.5945945945946,54.24929178470255,8.843537414965986,55.4054054054054,10.273972602739722,80.38408779149519,7.806689034679076,422
|
||||
SZ001309,2.593892779781367,0.023945086569338164,65.84916429352442,4.66445873441574,5.848752500032352,0.4394714940866346,68.84,51.21,86.75675675675676,84.47802197802197,82.43243243243244,74.36260623229462,8.299319727891156,26.216216216216214,8.904109589041099,29.972565157750342,7.804451380210297,423
|
||||
SZ300593,12.58551244487184,0.036427627003399396,41.591705443546,12.733468662918838,43.66055992857372,0.49541325173490924,14.550000000000002,45.76,22.972972972972972,73.07692307692308,40.13513513513514,1.8413597733711096,87.21088435374149,38.91891891891892,90.0,38.27160493827161,7.799865599618214,424
|
||||
SH688711,5.041632796821068,0.015759003787507466,57.96794015810035,11.487576260711513,16.41928356729473,0.8288242037788605,41.81,66.75,64.86486486486487,91.8956043956044,69.1891891891892,2.2662889518413554,33.06122448979592,92.97297297297298,33.150684931506845,12.894375857338824,7.7972015507821695,425
|
||||
SH688595,12.565826378783672,0.07070040404517221,53.52975273985812,5.221755023586873,37.19119361101962,0.5016852292096292,72.47,36.23,23.24324324324324,49.175824175824175,60.27027027027027,43.76770538243626,81.22448979591836,44.729729729729726,6.301369863013695,53.77229080932784,7.796372905354019,426
|
||||
SH601238,5.682067286385326,2.605150051547251,43.49071249684645,4.761000496846692,0.21208917977338895,0.47880624897463653,9.89,2.86,59.32432432432433,2.060439560439564,43.37837837837838,67.70538243626063,2.312925170068027,34.72972972972973,97.53424657534246,99.31412894375858,7.790682636365348,427
|
||||
SH603209,4.4118403463779705,0.824230440439589,38.533876365579495,5.135744177929005,31.9482393871137,0.47227911773940084,35.96,40.19,70.4054054054054,5.906593406593408,35.13513513513514,48.15864022662889,72.24489795918367,33.37837837837838,42.87671232876712,46.913580246913575,7.778833983453355,428
|
||||
SZ300319,2.8478455553216744,0.06386007615876871,33.12108732410055,6.209681161702951,16.49313381119404,0.5028453133681426,19.42,55.08,84.32432432432432,53.434065934065934,26.351351351351347,21.52974504249292,33.33333333333333,46.08108108108108,77.94520547945206,24.96570644718793,7.773247109543977,429
|
||||
SH688216,6.619959291232911,0.04718937368417261,66.65756223486142,5.609325202487411,-4.547334004075897,0.44836000126890846,33.01,27.839999999999996,49.45945945945947,63.73626373626373,83.78378378378379,31.444759206798867,1.3605442176870748,28.243243243243242,49.45205479452055,66.52949245541838,7.772121082007296,430
|
||||
SZ300811,4.031139877511501,0.010136041375286436,22.056357470357444,7.1577750273571485,37.679071692282854,0.5267133338727789,50.91,47.18,74.05405405405405,96.29120879120879,10.675675675675675,13.881019830028329,82.0408163265306,59.32432432432433,22.876712328767123,35.802469135802475,7.770644235832605,431
|
||||
SH600588,22.808998121753948,0.4692573213543951,59.496997760193835,7.530607741481632,39.06136541319983,0.45493156053054884,3.27,3.55,7.162162162162167,9.752747252747252,71.08108108108108,11.614730878186974,83.26530612244898,29.324324324324323,99.86301369863013,99.039780521262,7.762498932897346,432
|
||||
SZ300642,13.255403867284866,0.0429949034659912,10.327584111173234,5.395617531246671,63.662244098383795,0.7782811933920941,58.70000000000001,26.539999999999996,21.62162162162162,67.3076923076923,2.4324324324324325,37.81869688385269,96.19047619047619,89.86486486486487,15.479452054794518,69.41015089163237,7.759377577903311,433
|
||||
SZ301600,2.251380043926991,0.016006757197830086,22.77414069961615,7.0164319309208265,29.32643922351656,0.7316633904144694,38.06,82.14,90.0,91.62087912087912,11.891891891891893,14.58923512747875,65.71428571428571,86.75675675675676,39.17808219178082,4.526748971193417,7.759287314184163,434
|
||||
SZ300270,43.255322803281764,0.05056230709633337,31.46217876703941,4.739757563334904,30.217691666367596,0.4982976897717894,33.21,39.12,2.43243243243243,60.57692307692308,22.972972972972975,69.26345609065156,69.1156462585034,40.13513513513514,49.04109589041096,48.559670781893004,7.744940947864366,435
|
||||
SH688588,8.034627567179816,0.048120807005822906,26.91924478178495,4.421077467805346,27.089269856890684,0.6956592374297917,43.82,84.02,40.810810810810814,62.77472527472527,16.35135135135135,90.08498583569406,61.08843537414966,83.91891891891892,30.27397260273973,3.566529492455417,7.744604519851426,436
|
||||
SH688575,8.837631416875876,0.07454957713417909,37.24296825401151,5.43301724220269,59.489308671394625,0.15396997174157623,36.35,15.810000000000002,36.62162162162163,46.84065934065934,32.83783783783784,36.26062322946175,95.51020408163265,6.351351351351352,42.32876712328767,86.69410150891632,7.738643852418386,437
|
||||
SH603690,17.427933403892776,0.08056716068035413,64.60168309961367,4.367655086080779,33.89877306112902,0.27981395879760856,27.96,62.66,12.83783783783784,44.09340659340659,80.94594594594594,92.77620396600567,74.96598639455783,11.351351351351353,58.9041095890411,16.18655692729767,7.722806558924267,438
|
||||
SZ002617,5.321237289714194,0.054649908559914605,39.75553078990712,5.504132596797989,23.159186083018106,0.5054657721116999,66.57,53.410000000000004,62.432432432432435,58.791208791208796,37.2972972972973,34.98583569405099,51.29251700680272,48.64864864864865,10.136986301369866,27.160493827160494,7.699653523697062,439
|
||||
SZ002845,3.3403980608530106,0.013176001915684004,68.88522046549409,5.420438055533329,5.988572378101024,0.13106700412176323,25.52,58.21000000000001,80.4054054054054,95.1923076923077,87.02702702702703,37.110481586402265,8.707482993197278,5.27027027027027,63.6986301369863,21.26200274348422,7.696964145951011,440
|
||||
SH603124,0.6122332555261558,0.023364986589113266,55.51253446921004,8.826488897651798,3.6504081289104526,0.5,52.89,21.2,99.45945945945947,85.71428571428572,64.5945945945946,5.9490084985835745,4.489795918367347,42.09459459459459,20.205479452054796,77.91495198902606,7.695820942722644,441
|
||||
SH688605,4.233265955896784,0.02310870750864669,23.11789190640512,4.748238086541435,27.75937242440704,0.5,40.9,83.94,72.2972972972973,86.26373626373626,12.027027027027028,68.98016997167139,62.72108843537415,42.09459459459459,34.10958904109589,3.84087791495199,7.693078588934616,442
|
||||
SZ300789,13.492003029843167,0.005098074510040581,30.258567593110552,8.001265912580326,45.234519760269855,0.5109679890150033,18.33,55.74,20.405405405405407,99.03846153846155,21.62162162162162,9.773371104815865,88.843537414966,52.43243243243243,80.41095890410959,24.142661179698223,7.692019728463897,443
|
||||
SH605277,3.172120632714966,0.06389696524511672,57.29508515029055,11.7002044221106,14.176673095227601,0.6747483600998768,56.279999999999994,39.66,81.48648648648648,53.2967032967033,68.24324324324324,2.1246458923512734,28.435374149659864,82.70270270270271,17.945205479452053,47.7366255144033,7.689846254991943,444
|
||||
SZ300659,36.690286824533096,0.138012401065151,24.64812361885582,5.1568235938214615,72.36410974645294,0.44346625781753657,15.27,13.0,3.6486486486486447,29.670329670329664,14.18918918918919,47.1671388101983,98.09523809523809,27.432432432432428,88.35616438356165,92.04389574759945,7.6819360471330596,445
|
||||
BJ831305,5.647416758065119,0.06028111763319096,40.334117584986515,,33.681940135058476,0.4971816293727854,61.07,55.71,59.72972972972973,55.082417582417584,38.108108108108105,0.0,74.5578231292517,39.45945945945946,13.767123287671234,24.279835390946502,7.680798450124973,446
|
||||
SZ301308,3.0962944457489012,0.06443826104706074,59.95018229811666,5.071096488931646,10.352206276212945,0.3095980849201241,49.99,36.76,82.02702702702702,52.88461538461539,72.2972972972973,51.416430594900845,19.319727891156464,12.432432432432433,23.56164383561644,53.086419753086425,7.678167392490533,447
|
||||
SZ300605,9.916583931140428,0.3534819696604345,66.6125895821715,6.7005276085565555,23.561948910689416,0.5001525653846552,23.84,36.18,31.486486486486488,13.598901098901095,83.37837837837839,16.997167138810198,52.38095238095239,43.108108108108105,68.08219178082192,53.90946502057613,7.676234373013083,448
|
||||
SH603331,6.664469370596522,0.12616841176847382,60.14458099577757,4.551537365742904,21.423866659673457,0.46700667852806793,40.04,70.06,48.64864864864865,31.59340659340659,72.56756756756756,81.72804532577904,45.17006802721089,31.891891891891895,35.61643835616438,10.973936899862824,7.6732651219365495,449
|
||||
SH688138,4.567854335534138,0.05765612836335849,45.78787390474901,5.649591551551995,31.845268965021656,0.522109857475397,73.84,58.099999999999994,68.91891891891892,56.31868131868132,47.2972972972973,30.45325779036827,71.97278911564626,57.2972972972973,6.02739726027397,21.673525377229087,7.673064886034108,450
|
||||
SZ002421,10.663803054213487,2.904715786522572,62.01655201755908,4.9370241923174465,26.83346404896697,0.041149676390792866,10.56,21.49,28.10810810810811,1.6483516483516536,76.08108108108108,56.09065155807366,60.816326530612244,0.13513513513513514,96.57534246575342,76.95473251028805,7.668601225196384,451
|
||||
BJ831961,10.113225058162941,0.6030724244716835,40.83441327973978,,53.72803883539766,0.8673824299989352,58.879999999999995,27.98,29.324324324324323,7.692307692307687,39.054054054054056,0.0,93.46938775510203,94.5945945945946,15.068493150684937,66.11796982167353,7.654589152020293,452
|
||||
SZ300756,20.95643665697395,0.21979861063618739,40.07230818939406,4.815374573182886,31.743151669476305,0.43920859829929887,16.56,32.67,8.513513513513516,20.46703296703297,37.7027027027027,63.73937677053825,71.83673469387755,26.08108108108108,85.20547945205479,59.465020576131685,7.653584149898439,453
|
||||
SZ000060,0.9828281729950137,0.2642253088684701,63.13245009958741,5.568861761558721,5.123336208194822,0.5094415945136079,35.7,36.74,97.97297297297297,17.03296703296703,78.78378378378378,33.42776203966006,6.122448979591836,51.486486486486484,43.42465753424658,53.223593964334704,7.642558413776226,454
|
||||
SZ300925,8.271359749891092,0.0070504012344216275,23.579773482317155,5.4552697688811485,17.779797199524847,0.39318037639739994,23.97,29.799999999999997,39.189189189189186,98.48901098901099,12.837837837837837,36.11898016997167,35.64625850340136,20.27027027027027,67.67123287671232,64.06035665294925,7.623012676177235,455
|
||||
SZ300074,23.591530974966325,0.09544268065154012,34.74147208297752,4.329657961220049,29.714689742688023,0.5263670876068827,67.62,20.93,6.621621621621621,39.28571428571429,29.72972972972973,94.61756373937678,67.07482993197279,58.91891891891892,9.726027397260273,78.46364883401921,7.611895675732587,456
|
||||
SH688004,16.92530752618072,0.03717739717529655,15.747706211349561,8.735405365390072,65.45852814441282,0.5047108817431883,17.26,26.68,14.18918918918919,72.11538461538461,4.594594594594595,6.798866855524077,96.87074829931973,47.83783783783784,83.28767123287672,69.1358024691358,7.611171079413341,457
|
||||
SZ002585,2.727227122191046,0.03115242478257578,32.12174579663545,4.90398150635498,3.85814503722105,0.5110070391560686,76.92,20.01,86.21621621621621,77.06043956043956,24.324324324324326,57.50708215297451,4.8979591836734695,52.567567567567565,4.657534246575345,79.97256515775034,7.6067036613275665,458
|
||||
SH601985,3.931327347113964,0.26636466505364614,68.48473051721824,5.351604037415769,47.864338686730676,0.5149745644628528,48.97,91.93,74.86486486486487,16.89560439560439,86.35135135135134,38.52691218130312,89.93197278911565,54.59459459459459,24.65753424657534,1.0973936899862813,7.595025107996739,459
|
||||
SZ003003,3.915021886421771,0.05144602137598366,24.39117804470476,6.443584918532193,18.57075294455312,0.4650153792871382,26.33,37.9,75.13513513513513,60.30219780219781,13.513513513513514,18.838526912181308,37.68707482993197,30.945945945945947,62.19178082191781,50.480109739369006,7.577602117739243,460
|
||||
SZ002860,3.0932455057829626,0.06150439150294611,37.09980304859481,5.735941668256911,20.32131379635059,0.5775077957302952,44.72,65.23,82.16216216216216,54.3956043956044,32.7027027027027,27.762039660056658,43.12925170068027,72.02702702702702,29.246575342465754,13.991769547325106,7.5762881251204455,461
|
||||
SH688239,6.357987639072303,0.05141254562477468,55.96075366637952,5.212845034940323,26.22886448794541,0.3937210740062709,54.47,60.96,52.56756756756757,60.439560439560445,65.13513513513513,44.3342776203966,59.72789115646259,20.405405405405403,19.041095890410965,18.655692729766805,7.573907354929548,462
|
||||
SH688135,10.375938107390187,0.03891176053583733,56.057368533964315,4.444501090251956,22.779926678623426,0.0460763326354964,50.28,41.17,29.054054054054056,71.0164835164835,65.27027027027027,89.09348441926346,49.25170068027211,0.6756756756756757,23.28767123287672,45.26748971193416,7.570171663677135,463
|
||||
SZ301251,5.623550893014478,0.020001624761910662,39.587578517709346,7.940651048413632,21.01330822218845,0.5481256390323546,43.32,56.04,60.0,88.32417582417582,37.027027027027025,10.056657223796039,44.89795918367347,65.54054054054053,31.36986301369863,23.93689986282579,7.559758274551227,464
|
||||
SZ300592,5.9849992389716835,0.30088710634293087,44.34310838746935,4.406306758266635,31.48222165784472,0.22663775901013192,10.14,79.13,56.62162162162162,15.109890109890111,44.86486486486487,90.6515580736544,71.42857142857143,9.324324324324325,97.12328767123287,6.172839506172845,7.557474186531659,465
|
||||
SH603986,7.140105809561896,0.09380797820957965,12.761139564394389,4.475587119977959,37.44042388798185,0.5151845427871575,70.15,33.23,45.135135135135144,39.83516483516484,2.9729729729729732,87.11048158640227,81.36054421768706,54.864864864864856,7.534246575342463,58.8477366255144,7.551769717744966,466
|
||||
SZ300010,15.21924470110009,2.739489345751005,27.481362561128194,5.11844765217075,62.34726809235715,0.5209969862324109,27.08,15.259999999999998,16.8918918918919,1.9230769230769273,16.89189189189189,49.008498583569406,96.05442176870748,56.62162162162162,61.09589041095891,88.06584362139918,7.54737933754647,467
|
||||
SZ301307,5.85309792002398,0.03146846400565669,57.71287418684638,4.288824004642043,7.623789874029728,0.21202369387835168,37.87,58.62,57.7027027027027,76.78571428571428,68.91891891891892,96.17563739376772,13.197278911564625,8.91891891891892,39.58904109589041,20.30178326474623,7.54604305421491,468
|
||||
SH600804,15.683537626092322,0.5712734384743834,102.70958587593913,,6.625002789479642,0.5019000000923097,8.21,26.400000000000002,15.94594594594595,8.10439560439561,100.0,0.0,10.340136054421768,45.13513513513514,98.63013698630137,69.68449931412894,7.541994122293793,469
|
||||
SH688365,18.41507864146335,0.11699315443957561,44.01937337211275,5.968733658795079,67.10101020640093,0.5338566456325108,58.57,6.72,11.756756756756758,33.24175824175825,44.729729729729726,24.504249291784706,97.41496598639455,61.21621621621621,15.753424657534243,97.53086419753086,7.540922189488282,470
|
||||
SH688359,16.3274428649827,0.1780513434026155,43.22553928894759,5.277098298127772,45.655494577328135,0.3992864769886025,22.34,35.3,15.405405405405403,24.725274725274726,42.83783783783784,41.78470254957507,89.1156462585034,21.216216216216218,71.64383561643835,55.212620027434845,7.536473346082699,471
|
||||
SZ002654,3.1374907349941124,0.15577429726283165,66.87915913534003,5.256524609472555,8.725216587178803,0.36339588316139976,46.48,20.84,81.75675675675676,26.923076923076927,84.86486486486487,42.35127478753541,15.374149659863946,17.43243243243243,27.808219178082194,78.60082304526749,7.5309722057501665,472
|
||||
SH688322,11.821266289515343,0.07640681705090718,10.127239040971215,6.460746870627649,42.12171818840623,0.9594797337362678,17.53,51.53,25.270270270270267,46.15384615384615,2.027027027027027,18.41359773371105,85.578231292517,99.5945945945946,83.08219178082193,29.629629629629626,7.530614358477571,473
|
||||
SH688535,10.420554127429039,0.029903678545458754,24.653680000461403,4.383684447263417,24.922748139084774,0.3678671680516853,53.47,25.17,28.918918918918923,78.2967032967033,14.324324324324325,92.06798866855524,55.374149659863946,17.83783783783784,19.452054794520546,70.91906721536351,7.52812674839372,474
|
||||
SH688223,4.146897120630453,0.1724320983423714,72.72025797223685,5.410998184221189,-3.288884519376376,0.23378540513076615,24.89,18.57,72.97297297297297,25.0,89.5945945945946,37.53541076487252,1.4965986394557822,9.864864864864865,65.34246575342466,83.26474622770918,7.524492466155391,475
|
||||
SZ300548,5.668193617139196,0.06294040784921666,33.19999438153256,7.555723479836717,43.97154533637981,0.9536409721476223,48.42,61.61,59.45945945945945,53.708791208791204,26.486486486486488,11.47308781869688,87.48299319727892,98.91891891891892,25.205479452054792,17.969821673525377,7.499366651181858,476
|
||||
SH688041,1.394004426357988,0.41178546935214033,24.55730984192381,4.490123962327975,61.19493193142854,0.7659814104016803,67.64,98.17,95.94594594594594,11.675824175824179,13.783783783783784,85.55240793201133,95.91836734693877,88.91891891891892,9.589041095890416,0.4115226337448541,7.484258855625621,477
|
||||
SZ300253,9.226695090708112,0.5598209161235931,30.437896050247588,5.6851938295896085,34.46075511456247,0.4358354025791524,15.18,5.62,35.0,8.379120879120883,22.162162162162165,28.89518413597734,76.05442176870748,25.54054054054054,88.4931506849315,98.21673525377228,7.472495911529047,478
|
||||
SZ300284,12.862308282764106,0.10247760816603974,42.912551707388126,6.753641729728459,29.06760269555775,0.3697274921668076,21.78,8.69,22.162162162162158,36.401098901098905,42.16216216216216,16.28895184135978,65.17006802721087,18.10810810810811,72.87671232876713,95.61042524005488,7.461533384018807,479
|
||||
SZ002862,8.988209733914378,0.09389181287729678,33.879008874360665,4.613300545031752,38.24133097363834,0.43809060038463915,30.04,68.15,35.945945945945944,39.697802197802204,27.972972972972972,78.04532577903683,82.31292517006803,25.810810810810807,53.97260273972603,12.071330589849104,7.453169342033904,480
|
||||
SZ300290,20.33616880335332,0.17390838081096038,37.667727980622686,5.202194540289998,33.910569722406755,0.4053685231375654,20.38,20.07,8.918918918918916,24.862637362637365,33.37837837837838,44.61756373937678,75.23809523809524,21.756756756756758,76.02739726027397,79.83539094650206,7.440406673766789,481
|
||||
SH603859,6.391505824927236,0.5599302471946617,31.211604953303222,4.828131890845646,55.10440375125225,0.4311282056127056,38.13,32.5,52.02702702702703,8.241758241758246,22.702702702702705,62.46458923512748,93.87755102040816,25.0,38.76712328767123,59.67078189300412,7.438903025084039,482
|
||||
SH688466,12.083607930622783,0.7802208920042671,47.04116790229227,4.583324656896348,28.130678594635633,0.5351109723723864,28.59,62.73,24.189189189189186,6.043956043956045,49.86486486486486,80.02832861189802,63.26530612244898,61.62162162162163,57.80821917808219,16.049382716049386,7.436191450552702,483
|
||||
SZ000948,2.1103965992332165,0.14445871844529715,68.6267225278288,5.342985263615625,9.671525885143398,0.05116413334546289,34.45,30.049999999999997,90.94594594594595,29.39560439560439,86.62162162162163,39.37677053824362,17.959183673469386,1.3513513513513513,45.342465753424655,63.5116598079561,7.426193283703627,484
|
||||
SZ002362,7.0716298829147055,0.1862780674244847,33.61622309968904,9.24673471329878,44.27302773643464,0.5005273584647154,35.62,6.79,45.54054054054054,23.351648351648347,27.297297297297295,5.240793201133142,87.89115646258503,43.24324324324324,43.6986301369863,97.39368998628258,7.425409955154959,485
|
||||
SZ300782,5.051144370124025,0.014279391400392564,27.994344437808117,4.402581566820012,31.009383966502835,0.26408655617977034,46.79,77.05,64.5945945945946,94.36813186813187,17.972972972972972,90.93484419263456,70.8843537414966,10.81081081081081,26.986301369863007,7.5445816186556875,7.420756069905107,486
|
||||
SZ002848,16.387678129853832,0.0820173377233596,66.70814357173164,5.158810875575538,5.853353734726318,0.5092709540364635,30.3,41.46,15.27027027027027,43.40659340659341,83.91891891891892,47.02549575070821,8.435374149659863,51.35135135135135,53.42465753424658,44.650205761316876,7.413513095553238,487
|
||||
SH600010,2.0321773206124036,0.21993078486928708,59.71885246838761,10.138613437817446,8.250628974371143,0.49028512412596126,23.18,28.22,91.89189189189189,20.329670329670336,71.89189189189189,3.541076487252126,14.14965986394558,37.567567567567565,69.31506849315068,65.84362139917695,7.406573585353055,488
|
||||
SH600168,2.0970249694435243,0.578418677368183,76.69819365066343,5.34981479393651,18.748409784189448,0.4694584046880353,20.15,88.11,91.35135135135135,7.9670329670329725,93.78378378378378,38.668555240793204,38.50340136054422,32.7027027027027,76.57534246575342,2.4691358024691357,7.40249892717248,489
|
||||
SZ300451,19.64777855883443,0.4548386040717853,19.820324787877183,4.658061863530212,55.123153068944596,0.1460976424808253,9.05,8.26,10.135135135135132,10.3021978021978,7.567567567567568,74.92917847025495,94.01360544217687,6.081081081081082,98.21917808219179,96.15912208504801,7.400883752264872,490
|
||||
SH603978,1.366487340932394,0.025449355984704474,56.86340291233898,6.111430035905097,5.334385280894012,0.5995643685990286,61.67,60.73,96.21621621621621,82.96703296703296,67.29729729729729,22.237960339943342,6.802721088435375,75.54054054054053,13.013698630136982,18.792866941015085,7.40006076801671,491
|
||||
SZ301099,3.562263287553819,0.4653962735785269,56.39578874448286,5.00206590971762,13.348141407180425,0.4328774983148248,57.19,11.67,78.24324324324324,10.027472527472526,66.35135135135135,53.966005665722385,26.258503401360546,25.135135135135133,17.397260273972602,93.00411522633745,7.391465055169192,492
|
||||
SH603686,7.0063843825441285,1.5031321573536063,42.56037418475411,4.852867686140974,22.515142393294486,0.4689137553872042,43.66,22.55,46.351351351351354,3.159340659340659,41.75675675675676,61.04815864022663,48.02721088435374,32.432432432432435,30.547945205479454,74.7599451303155,7.388306714922944,493
|
||||
SH688347,4.629912183955201,0.07734476234696523,28.13914297208963,5.586876042085069,17.752879952817853,0.3106558955275956,29.350000000000005,30.09,67.97297297297298,45.74175824175825,18.37837837837838,32.577903682719544,35.51020408163265,12.567567567567567,56.301369863013704,63.37448559670782,7.375279437386346,494
|
||||
SH688227,27.41539659691381,0.0828354663919108,34.46615829255562,5.401173245430657,22.946879822425846,0.5232809766788393,35.92,45.27,5.405405405405405,42.994505494505496,29.18918918918919,37.6770538243626,50.06802721088436,57.83783783783784,43.150684931506845,39.43758573388203,7.374689060133618,495
|
||||
SZ300040,9.294084312487486,0.2875484317637546,64.60315909021904,6.281147509344791,29.266012015328307,0.49861620625283215,15.64,61.5,34.72972972972973,16.208791208791208,81.08108108108108,20.25495750708215,65.4421768707483,40.4054054054054,87.8082191780822,18.106995884773657,7.3720987448415904,496
|
||||
SZ300382,8.155660954677463,0.10081716398830325,56.36736123929482,5.333341501828235,18.9706135336088,0.44133856304672414,47.78,59.36,40.0,37.08791208791209,66.21621621621621,39.94334277620396,39.86394557823129,26.486486486486488,25.616438356164384,19.615912208504803,7.371346217060493,497
|
||||
SZ300691,11.987206876887933,0.0134843015489502,47.06677350201839,4.729245205220344,27.560792540994633,0.04362485255413895,37.25,56.8,24.5945945945946,94.78021978021978,50.0,70.6798866855524,62.44897959183674,0.40540540540540543,40.821917808219176,23.3196159122085,7.363262403992018,498
|
||||
SZ002037,11.377262049448026,0.20696409707287658,83.26721436308513,12.791380579940684,16.578328182817344,0.5128889511092084,15.28,36.92,26.08108108108108,21.42857142857143,97.2972972972973,1.5580736543909346,33.46938775510204,53.24324324324324,88.21917808219179,52.81207133058985,7.358617754136891,499
|
||||
SZ002079,3.153908565632922,0.009209859239032196,24.993324024383913,5.021690122052913,10.748265037819413,0.9325143010007845,71.44,64.88,81.62162162162161,97.25274725274726,14.72972972972973,53.54107648725213,20.54421768707483,97.56756756756756,6.986301369863012,14.128943758573387,7.355608981582455,500
|
||||
SH688299,11.259513783713231,0.09083038200840156,36.9395529899926,4.988058439896573,29.918076500455715,0.5523523681923348,74.31,44.34,26.486486486486484,40.52197802197802,32.432432432432435,54.6742209631728,68.29931972789116,66.08108108108108,5.616438356164388,40.46639231824417,7.354955529304834,501
|
||||
SH600156,7.450853685494123,0.25031354392730987,54.27615925827476,4.245766849561913,4.261844525377557,0.5028255338178585,23.32,55.25,43.513513513513516,18.543956043956044,62.027027027027025,97.73371104815864,5.170068027210884,45.94594594594595,68.9041095890411,24.554183813443075,7.351185789087559,502
|
||||
SZ002047,19.273479517506033,0.1463076182416636,101.96656477817811,5.1620501942599315,9.048313285055105,0.527212187162519,11.04,58.550000000000004,10.540540540540544,28.708791208791208,99.86486486486487,46.74220963172805,16.462585034013603,59.45945945945946,95.89041095890411,20.576131687242793,7.349260086667385,503
|
||||
SH605058,5.413636887871156,0.04851232220504311,33.53202324710177,5.304778253312157,22.140778183974756,0.5531700569830003,69.32,57.91,61.621621621621614,62.637362637362635,26.891891891891888,40.509915014164314,47.48299319727891,66.35135135135135,8.21917808219178,21.810699588477366,7.335311174596437,504
|
||||
SZ300374,10.45070016194288,0.05206390734316946,78.90662552327909,5.632422377117826,1.3279886699125696,0.5365524891705374,16.62,72.4,28.78378378378378,60.164835164835175,95.27027027027027,31.01983002832861,2.7210884353741496,62.29729729729729,85.06849315068493,9.739368998628262,7.331732085877489,505
|
||||
SZ003043,7.160296536732204,0.13678613893639985,32.06082373361863,4.5906267905028875,27.95058246667521,0.1996558816955293,19.41,53.56000000000001,44.99999999999999,29.807692307692314,24.054054054054056,79.3201133144476,63.129251700680264,8.378378378378379,78.08219178082192,26.611796982167355,7.318835300550837,506
|
||||
SZ000737,0.8985337296304985,0.2883954512609986,64.87671490106719,6.0531267613673325,10.423158440015502,0.5207338810629456,52.89,36.94,98.64864864864865,16.07142857142857,81.48648648648648,23.37110481586402,19.591836734693878,56.351351351351354,20.205479452054796,52.674897119341566,7.3182575861735355,507
|
||||
SZ002189,14.339274136120048,0.02604355609172392,74.32518307367188,4.734444239595673,0.9671482385359708,0.07137141402062512,27.63,38.81,19.189189189189193,82.28021978021978,91.21621621621621,70.11331444759207,2.585034013605442,2.2972972972972974,59.58904109589041,49.24554183813443,7.315025356707505,508
|
||||
SH688692,9.69037306662931,0.00530455085475673,8.305982790748537,5.685442509986262,96.92307546225341,0.8777411807037642,75.89,53.27,32.567567567567565,98.9010989010989,1.2162162162162162,28.753541076487256,100.0,95.0,4.93150684931507,27.503429355281206,7.302283658714257,509
|
||||
SZ300071,12.54887341148064,0.0568797392996577,87.12591823183853,5.88257858603255,24.94189026967436,0.4084056974439639,31.019999999999996,58.58,23.378378378378383,57.14285714285714,98.37837837837839,25.637393767705387,55.646258503401356,22.027027027027028,52.53424657534247,20.438957475994513,7.301764602047961,510
|
||||
SZ002429,1.8818212295847736,0.08518649432785712,42.98699180766736,5.503656879166206,18.335067115363998,0.37814596377757154,37.88,52.72,93.10810810810811,42.582417582417584,42.432432432432435,35.12747875354108,37.006802721088434,18.783783783783782,39.45205479452055,28.257887517146774,7.297908574258189,511
|
||||
SH688030,19.358669264176413,0.026472446905998082,55.17796398841609,5.341121692276381,68.29343791280652,0.5020539023665477,47.65,79.81,10.40540540540541,81.86813186813187,63.91891891891892,39.51841359773371,97.82312925170068,45.54054054054054,25.753424657534254,5.898491083676271,7.294163143977807,512
|
||||
SZ301183,5.285216043237578,0.004990049145561929,31.79779565938893,8.611080771296509,26.446447056583526,0.5491197743677879,40.08,66.99,62.83783783783784,99.17582417582418,23.64864864864865,7.365439093484416,60.27210884353742,65.67567567567568,35.47945205479452,12.48285322359396,7.29201782428045,513
|
||||
SH688609,4.125704484613311,0.03246974261596666,75.29768595007079,4.733585315318301,7.270804222635788,0.14897663441759965,38.49,77.91,73.1081081081081,75.68681318681318,92.7027027027027,70.25495750708215,12.108843537414966,6.216216216216217,38.35616438356164,6.995884773662553,7.289985529263714,514
|
||||
SZ002965,4.045725347053121,0.022848922815233354,45.86398690530009,8.822307009432006,14.025720670856373,0.34983588520448494,17.67,54.02,73.91891891891892,86.4010989010989,47.7027027027027,6.090651558073656,28.027210884353742,16.35135135135135,82.46575342465754,25.92592592592593,7.289386120801515,515
|
||||
SZ300957,12.436014777432755,0.08768823002425825,18.392650063528887,4.54092236054208,77.47120498953824,0.18511783224581851,42.05,18.93,23.513513513513516,41.75824175824175,6.756756756756757,82.86118980169972,98.91156462585035,7.972972972972974,32.87671232876712,82.44170096021948,7.285239397070201,516
|
||||
SZ300155,27.757469893207155,0.06956967019514923,10.209203737299653,4.484987740896408,37.629869369094095,0.1920935697865132,29.94,13.019999999999998,5.135135135135139,50.27472527472527,2.2972972972972974,86.11898016997166,81.9047619047619,8.243243243243244,54.58904109589041,91.90672153635117,7.284381871937757,517
|
||||
SZ300762,11.934863073168373,0.20814350989478156,34.99561761213066,4.8607863125786865,37.56450360615929,0.5537930318894551,31.52,69.79,24.864864864864867,21.291208791208792,29.864864864864867,60.3399433427762,81.7687074829932,66.75675675675676,51.369863013698634,11.111111111111116,7.273580799030687,518
|
||||
SZ301027,19.92191042658154,0.3974585247981867,53.459632468112936,6.678086504933134,36.01563108452082,0.5398188046847123,40.32,13.98,9.864864864864863,11.813186813186816,60.0,17.13881019830028,78.63945578231292,63.108108108108105,35.2054794520548,90.26063100137173,7.273050403905787,519
|
||||
SZ300909,11.470925681947863,0.09610832977727539,34.205186461741704,5.378620863895101,25.18849938310882,0.25803738053565756,27.05,38.82,25.945945945945947,38.873626373626365,28.783783783783782,38.243626062322946,56.326530612244895,10.27027027027027,61.36986301369862,49.10836762688614,7.267698115653928,520
|
||||
SZ002494,11.087730811355625,0.3226679192002081,26.303978352913017,4.2604261565253365,32.8149079721954,0.488170729388406,58.63,9.86,27.297297297297295,14.148351648351653,15.81081081081081,97.30878186968839,73.46938775510205,36.75675675675676,15.616438356164386,94.92455418381344,7.258836845586698,521
|
||||
SZ000829,0.35600784485120474,0.432006079729162,86.9534519030427,4.559731315150439,2.6599582311306587,0.0963821088902351,61.309999999999995,21.13,99.86486486486487,10.989010989010994,98.24324324324324,81.01983002832861,3.537414965986395,3.6486486486486487,13.561643835616444,78.05212620027436,7.2513961113620065,522
|
||||
SH688276,18.92583318447179,0.278672884595805,21.243961483492907,4.7709216417150975,85.2660104764995,0.3982182685438086,28.99,8.78,11.486486486486491,16.483516483516482,9.72972972972973,67.13881019830028,99.31972789115646,21.08108108108108,57.12328767123287,95.47325102880659,7.249809130318763,523
|
||||
SH688170,14.610470984411942,0.015254878327885754,31.66175693972086,10.576939289664809,43.34252312048417,0.2034435602915715,20.74,25.670000000000005,17.97297297297298,92.9945054945055,23.37837837837838,2.6912181303116123,86.80272108843538,8.513513513513514,75.06849315068493,70.37037037037037,7.246896196056778,524
|
||||
SZ300042,4.066371144177683,0.027894885717149945,13.380303416324002,4.274904897797887,5.29260726028088,0.1203571078410454,39.13,21.22,73.51351351351352,80.35714285714286,3.2432432432432434,96.74220963172804,6.666666666666667,4.864864864864865,37.12328767123287,77.77777777777779,7.244902969106986,525
|
||||
SH603956,36.46103282884902,0.25995849284323935,35.489762893636275,5.66217070169539,46.110639466205825,0.4846020128073047,21.99,15.340000000000002,3.9189189189189233,17.719780219780223,30.54054054054054,29.461756373937675,89.52380952380953,35.945945945945944,72.46575342465754,87.92866941015089,7.238922557211613,526
|
||||
SZ301428,9.398325560690571,0.06989894314280984,48.345035660961756,5.212734033010136,25.544150115592146,0.36446758898317294,21.34,81.46,33.78378378378378,50.0,51.75675675675676,44.475920679886684,58.23129251700681,17.7027027027027,73.97260273972603,4.80109739368999,7.232586442154542,527
|
||||
SZ300731,6.397394902097971,0.05624042899821594,45.61212760860577,9.758313416743793,17.69094739543831,0.8842408446617203,33.24,64.13,51.891891891891895,57.692307692307686,46.48648648648649,3.966005665722383,35.10204081632653,95.27027027027027,48.76712328767123,14.40329218106996,7.215713261091629,528
|
||||
SZ002210,16.044572260049335,,63.6675586641327,4.8313629283564055,29.65776768704405,0.4249343351784965,29.549999999999997,79.96,15.540540540540537,0.0,80.0,62.18130311614731,66.80272108843538,23.91891891891892,55.958904109589035,5.7613168724279795,7.202489928880755,529
|
||||
SH600995,5.1788880320605,1.3237922676438822,52.08728538932939,4.785290876451471,51.40533047395006,0.584507844372777,61.63000000000001,99.36,63.51351351351351,3.8461538461538436,57.7027027027027,66.43059490084985,92.92517006802721,72.97297297297297,13.15068493150685,0.137174211248281,7.192963771578658,530
|
||||
SH688529,10.010524169081735,0.0503558183461506,70.97130024296861,5.841140110840025,18.78358384898205,0.08361337080770799,29.07,44.67,30.405405405405407,60.85164835164836,88.64864864864866,26.487252124645888,38.91156462585034,3.1081081081081083,56.849315068493155,39.91769547325102,7.184456633600291,531
|
||||
SZ002498,2.994329213554942,0.036492210814675595,29.73510510373083,5.302044973957819,13.554405873010941,0.32362360461075174,57.879999999999995,19.27,83.37837837837839,72.93956043956045,20.81081081081081,40.79320113314447,27.61904761904762,13.783783783783784,16.57534246575343,81.75582990397805,7.182620944835927,532
|
||||
BJ831167,4.861926876879194,0.05208802222950235,58.975712051199636,,14.469665894045336,0.41900685961924017,40.5,72.17,65.94594594594594,60.027472527472526,70.4054054054054,0.0,29.38775510204082,23.10810810810811,34.93150684931506,10.013717421124824,7.181643472885886,533
|
||||
SZ002307,5.627754094274445,19.973354532799107,91.0881897750799,6.429023238531427,17.782852416454233,0.28680692716684614,13.73,36.24,59.86486486486486,0.4120879120879106,99.32432432432432,18.98016997167139,35.78231292517007,11.621621621621623,92.32876712328768,53.635116598079556,7.17292497213614,534
|
||||
SZ300873,5.6167410253930505,0.3776375447436831,31.447464509768707,5.526151983724707,24.01133861793534,0.5058704952572679,25.920000000000005,57.57,60.13513513513513,12.362637362637363,22.83783783783784,34.70254957507082,53.605442176870746,48.78378378378378,63.01369863013699,22.359396433470515,7.171589173270846,535
|
||||
SZ000801,6.407216629678499,0.01600797131467799,52.692631324699725,7.25239640353182,17.940220384351043,0.15527662899106062,16.69,59.21999999999999,51.62162162162163,91.48351648351648,58.78378378378378,13.31444759206799,36.054421768707485,6.486486486486487,84.65753424657534,19.753086419753085,7.170655998783015,536
|
||||
SZ002134,6.183450285705104,0.28928768010218653,62.41274087465464,4.596347383732102,10.972898039934947,0.3420378692104988,29.109999999999996,53.22,55.00000000000001,15.934065934065933,77.29729729729729,78.89518413597733,20.816326530612244,15.135135135135137,56.71232876712329,27.70919067215364,7.1619532068801375,537
|
||||
SH688418,10.472132167498586,0.16924507176180736,43.088276489413744,6.445610754772177,50.021087276859596,0.3899286434830078,29.87,32.15,28.513513513513512,25.412087912087912,42.7027027027027,18.696883852691215,92.10884353741497,19.864864864864863,55.00000000000001,60.49382716049383,7.161471610558621,538
|
||||
SZ002943,16.479197154558463,0.05724849045272409,72.54873388940315,4.950552883125483,9.469673714632457,0.4178501306780351,31.670000000000005,48.5,14.864864864864868,56.86813186813187,89.32432432432432,55.524079320113316,17.414965986394556,22.702702702702705,51.0958904109589,34.01920438957477,7.1425890373773315,539
|
||||
SZ000681,16.4297678978922,0.3825577012127586,16.384541450446555,6.246744305374369,44.389370243389955,0.5814339203809453,18.19,23.32,15.000000000000002,11.950549450549453,5.27027027027027,20.82152974504249,88.29931972789116,72.70270270270271,80.89041095890411,73.11385459533608,7.132566951840177,540
|
||||
SZ001270,7.672457653764017,0.027407473072459148,7.756281811328818,4.928474967879899,75.3822933312461,0.8372221315374062,89.39,80.69,42.432432432432435,80.76923076923077,0.8108108108108109,56.657223796033996,98.36734693877551,93.37837837837839,0.5479452054794498,5.349794238683126,7.128630719079529,541
|
||||
BJ870199,6.55204357002182,0.06417558969111826,22.412034163527434,,34.44041393260447,0.17783110741330432,19.94,50.019999999999996,50.40540540540541,53.02197802197802,11.216216216216218,0.0,75.78231292517007,7.027027027027027,76.98630136986301,31.412894375857338,7.1267072746266305,542
|
||||
SZ300798,6.030450257298323,0.056643733827870815,33.66797442813198,4.974755363272106,11.62354753158399,0.14299286830404487,41.83,24.41,56.21621621621622,57.55494505494505,27.432432432432428,54.81586402266289,22.585034013605444,5.810810810810811,33.013698630136986,71.94787379972564,7.120774750778246,543
|
||||
SH688333,10.725852730965055,0.03735546989926812,37.95142936006602,5.492702479456871,36.93979300229903,0.07143031183678743,31.209999999999997,47.44,27.972972972972975,71.84065934065934,33.648648648648646,35.269121813031155,80.95238095238095,2.4324324324324325,52.19178082191781,35.66529492455418,7.118575387745328,544
|
||||
SH688385,4.274856716088349,0.10358647555463874,27.54717741605166,5.840194430846835,58.13524663815465,0.42502101952831256,48.94,37.24,71.89189189189189,35.85164835164834,17.16216216216216,26.62889518413598,94.96598639455782,24.054054054054056,24.794520547945208,51.98902606310014,7.115303403332993,545
|
||||
SZ300818,17.122599041572702,0.03900796309117703,36.073472725826235,4.857164406526495,36.57787433469791,0.39471362591619114,37.26,58.19,13.783783783783788,70.87912087912088,31.216216216216214,60.76487252124646,80.1360544217687,20.675675675675677,40.68493150684932,21.399176954732514,7.10847501773723,546
|
||||
SZ002214,26.54177253398114,0.02540757503170326,31.5703846772898,5.164638759525828,6.341476905834603,0.5119220403707625,22.14,34.8,5.675675675675674,83.10439560439559,23.243243243243246,46.45892351274787,9.659863945578232,52.972972972972975,72.1917808219178,56.1042524005487,7.1052250301801685,547
|
||||
SZ301205,6.139163285881866,0.07394698364430867,34.69353393974606,8.868308679139583,25.14037189516534,0.7621105315653933,35.25,63.35000000000001,55.67567567567567,47.11538461538461,29.594594594594593,5.6657223796034,55.91836734693878,88.64864864864866,44.24657534246575,15.36351165980796,7.099821804218739,548
|
||||
SH603598,0.8714633521480111,0.10397225527505802,90.15975065783249,6.2499321832229935,3.6741015616350197,0.4886843344821827,83.44,21.73,98.91891891891892,35.57692307692307,99.05405405405405,20.538243626062325,4.761904761904762,36.891891891891895,1.6438356164383605,76.40603566529492,7.098068945596513,549
|
||||
SZ300068,6.663672956411311,0.03846634598787236,81.14118613954479,4.893825093823304,2.1824248082755195,0.11841946780301316,47.88,37.81,48.78378378378378,71.29120879120879,96.08108108108108,58.21529745042493,3.2653061224489797,4.45945945945946,25.479452054794514,50.685871056241425,7.0815732699818765,550
|
||||
SZ002309,17.090180655491743,0.15383682818234884,67.70180556077415,5.292542115545639,7.1921195844549715,0.6163217099450723,33.99,44.71,14.054054054054054,27.472527472527474,85.8108108108108,41.21813031161473,11.83673469387755,76.8918918918919,46.57534246575342,39.78052126200274,7.077720549401299,551
|
||||
SZ301067,9.174177086385424,0.06685835414041413,27.898946193113794,10.511864907899303,19.95090205306682,0.9380860184411529,17.69,53.53,35.13513513513513,51.64835164835164,17.56756756756757,2.9745042492917873,42.72108843537415,97.97297297297297,82.1917808219178,26.88614540466392,7.0694383397444245,552
|
||||
430300,18.956411487516856,0.2256162288890794,49.26341547208151,,30.838278019177196,0.5047483903481308,39.12,47.11,11.351351351351347,19.917582417582413,54.054054054054056,0.0,70.20408163265306,47.97297297297297,37.26027397260274,36.008230452674894,7.069046796365288,553
|
||||
SZ300706,3.444890795577773,0.04296628304041423,60.951627076690365,18.34842307110265,5.752963461271027,0.4945930844900801,49.55,31.08,79.5945945945946,67.44505494505495,74.32432432432432,0.4249291784702569,7.6190476190476195,38.37837837837838,24.383561643835616,61.865569272976686,7.06173078500267,554
|
||||
SZ300264,7.577246300044233,0.1340251550725416,87.79038282275232,7.42599744552352,25.16166254809408,0.7869695149812684,44.71,89.34,42.972972972972975,30.494505494505496,98.51351351351352,12.464589235127477,56.054421768707485,90.4054054054054,29.452054794520542,1.9204389574759895,7.056651369943748,555
|
||||
SZ000523,2.762789263074162,0.3017704716613345,39.25553268924065,4.394086615430814,12.65788210883214,0.4510181374975175,57.47,37.07,85.54054054054055,14.835164835164838,36.486486486486484,91.5014164305949,24.353741496598637,28.783783783783782,17.12328767123288,52.53772290809328,7.050896413552913,556
|
||||
SZ301633,21.202317915953344,0.02100398602006309,29.88448561551451,8.733317407194638,35.4466299194763,0.5,20.39,46.42,8.243243243243247,87.63736263736264,20.945945945945947,6.940509915014159,78.36734693877551,42.09459459459459,75.89041095890411,36.762688614540465,7.049162163351037,557
|
||||
SH688027,108.01095122134478,0.3037699101754681,8.562555395941844,4.370073653033711,38.81759969689958,0.6172568273617992,20.45,54.400000000000006,0.40540540540540126,14.560439560439564,1.4864864864864866,92.63456090651559,83.12925170068027,77.16216216216216,75.75342465753425,25.377229080932786,7.044884436972505,558
|
||||
SH688226,2.6186091025730573,0.053969674109081114,62.93640708366848,5.817845155441684,11.32749491629429,0.3495060772635855,52.78,47.65,86.48648648648648,59.065934065934066,78.10810810810811,26.912181303116146,21.904761904761905,16.216216216216218,20.410958904109588,35.25377229080932,7.041519283609033,559
|
||||
SH688403,4.4177406553863605,0.04324536050747405,30.344657492640252,6.304580181438935,23.955562579742885,0.8387178073825702,61.07,66.37,70.27027027027026,67.03296703296704,21.756756756756758,19.830028328611892,53.333333333333336,93.51351351351352,13.767123287671234,13.44307270233196,7.040899846282843,560
|
||||
BJ830809,3.0741023231860884,0.039872957933568653,62.956764448915735,,1.4430294942893016,0.5551101699449634,70.82,71.0,82.2972972972973,70.1923076923077,78.24324324324324,0.0,2.857142857142857,67.43243243243244,7.260273972602738,10.562414266117969,7.039498322499379,561
|
||||
SH601108,71.3424156089615,,73.6192690016416,4.448368350631638,,0.22372596171309378,,,1.0810810810810811,0.0,90.4054054054054,88.81019830028329,0.0,9.054054054054054,0.0,0.0,7.034515039984196,562
|
||||
SH600355,25.334459826685503,0.05004770643663666,49.02933984737332,5.185485636634129,29.381686785703398,0.4416863355975337,60.089999999999996,37.35,5.94594594594594,61.26373626373627,53.37837837837838,45.46742209631728,66.12244897959184,26.756756756756754,14.383561643835618,51.71467764060357,7.0298174167637635,563
|
||||
SZ300143,9.71924366668474,0.36613848593038706,29.225758386482052,5.101296651203402,26.309652196313575,0.5258824023460431,58.52,6.14,32.432432432432435,12.774725274725274,19.72972972972973,50.0,59.863945578231295,58.648648648648646,15.890410958904111,98.079561042524,7.025899716496088,564
|
||||
SH688655,10.004586788263222,0.016471640922256062,41.87735782510951,4.72724242588386,19.00531045930947,0.08550557367064834,55.88999999999999,38.4,30.54054054054054,91.07142857142857,40.67567567567568,70.8215297450425,40.0,3.2432432432432434,18.356164383561648,49.65706447187929,7.02439183995248,565
|
||||
SZ002428,7.069140180546637,0.41606563000589936,56.53434625017457,7.317393238898487,25.217372824448304,0.5959257018836773,52.73,42.01,45.67567567567568,11.401098901098905,66.48648648648648,12.889518413597735,56.734693877551024,74.86486486486487,20.547945205479458,43.75857338820302,7.015923355666664,566
|
||||
SZ001266,6.908011858344911,0.025626280487321153,38.84906914624847,6.071555965339934,21.490189615726994,0.7232550012885641,49.73,86.7,47.16216216216216,82.55494505494505,35.810810810810814,22.521246458923518,45.57823129251701,85.94594594594595,24.10958904109589,2.7434842249657088,7.01008655066253,567
|
||||
SH603068,2.4747493982327913,0.1863682724714089,8.41248623885688,4.4192007853373365,28.461145985278513,0.955987397603714,81.9,80.85,88.10810810810811,23.214285714285708,1.3513513513513513,90.36827195467421,64.08163265306122,99.45945945945947,2.465753424657535,5.212620027434845,7.008678190937399,568
|
||||
BJ837212,5.290722417282023,0.04866895030709668,24.134560852343622,,11.536710522633244,0.9494483043435538,37.66,71.66,62.70270270270271,62.5,13.108108108108107,0.0,22.312925170068027,98.64864864864865,39.863013698630134,10.42524005486969,7.0081848363427675,569
|
||||
SH688503,0.9429581262528951,0.10316885208451222,46.47179423291507,4.779404357871527,6.330571034732049,0.5357306230838569,79.39,53.27,98.24324324324324,35.98901098901099,48.37837837837838,66.57223796033995,9.523809523809524,61.891891891891895,3.698630136986303,27.503429355281206,6.989900434162089,570
|
||||
SZ002015,5.437109726463348,3.6270535014678207,66.2319932920501,6.121090408221693,23.298750402676536,0.5708421557565244,52.52,49.71,61.48648648648649,0.9615384615384581,83.1081081081081,21.954674220963177,51.83673469387755,71.21621621621622,20.821917808219183,32.23593964334705,6.986420863219752,571
|
||||
SZ300208,68.01137457283805,,95.99935407360364,,58.855406108878185,0.49637087176667105,96.12,98.1,1.216216216216215,0.0,99.72972972972973,0.0,95.23809523809523,39.054054054054056,0.0,0.5486968449931462,6.980874089337713,572
|
||||
SZ300109,11.16933599042324,0.22922123229380414,18.034608780034432,4.4970914060774,44.072001569155,0.45420889743001985,60.23,12.44,27.027027027027028,19.780219780219777,6.351351351351352,85.12747875354107,87.75510204081633,29.18918918918919,14.109589041095894,92.31824417009602,6.97440496993892,573
|
||||
SH603045,1.8958079508049646,0.015549405879255193,64.58271453709969,5.7337241162423265,6.250397847687937,0.14191552963722923,91.9,33.65,92.83783783783784,92.3076923076923,80.8108108108108,27.90368271954674,9.387755102040817,5.540540540540541,0.2739726027397249,58.0246913580247,6.968139439136069,574
|
||||
SZ002387,7.468231576209733,0.23798090769017394,81.05802934482834,4.324757446365434,0.7102821294460503,0.5120087333773629,38.29,69.44,43.37837837837838,19.23076923076923,95.94594594594594,94.90084985835693,2.4489795918367347,53.10810810810811,38.630136986301366,11.385459533607678,6.963039831557006,575
|
||||
SZ300167,6.607531948923609,0.07987941287128307,83.34426429089437,7.3293618216872485,12.84534126536297,0.919904870208833,81.65,51.22,49.72972972972973,44.505494505494504,97.43243243243244,12.747875354107652,24.897959183673468,97.2972972972973,2.73972602739726,29.76680384087792,6.951873421439454,576
|
||||
SZ301392,6.2943776495492685,0.06692437538084703,32.91319754615562,9.715202567655684,25.891097178180207,0.5,40.87,51.190000000000005,53.37837837837838,51.23626373626373,25.810810810810807,4.107648725212465,59.04761904761905,42.09459459459459,34.24657534246576,30.178326474622775,6.9298207090664175,577
|
||||
SZ002482,13.265310894798604,1.0256925892549196,78.17015917460054,5.11467830678273,6.1724934105145595,0.5755325161827718,21.72,52.57000000000001,21.351351351351354,4.395604395604391,94.5945945945946,49.29178470254958,9.115646258503402,71.75675675675676,73.15068493150685,28.463648834019207,6.916226952405237,578
|
||||
SZ300166,6.543812220774744,0.5880562521436083,24.990352666306496,4.543279311759419,30.71749022318197,0.04697653740197732,9.64,48.96,50.8108108108108,7.829670329670336,14.594594594594595,82.57790368271955,69.93197278911565,0.945945945945946,97.94520547945206,33.05898491083676,6.903226623896001,579
|
||||
SZ000582,7.8740801876000255,3.380770307353821,44.53083611310188,5.131466695638935,29.736897991664517,0.1783110564449715,34.14,22.54,41.351351351351354,1.3736263736263687,45.13513513513514,48.30028328611898,67.21088435374149,7.162162162162162,46.02739726027397,74.89711934156378,6.898379110528239,580
|
||||
SZ301551,3.7909381748803845,0.6573849171071043,5.639164597121367,4.46746776456092,56.24250242785279,0.8117492564298618,62.66,98.23,76.35135135135135,7.280219780219777,0.2702702702702703,87.39376770538243,94.5578231292517,91.75675675675676,12.328767123287676,0.2743484224965731,6.894755012200526,581
|
||||
SZ301197,15.210640773750987,0.053744293556997884,21.02306779798533,6.218955052080931,40.111272188400406,0.5644281574973476,36.84,49.92,17.02702702702703,59.2032967032967,9.324324324324325,21.388101983002827,84.08163265306122,69.72972972972973,41.23287671232877,31.550068587105628,6.869123386669465,582
|
||||
SH603232,78.96220728407255,0.15737751547363105,14.583084913617503,5.590217540147097,34.840664030965506,0.5027342624506,16.9,21.09,0.540540540540535,26.648351648351653,4.324324324324325,32.436260623229465,76.87074829931973,45.81081081081081,83.97260273972603,78.32647462277092,6.8527930387197395,583
|
||||
BJ837821,10.644393829601084,0.056667336673649454,35.216022279546024,,23.297959463408365,0.6225720018148525,40.18,88.61,28.243243243243242,57.417582417582416,30.270270270270274,0.0,51.70068027210885,78.24324324324324,35.342465753424655,2.0576131687242816,6.844066186156095,584
|
||||
SZ300308,2.2233132323353617,0.07903936797431549,30.393507522128992,11.015640432107288,36.7009988470745,0.6455145308697152,50.96000000000001,74.75,90.27027027027027,45.192307692307686,22.027027027027028,2.5495750708215303,80.40816326530611,80.0,22.602739726027398,8.779149519890261,6.833765688356334,585
|
||||
SZ002333,3.7622768804563314,0.24138405556479672,39.26364095549133,5.763626976867882,12.685160030761434,0.49642416371574355,43.62,45.05,76.62162162162163,19.09340659340659,36.62162162162162,27.478753541076482,24.489795918367346,39.189189189189186,30.68493150684931,39.643347050754464,6.811365023310861,586
|
||||
SH688305,8.239966238181173,0.5563413576979724,19.963815413386172,4.574732121062837,39.857504241279685,0.6548011491661034,42.29,65.85,39.32432432432432,8.51648351648352,7.972972972972974,80.31161473087819,83.80952380952381,81.08108108108108,32.602739726027394,13.717421124828533,6.808630692401755,587
|
||||
BJ834021,17.301738827065417,0.0658327592719368,36.09969259807276,,30.109126119007,0.4767704714558614,56.14,41.09,13.243243243243242,51.92307692307692,31.486486486486488,0.0,68.70748299319727,34.32432432432432,18.219178082191778,45.541838134430726,6.8022369314320175,588
|
||||
SH688048,10.060401110887472,0.02878985343087509,9.932739189794201,7.716584685628409,28.718569606929783,0.5337427418566433,27.589999999999996,53.44,29.45945945945946,79.53296703296704,1.891891891891892,10.76487252124646,64.48979591836735,61.08108108108108,59.726027397260275,27.02331961591221,6.802057161120946,589
|
||||
SZ301581,2.447007974153611,0.020477988748207925,10.127530387256249,4.870479305107943,17.261627753486515,0.5,86.0,50.91,88.24324324324324,88.18681318681318,2.1621621621621623,59.4900849858357,34.69387755102041,42.09459459459459,1.2328767123287676,30.864197530864203,6.79383325643596,590
|
||||
SZ300793,6.622784947753116,0.06569874494016956,27.506993199081382,4.655342956198652,13.374426775885128,0.5280723720763555,39.54,86.5,49.189189189189186,52.060439560439555,17.027027027027028,75.21246458923513,26.53061224489796,59.86486486486486,36.57534246575342,3.017832647462282,6.788364916206164,591
|
||||
SZ002816,22.26865048099041,0.012931077434811972,33.23804806036867,5.605360909268973,43.712039840716606,0.7537125689678753,68.64,73.83,7.432432432432434,95.32967032967032,26.62162162162162,31.728045325779043,87.34693877551021,88.10810810810811,9.041095890410954,9.190672153635116,6.757434383866584,592
|
||||
SZ000925,23.152205625588245,0.37434198561876403,57.06131866476527,4.760986832440539,23.686567435005472,0.4284435729740639,31.319999999999997,48.52,7.027027027027022,12.5,67.83783783783784,67.8470254957507,52.6530612244898,24.45945945945946,52.05479452054795,33.882030178326474,6.756913392902871,593
|
||||
SZ300846,12.753704949199088,0.26028063585849837,50.79811002416413,5.839524303804318,11.114263608497335,0.5798436982811713,43.55,32.24,22.297297297297302,17.582417582417587,56.486486486486484,26.770538243626063,21.224489795918366,72.43243243243244,30.958904109589035,60.21947873799726,6.755307916836266,594
|
||||
SH688548,7.993391132387186,0.2957930594172696,29.075535632624582,4.6878657095925735,25.75321492305494,0.4134710217291553,47.08,39.05,41.08108108108108,15.521978021978022,19.594594594594593,72.5212464589235,58.50340136054422,22.432432432432435,26.71232876712328,48.69684499314128,6.752534532079003,595
|
||||
SZ300101,31.376455991743278,0.3638912658854362,32.091871203319414,4.661578869056052,61.1555668947713,0.31954563147987164,26.789999999999996,33.8,4.324324324324325,12.91208791208791,24.18918918918919,74.6458923512748,95.78231292517006,13.513513513513514,61.780821917808225,57.61316872427984,6.751560525703726,596
|
||||
SZ301325,5.702090954011388,0.06207796699909713,40.364261430979525,4.635625525251528,26.50414359192589,0.24228094286570376,56.58,75.16,58.91891891891892,54.258241758241766,38.24324324324324,76.48725212464589,60.40816326530612,10.135135135135135,17.671232876712327,8.504801097393688,6.747881092833092,597
|
||||
SH688577,9.8618709850371,0.11259698164586557,39.905760186504196,6.9406871225019495,22.78601210052144,0.3586798710888728,38.82,22.61,31.891891891891888,33.92857142857143,37.567567567567565,14.872521246458925,49.38775510204081,17.027027027027028,37.671232876712324,74.34842249657065,6.745169358539502,598
|
||||
SH688549,4.31607472540706,0.0682486249932667,21.9038089140425,4.54333783377551,8.083013622244643,0.3845912571678911,41.07,41.93,71.48648648648648,50.96153846153846,10.405405405405405,82.43626062322946,13.877551020408163,19.18918918918919,33.972602739726035,43.895747599451305,6.736542905393012,599
|
||||
SZ300961,15.607977608089577,2.325230761138598,69.16087704546463,5.601389825252631,24.18420750057815,0.7680531092780971,53.17000000000001,45.47,16.216216216216218,2.472527472527475,87.29729729729729,32.152974504249286,54.14965986394557,89.05405405405405,19.72602739726027,38.95747599451303,6.725660117187081,600
|
||||
SH688052,9.894223138886884,0.045609008036482615,21.21416263968315,5.4327436580822805,34.36842533287653,0.505208389077079,82.31,37.11,31.62162162162162,64.97252747252747,9.594594594594595,36.40226628895184,75.64625850340137,48.51351351351351,2.1917808219178103,52.2633744855967,6.701668266166253,601
|
||||
SZ000720,4.617496019007449,,52.95194185681817,6.556101046209859,5.544945629113672,0.7811291125495327,66.59,42.54,68.51351351351352,0.0,59.05405405405405,17.70538243626062,7.210884353741497,90.13513513513513,9.999999999999998,42.79835390946503,6.700773508805441,602
|
||||
SH603912,7.1240028732698075,0.16658288594152176,45.65818707661114,5.385159031368509,17.87519233010621,0.06155695174490008,27.57,49.58,45.270270270270274,25.686813186813183,46.75675675675676,37.96033994334278,35.91836734693877,1.891891891891892,59.86301369863014,32.51028806584362,6.695296427069552,603
|
||||
SH605588,3.226754300881882,0.02971993090233579,64.03534378226486,4.7344752572396684,5.7668828616173675,0.2895748382601371,68.9,75.05,81.21621621621622,78.84615384615384,80.4054054054054,69.97167138810198,7.891156462585033,11.756756756756758,8.630136986301373,8.64197530864198,6.691415706234659,604
|
||||
SZ002348,20.830365514231293,0.25183189619570195,38.23160299211477,4.714061882058961,20.090931792665558,0.4874100351594788,30.91,49.65,8.64864864864865,18.40659340659341,34.32432432432432,71.671388101983,42.993197278911566,36.351351351351354,52.73972602739726,32.37311385459534,6.686495063964811,605
|
||||
SZ300675,27.465946805626988,0.19332132469996574,58.56904275601518,4.941407504164047,-11.571097730154369,0.4108234787727187,13.79,22.81,5.270270270270272,22.8021978021978,70.13513513513514,55.949008498583574,0.40816326530612246,22.2972972972973,92.19178082191782,73.66255144032921,6.681910436088094,606
|
||||
SZ300522,9.513249949053325,0.09808525498940023,23.418309821917386,7.20894075879756,22.886309611049306,0.38113247322477684,16.63,22.5,33.108108108108105,37.77472527472527,12.432432432432433,13.597733711048154,49.795918367346935,18.91891891891892,84.93150684931507,75.03429355281207,6.669787383643371,607
|
||||
SZ300283,4.214212263273488,0.03534075895056131,73.67238525668692,9.821160945093922,8.54649344227271,0.4876613900006271,58.85,51.13999999999999,72.43243243243242,74.03846153846155,90.54054054054053,3.682719546742208,14.69387755102041,36.486486486486484,15.205479452054792,30.589849108367627,6.663830254556007,608
|
||||
SH603160,4.526818226760797,0.20061710631868768,13.920613376173762,4.7368529404399045,43.342644674753714,0.5029156314763114,51.17,66.63,69.5945945945946,22.390109890109887,3.6486486486486487,69.54674220963173,86.93877551020408,46.48648648648649,22.191780821917806,13.031550068587105,6.663814820918797,609
|
||||
SZ002725,6.43978666154709,0.107159830111012,20.263932525981247,5.121670315861391,16.196407321449673,0.7002258240691374,75.22,35.6,51.486486486486484,34.61538461538461,8.91891891891892,48.72521246458924,32.517006802721085,84.18918918918918,5.068493150684928,54.59533607681756,6.662428774445937,610
|
||||
SH688165,14.116747216065011,0.12576857237974484,53.95524463435838,4.7685359739453395,5.461245119971295,0.32928389565635974,25.319999999999997,38.89,19.729729729729726,32.005494505494504,61.35135135135135,67.42209631728045,6.938775510204081,14.18918918918919,64.17808219178083,48.971193415637856,6.655891541383133,611
|
||||
SZ301171,3.490253848378348,0.0640986032638621,35.2591616166305,13.728289696471839,16.133538805053195,0.5422241783302434,83.56,26.76,79.05405405405406,53.15934065934066,30.405405405405407,1.4164305949008527,32.38095238095238,63.37837837837837,1.5068493150684925,68.99862825788752,6.644853148565962,612
|
||||
SH688020,13.2854131329807,0.01813870634349507,21.798686638376264,18.846783618523638,36.234428364305984,0.7513965121961521,74.88,36.06,21.081081081081077,90.10989010989012,10.135135135135135,0.283286118980175,79.31972789115646,87.97297297297297,5.342465753424652,54.04663923182442,6.644679396972312,613
|
||||
SZ300872,6.225609136920704,0.053122803502695604,23.27392953252308,8.21201868213389,25.24524681537655,0.3887821370571097,40.76,32.32,54.18918918918919,59.61538461538461,12.297297297297298,8.92351274787535,57.006802721088434,19.72972972972973,34.65753424657534,60.08230452674896,6.639798826613971,614
|
||||
SZ300554,16.753494741624042,0.029058200432545974,30.449453326999095,5.4297040900296345,16.44653840476166,0.4566214352829969,46.76,30.72,14.324324324324323,79.39560439560441,22.2972972972973,36.827195467422094,33.197278911564624,29.72972972972973,27.123287671232877,62.139917695473244,6.63942713058327,615
|
||||
SH688584,8.058354157750932,0.045087472879301385,8.00072961176875,4.860977673138296,23.52626668280698,0.5376242216771191,45.81,78.01,40.54054054054054,65.24725274725274,1.0810810810810811,60.05665722379603,52.244897959183675,62.56756756756757,28.424657534246577,6.858710562414261,6.634589818073801,616
|
||||
SH688638,21.00774611901635,0.005753144648096464,59.42869351419978,4.623780394240872,9.45785534915785,0.31157344062098213,34.65,68.47,8.378378378378383,98.62637362637363,70.8108108108108,77.05382436260624,17.142857142857142,12.702702702702704,44.93150684931507,11.796982167352542,6.6227137227408885,617
|
||||
SZ301536,3.8306947346669102,0.15841388781125545,31.495685739629963,4.461221588772366,33.2863708111378,0.5012177340528967,82.34,82.9,76.08108108108108,26.510989010989007,23.10810810810811,87.53541076487252,74.01360544217687,44.189189189189186,2.0547945205479423,4.183813443072704,6.620533345795766,618
|
||||
SZ301511,1.4123891109043887,0.07052211024313661,73.53676764573315,14.529103720784295,6.469729370154539,0.6402702596372984,74.23,61.82,95.8108108108108,49.58791208791209,90.27027027027027,1.1331444759206777,9.795918367346939,79.32432432432432,5.753424657534245,17.558299039780522,6.6197174217790264,619
|
||||
SZ002175,18.274806156415195,0.3037362000866803,24.5988173419745,4.633017365111482,25.316207465249484,0.39704338516344906,24.35,31.989999999999995,12.027027027027026,14.6978021978022,13.918918918918918,76.62889518413598,57.14285714285714,20.81081081081081,66.30136986301369,60.768175582990395,6.611653687333321,620
|
||||
SZ002213,2.314272061527268,0.2016756553114094,24.403601397126458,5.125901306338208,3.159972239532274,0.5195668406986319,36.49,40.97,89.5945945945946,22.115384615384613,13.648648648648647,48.44192634560906,4.081632653061225,55.945945945945944,41.71232876712329,45.8161865569273,6.608098495924568,621
|
||||
SZ300490,13.924934970478395,0.01956666201066552,65.26070743303029,8.686950368463348,11.15453775168748,0.05351666575036009,17.01,45.86,19.999999999999996,88.87362637362637,81.75675675675676,7.082152974504252,21.360544217687075,1.4864864864864866,83.69863013698631,37.72290809327846,6.597156177782365,622
|
||||
SH600678,10.038686124656147,2.4453504423944605,74.38396207774794,8.766166981424089,25.33032749262732,0.7121464392296909,55.69,40.34,29.86486486486486,2.335164835164838,91.48648648648648,6.232294617563738,57.41496598639456,84.86486486486487,18.493150684931503,46.639231824417,6.596147457782733,623
|
||||
SZ300853,161.02139134927563,0.024318388978158866,51.78212313400085,5.036657187887849,0.11795744017886768,0.47622579632112594,27.060000000000002,48.54,0.2702702702702675,84.2032967032967,57.432432432432435,53.11614730878187,2.0408163265306123,34.054054054054056,61.23287671232877,33.744855967078195,6.587392788422329,624
|
||||
SH688234,11.859737162090466,0.07946153030888904,29.41532410863152,4.432182351688968,23.948280187979055,0.43549603228299644,45.59,57.22999999999999,25.135135135135133,44.780219780219774,20.0,89.51841359773371,53.197278911564624,25.405405405405407,28.767123287671236,22.496570644718794,6.583591394894913,625
|
||||
SZ300883,6.314014936383107,0.11450687587084392,40.29297293624434,5.214381761464452,13.560073486126562,0.39032547368315457,72.34,31.129999999999995,53.24324324324324,33.65384615384615,37.972972972972975,44.050991501416426,27.755102040816325,20.0,6.438356164383563,61.728395061728406,6.583206790604126,626
|
||||
SZ002227,18.967158815306828,0.305749876093634,36.86780538831038,5.474291890803175,21.478564443098666,0.4233370342393269,23.22,18.79,11.216216216216212,14.423076923076927,32.2972972972973,35.69405099150141,45.442176870748305,23.64864864864865,69.04109589041096,82.99039780521262,6.568556134262524,627
|
||||
SH688126,9.129611067881342,0.2035699793348134,36.8531771510183,4.903870768307053,-11.4476473001664,0.4972593713946538,31.180000000000003,39.86,35.27027027027027,21.703296703296704,32.027027027027025,57.64872521246459,0.5442176870748299,39.5945945945946,52.32876712328767,47.325102880658434,6.562974999963588,628
|
||||
SH603191,4.409921833704369,0.14886117608627306,62.1581791906178,7.086677956116403,12.410965438967988,0.1830296439758171,42.68,27.01,70.54054054054055,27.884615384615387,76.62162162162161,14.164305949008494,23.401360544217688,7.4324324324324325,31.917808219178077,68.44993141289437,6.5626560698444,629
|
||||
SZ301150,1.3331563141050125,0.01499300090154872,45.71823741114391,12.772344991780589,4.703662407162647,0.7181087500077404,78.08,63.74999999999999,96.48648648648648,93.13186813186813,47.02702702702703,1.6997167138810165,5.850340136054422,85.67567567567568,4.109589041095896,15.089163237311388,6.554315907817659,630
|
||||
SZ000410,9.921915342497641,0.7353606848885231,70.04332232598061,4.864523190870503,8.957061944488585,0.531241592476963,65.8,37.81,31.351351351351354,6.456043956043955,87.97297297297297,59.773371104815865,15.782312925170066,60.810810810810814,10.95890410958904,50.685871056241425,6.5537061157852134,631
|
||||
SZ301071,7.292595166678298,0.08693246324513386,20.678142210451618,4.328211229137265,14.201689783231267,0.10389550632743456,42.35,25.429999999999996,44.32432432432433,42.03296703296703,9.18918918918919,94.75920679886686,28.70748299319728,3.9189189189189193,32.46575342465754,70.71330589849109,6.537217329074631,632
|
||||
SZ300971,17.216497946564914,0.036994368782914164,23.576150817899926,8.43361399279786,40.23427913431151,0.3995721919273582,20.88,43.79,13.513513513513509,72.52747252747253,12.702702702702704,8.21529745042493,84.35374149659864,21.35135135135135,74.52054794520548,41.28943758573388,6.519041831270865,633
|
||||
SZ300383,3.640484732529288,0.11471939988716925,36.863381001744216,4.91888181180995,15.137132530088223,0.23439093060566926,70.27,32.1,77.16216216216216,33.51648351648352,32.16216216216216,57.082152974504254,30.612244897959183,10.0,7.397260273972606,60.63100137174211,6.497358708908484,634
|
||||
SZ300546,20.520988327972038,0.06216948011994294,17.032759239494368,6.3417260315926,42.3596683991543,0.3514917807208868,15.98,36.8,8.783783783783782,53.98351648351649,5.675675675675676,19.40509915014165,85.85034013605443,16.486486486486488,87.32876712328768,52.94924554183813,6.484578174245378,635
|
||||
SH603843,9.866473807354193,1.8171403407490254,90.59653079176431,7.331106067985593,12.229446844203215,0.5043991169976264,24.68,42.92,31.756756756756754,2.7472527472527486,99.1891891891892,12.60623229461756,23.12925170068027,47.56756756756757,65.89041095890411,42.1124828532236,6.4794867514452195,636
|
||||
SZ301117,53.48823949686984,0.01708989679512639,12.180665154489681,5.901692347132963,47.27850346502696,0.5086028053004814,30.75,60.370000000000005,1.756756756756761,90.52197802197803,2.7027027027027026,25.35410764872521,89.65986394557824,51.08108108108108,53.15068493150685,19.067215363511657,6.46398040035155,637
|
||||
SZ300723,17.390151283529622,0.14612131264567552,62.077245759642416,9.711586437453276,61.04848794560513,0.4439590788547454,39.53,44.09,12.972972972972974,28.846153846153843,76.35135135135135,4.249291784702547,95.64625850340136,27.56756756756757,36.712328767123296,40.74074074074075,6.442125000043332,638
|
||||
SZ300825,9.235280474079987,0.6859649049060863,28.574770042939836,4.685814938711316,25.066237206127557,0.49359627746458085,29.99,62.53999999999999,34.86486486486486,7.005494505494503,19.054054054054053,72.66288951841359,55.78231292517006,38.24324324324324,54.38356164383562,16.59807956104252,6.432392972286468,639
|
||||
SZ002264,2.020900072069333,0.15459866324859578,46.47900097285028,5.536086301396812,22.175338824541573,0.49780029948663773,79.66,62.07,92.02702702702703,27.33516483516484,48.51351351351351,34.13597733711048,47.61904761904761,40.0,3.424657534246578,17.14677640603567,6.4168491874178315,640
|
||||
SZ002272,11.197555583569564,0.2607206653133631,55.32500679335192,8.738054282670568,13.51696286687932,0.4424194662196516,14.77,35.3,26.75675675675676,17.44505494505495,64.32432432432432,6.515580736543914,27.346938775510203,26.891891891891888,89.38356164383562,55.212620027434845,6.41524993085664,641
|
||||
SH688449,5.666429823820953,0.0464324520413406,20.109142939846468,5.057688838911357,50.71520458861352,0.5,92.06,78.53,59.5945945945946,64.56043956043955,8.378378378378379,52.124645892351275,92.65306122448979,42.09459459459459,0.136986301369868,6.447187928669407,6.413815870928479,642
|
||||
SH603200,15.920242936793333,0.24999200812558492,34.485910714138754,7.595985200372293,33.69785848780323,0.45601287035709215,16.25,38.98,15.67567567567567,18.681318681318682,29.45945945945946,11.189801699716718,74.6938775510204,29.45945945945946,86.84931506849315,48.83401920438958,6.410695808505951,643
|
||||
BJ832171,33.786960465452836,0.0996444391685081,39.537338601647335,,51.57629689424085,0.542433672588621,64.95,49.19,4.054054054054057,37.362637362637365,36.891891891891895,0.0,93.06122448979592,63.51351351351351,11.232876712328766,32.92181069958847,6.397921466730436,644
|
||||
SZ300302,30.78330946379509,0.09727470532849725,37.087893226253584,4.666315671572026,41.86213185728701,0.348937627525856,35.74,59.699999999999996,4.459459459459458,38.18681318681318,32.567567567567565,74.07932011331444,85.3061224489796,16.08108108108108,43.28767123287671,19.478737997256513,6.387255963473448,645
|
||||
SH688256,3.87567295246735,0.06860560641775845,15.968545870656675,9.336645336674614,55.98971269314348,0.7378981976235791,58.040000000000006,94.63,75.67567567567568,50.824175824175825,5.135135135135135,5.099150141643061,94.28571428571428,87.16216216216216,16.43835616438356,0.8230452674897082,6.369270282320274,646
|
||||
SZ301176,1.0181367711887843,0.026283137078626072,37.353489908643574,10.425369197927886,6.178342759296403,0.5069363506275769,71.29,41.45,97.83783783783784,82.0054945054945,33.108108108108105,3.116147308781869,9.251700680272108,49.86486486486486,7.12328767123288,44.92455418381345,6.356305624560841,647
|
||||
SH600800,3.6535788331410295,0.0828462411916722,61.04100402627015,4.99303986805339,-9.66178407981397,0.5221091893665842,81.81,73.61,77.02702702702703,42.85714285714286,74.72972972972973,54.53257790368272,0.6802721088435374,57.16216216216217,2.602739726027392,9.327846364883396,6.333086708474613,648
|
||||
SH600310,4.178092588536301,1.0354802051001433,79.07305404758704,5.644966711341242,12.949101782766698,0.4387396799839776,51.27,45.64,72.83783783783784,4.258241758241754,95.4054054054054,30.736543909348445,25.03401360544218,25.945945945945947,22.05479452054795,38.68312757201646,6.329323294334956,649
|
||||
SZ301259,14.224652741992283,0.10622030938325744,47.57730263819925,8.329827480278661,31.123035468523124,0.8644011285451675,68.44,53.55,19.45945945945946,34.75274725274725,50.54054054054053,8.78186968838527,71.156462585034,94.32432432432432,9.31506849315068,26.74897119341564,6.297334772382206,650
|
||||
SH688153,6.270889088364344,0.015387386863177565,14.200911887417114,4.552285501198857,21.264598124150726,0.44104547110863823,54.77000000000001,97.39,53.648648648648646,92.44505494505495,3.783783783783784,81.58640226628894,45.034013605442176,26.351351351351347,18.76712328767123,0.6858710562414272,6.29548767823248,651
|
||||
SH600302,21.31776119388828,0.2691307850717226,37.56213191336447,6.862255305756284,19.59099226140093,0.5996162418525374,35.93,32.48,7.972972972972969,16.620879120879117,33.24324324324324,15.155807365439088,42.04081632653061,75.67567567567568,43.013698630136986,59.807956104252405,6.2642126069847945,652
|
||||
SZ300784,9.337498898616566,0.06215405352463822,20.190691563954914,4.546250663389737,28.313387203087643,0.2628534354031684,34.04,78.06,34.5945945945946,54.12087912087913,8.513513513513514,82.29461756373938,63.6734693877551,10.54054054054054,46.369863013698634,6.72153635116598,6.248582819627516,653
|
||||
SH603375,8.021518212765749,0.09397594460842129,8.737306061012507,5.932305751110201,35.269419502715586,0.9151271792754755,52.0,66.58,40.94594594594595,39.56043956043956,1.7567567567567568,24.929178470254953,77.9591836734694,97.02702702702702,21.36986301369863,13.168724279835386,6.246081354978258,654
|
||||
SZ301512,38.686980238797666,0.010601039053694895,20.24460978830458,5.102557605234158,25.193391410786685,0.33155750806836853,13.639999999999999,80.2,3.2432432432432434,96.15384615384616,8.783783783783784,49.85835694050992,56.4625850340136,14.324324324324325,92.46575342465754,5.6241426611796985,6.239560613651278,655
|
||||
SH688733,17.736588474490766,0.10129270609811895,35.16629837510235,4.194132071198331,16.12595499781828,0.5018482713933126,72.3,42.47,12.432432432432428,36.95054945054945,30.135135135135133,98.86685552407933,32.244897959183675,45.0,6.57534246575342,43.20987654320988,6.225749300672842,656
|
||||
SH688168,10.01572371563786,0.014669811628181498,28.180341515213485,6.852461177591334,92.06390488986675,0.47489746338988076,78.88,53.78000000000001,30.270270270270274,93.81868131868131,18.513513513513512,15.439093484419264,99.8639455782313,33.78378378378378,3.9726027397260277,26.200274348422493,6.217672905599342,657
|
||||
SZ002108,3.240576159421096,0.19370920368292632,34.14915312769618,4.8175665945331385,11.230553750898137,0.3257022997440737,69.69,30.42,81.08108108108108,22.66483516483516,28.513513513513512,63.31444759206799,21.768707482993197,14.054054054054054,7.9452054794520555,62.894375857338815,6.206925175202964,658
|
||||
SH688272,23.29003322897007,0.016218115337806184,34.114555864164146,4.827875280142449,36.5223517217499,0.10945015152680239,46.73,62.88,6.891891891891888,91.34615384615384,28.243243243243242,62.60623229461757,79.72789115646258,4.054054054054054,27.397260273972602,15.912208504801095,6.1909254453637,659
|
||||
SZ000892,19.976093772663106,0.1014641734738693,49.623573884533464,6.543723607246771,74.03466188101962,0.47261200699073436,27.839999999999996,90.98,9.594594594594597,36.81318681318682,55.00000000000001,17.847025495750714,98.2312925170068,33.513513513513516,59.04109589041096,1.3717421124828544,6.188517206567543,660
|
||||
SZ002456,3.54026212573839,0.3300943751928224,78.42973727063061,4.760754765718977,10.356705064069493,0.12387354749868511,42.79,77.35,78.51351351351352,14.010989010989006,94.72972972972973,68.13031161473087,19.45578231292517,5.0,31.643835616438352,7.2702331961591256,6.1864663674772045,661
|
||||
SH688225,16.73204617478301,0.09060172003959309,50.83364678350254,6.739173532299072,21.73232712392372,0.46433500769020825,26.239999999999995,74.38,14.459459459459456,40.65934065934066,56.62162162162162,16.57223796033994,46.12244897959184,30.810810810810814,62.328767123287676,9.053497942386834,6.163742915666569,662
|
||||
SH688260,11.807813561153973,0.009377365002000069,90.01083132715702,6.093289618744736,-9.580730748925308,0.37153499392453887,42.75,55.03,25.4054054054054,97.11538461538461,98.78378378378379,22.379603399433424,0.8163265306122449,18.37837837837838,31.780821917808222,25.10288065843621,6.154151023552377,663
|
||||
SZ300672,7.443667706271022,0.43350582140701277,45.835075423001584,4.9448055957209665,34.48214610927944,0.5366609615359437,80.18,85.87,43.648648648648646,10.71428571428571,47.56756756756757,55.80736543909348,76.19047619047619,62.43243243243243,3.013698630136985,3.292181069958844,6.150407265550241,664
|
||||
SZ301316,9.339496789801025,0.1226174657109944,41.44142899565672,8.488770877009964,19.124684968939555,0.07303034211419882,27.22,30.18,34.45945945945946,32.55494505494505,39.729729729729726,7.790368271954673,40.68027210884353,2.5675675675675675,60.54794520547946,63.237311385459535,6.13166966551997,665
|
||||
BJ835179,15.102059786179453,0.018933984339060548,22.007399242586196,,42.0028752525457,0.3413253919152689,36.42,65.8,17.162162162162165,89.42307692307693,10.54054054054054,0.0,85.4421768707483,15.0,42.19178082191781,13.854595336076814,6.104354547061332,666
|
||||
BJ834639,1.8909549266652288,0.042885473257372526,55.951002744435186,,10.665329668297035,0.3049074003168967,61.59,90.46,92.97297297297298,67.71978021978022,65.0,0.0,20.272108843537413,12.027027027027028,13.287671232876708,1.7832647462277085,6.064827223924698,667
|
||||
SZ300053,16.426649510425552,0.8751269598627552,29.060785793740795,5.08139691254164,27.337593883182944,0.4295379729878741,29.31,44.58,15.135135135135137,5.631868131868134,19.45945945945946,50.991501416430594,61.7687074829932,24.72972972972973,56.43835616438356,40.054869684499316,6.037863486455288,668
|
||||
SZ300267,15.327160728483602,0.5039775958858521,13.847090530441344,15.93530975511766,26.134973088925545,0.7188108222932222,22.72,30.269999999999996,16.621621621621617,9.065934065934067,3.5135135135135136,0.8498583569405138,59.591836734693885,85.8108108108108,70.95890410958904,63.10013717421125,6.035237285002973,669
|
||||
SH688159,1.161044954152806,0.1825356052049967,59.057777317029824,6.620772951100529,7.59282448252742,0.46660802959199904,68.88,45.89,97.2972972972973,24.17582417582418,70.54054054054055,17.280453257790374,13.061224489795919,31.756756756756754,8.76712328767123,37.58573388203018,5.991651411727285,670
|
||||
SZ001277,5.338621824639787,0.10364531056703744,21.250039949646332,8.549536740437713,18.066962368289243,0.5,23.55,62.57,62.16216216216216,35.71428571428571,9.864864864864865,7.507082152974509,36.46258503401361,42.09459459459459,68.49315068493152,16.460905349794242,5.988346676551101,671
|
||||
BJ831152,7.349850728284542,0.05745896521907616,70.57434244889363,,3.3669053355708014,0.04626206650648803,61.55,33.75,44.054054054054056,56.730769230769226,88.24324324324324,0.0,4.217687074829931,0.8108108108108109,13.424657534246576,57.750342935528124,5.986443261354514,672
|
||||
SH688530,9.361184163240052,0.019728294413783265,25.671025057051782,4.5668721601023465,14.478072280283975,0.4222665804436982,69.94,60.08,34.05405405405405,88.5989010989011,15.27027027027027,80.87818696883853,29.523809523809526,23.513513513513516,7.8082191780821875,19.34156378600823,5.985959981061951,673
|
||||
SH688695,15.070540886137604,0.054100336582556564,3.7735011914466163,4.816778864797391,80.68733991386446,0.3941772887013942,66.19,,17.43243243243243,58.92857142857143,0.13513513513513514,63.45609065155807,99.04761904761905,20.54054054054054,10.410958904109592,0.0,5.980811917924829,674
|
||||
SH600405,23.76517409172255,0.45650260267144877,83.6260445579453,5.944394362809327,8.57470547668088,0.5147751705382982,,33.84,6.486486486486487,10.164835164835162,97.70270270270271,24.78753541076487,14.829931972789115,54.32432432432432,0.0,57.338820301783265,5.971512521424458,675
|
||||
SZ300051,26.13816506578298,0.11248844133902725,75.14458076454437,5.42997615150915,-9.546491547013533,0.5151749291940926,34.95,54.44,5.810810810810807,34.065934065934066,92.56756756756756,36.68555240793201,0.9523809523809524,54.729729729729726,44.794520547945204,25.240054869684503,5.9662067015504245,676
|
||||
SZ000903,2.862629661064982,0.7355095258358547,85.82192578344208,6.833076872831756,9.813798844864529,0.07593659918653498,38.05,42.85,84.18918918918918,6.318681318681318,98.1081081081081,15.722379603399439,18.367346938775512,2.7027027027027026,39.31506849315068,42.38683127572016,5.949702909608591,677
|
||||
SZ300370,45.704793387970994,0.20396242010549806,54.94097289406656,4.902663682179956,23.348712314208004,0.261505552608602,28.139999999999997,62.31,2.297297297297296,21.565934065934066,63.64864864864865,57.79036827195468,52.10884353741496,10.405405405405405,58.63013698630137,16.872427983539097,5.941557245454237,678
|
||||
SH603773,8.751005484128276,0.032053715798746725,68.61865906260485,7.664882280288782,18.731419688301173,0.20502182558638068,48.73,67.83,37.16216216216216,75.96153846153845,86.48648648648648,11.048158640226625,38.36734693877551,8.64864864864865,24.931506849315067,12.345679012345679,5.93304742620789,679
|
||||
SZ301213,42.00345449028088,0.032869209365175976,16.929286663161694,5.955767342531836,71.2501426281705,0.5643802938156682,63.36999999999999,58.75,2.7027027027026973,75.13736263736264,5.540540540540541,24.64589235127479,97.95918367346938,69.5945945945946,11.50684931506849,20.16460905349794,5.917149237673608,680
|
||||
SZ300067,6.37775425005512,0.3322635434847871,28.077576290027523,5.15517691502249,8.627540122999546,0.22790045385954227,33.51,22.84,52.16216216216216,13.873626373626369,18.243243243243242,47.45042492917847,15.10204081632653,9.45945945945946,47.534246575342465,73.38820301783264,5.910065312640583,681
|
||||
SZ000519,19.238921307849203,0.057786749150528706,36.75229782556023,4.60189639600998,14.434354110197031,0.1572362561539642,47.53,45.66,10.675675675675677,56.18131868131868,31.891891891891895,78.47025495750708,29.115646258503403,6.621621621621622,25.89041095890411,38.47736625514403,5.908533124424143,682
|
||||
SH603138,11.688475601747816,0.13600613030719302,28.22210168355501,5.123164880079037,49.276094534431444,0.3123457457757928,63.190000000000005,40.59,25.810810810810814,30.082417582417587,18.64864864864865,48.58356940509915,91.42857142857143,12.837837837837837,11.780821917808215,46.50205761316872,5.906064598426928,683
|
||||
SZ300757,11.090023632059141,0.06665734600636107,56.67037910496955,5.7872437446739555,17.468863282254393,0.09115277280127779,36.29,68.69,27.16216216216216,51.78571428571428,66.8918918918919,27.19546742209632,34.82993197278911,3.3783783783783785,42.602739726027394,11.65980795610425,5.863093642945023,684
|
||||
SH688388,1.4257066864098116,0.18428018820574768,48.18342891109393,6.244433872249969,4.652633355135045,0.6537815026048168,57.82000000000001,80.41,95.67567567567568,23.76373626373627,51.621621621621614,20.963172804532583,5.714285714285714,80.94594594594594,16.712328767123285,5.4869684499314175,5.861942365607046,685
|
||||
SZ002174,15.57689078587099,0.8564712140454722,27.9821585907016,6.395931491435574,36.61285051582842,0.5138948593458921,42.47,36.0,16.35135135135135,5.769230769230771,17.83783783783784,19.121813031161473,80.27210884353741,53.918918918918926,32.32876712328767,54.1838134430727,5.841078018687354,686
|
||||
SZ002766,9.459173224310186,0.25993070110667377,28.8607028053283,4.649397563347046,25.22661494414487,0.46612380563650085,38.81,91.71,33.513513513513516,17.85714285714286,19.18918918918919,75.3541076487252,56.87074829931973,31.62162162162162,37.80821917808219,1.2345679012345734,5.839560202080437,687
|
||||
SH603869,23.816662465147324,0.755885607855104,19.316360521136016,5.098742088952134,44.82043921511357,0.4596292034523453,41.18,27.51,6.351351351351353,6.181318681318682,7.297297297297297,50.42492917847026,88.43537414965986,30.135135135135133,33.83561643835616,67.62688614540467,5.800188170608207,688
|
||||
SH600880,11.984881656449442,0.3636805342831843,19.851304931190423,4.749449099750213,20.876136377490997,0.4424675941173803,50.94,34.86,24.729729729729733,13.049450549450547,7.7027027027027035,68.83852691218131,44.761904761904766,27.027027027027028,22.739726027397257,55.96707818930041,5.7935077308351595,689
|
||||
SZ300323,6.6688795197724495,0.3822417045591533,46.838376911275404,4.346882261753846,5.8344454129407675,0.5012251982730666,68.53,58.21999999999999,48.513513513513516,12.08791208791209,49.32432432432432,93.76770538243626,8.16326530612245,44.32432432432433,9.178082191780824,21.124828532235938,5.7809291939875305,690
|
||||
SH688167,21.297739716421816,0.268905235570705,28.040241402669412,5.680975176981594,33.388245613491804,0.332824275870548,33.48,26.839999999999996,8.108108108108103,16.758241758241756,18.10810810810811,29.036827195467417,74.14965986394559,14.594594594594595,47.87671232876713,68.86145404663924,5.776510023514598,691
|
||||
SZ002889,3.1240640353634723,0.8842243052957713,44.86021313073411,5.924174726532277,9.524101242547458,0.4441236578325101,44.72,47.62,81.89189189189189,5.35714285714286,45.81081081081081,25.070821529745047,17.687074829931973,27.7027027027027,29.246575342465754,35.390946502057616,5.756729748275199,692
|
||||
SH603559,19.4654772571975,1.0488838505332596,37.99705947244047,6.009908393588362,12.260613610728651,0.6175289203581192,24.14,46.67,10.270270270270265,4.120879120879117,33.78378378378378,23.93767705382436,23.26530612244898,77.29729729729729,67.12328767123287,36.4883401920439,5.749755876850021,693
|
||||
SH688321,13.290500944327107,0.11747179522503297,52.83809154328579,7.811066801283478,85.64487319322579,0.4975022352961202,57.65,76.02,20.945945945945944,32.96703296703297,58.91891891891892,10.481586402266284,99.59183673469387,39.729729729729726,16.849315068493155,7.956104252400554,5.739979939919766,694
|
||||
SZ300049,22.542713855939986,0.47384772251155477,28.99189543547218,7.245704632028935,76.76392699639479,0.40274118430431505,39.09,14.45,7.2972972972973,9.478021978021978,19.324324324324323,13.456090651558073,98.63945578231292,21.62162162162162,37.3972602739726,89.16323731138546,5.719605035525177,695
|
||||
SZ300597,11.270143299265209,0.155071259242779,32.33864479183774,4.872559481952893,16.29091228817739,0.18421110456736497,43.46,58.84,26.351351351351347,27.1978021978022,24.72972972972973,59.06515580736544,32.6530612244898,7.7027027027027035,31.095890410958905,20.027434842249658,5.676180958341922,696
|
||||
SZ300506,55.620817960610005,0.14839264603555716,89.22238761344384,5.197947899748629,34.71850095036639,0.07626985109631977,40.81,81.76,1.6216216216216162,28.021978021978022,98.64864864864865,45.04249291784702,76.73469387755102,2.837837837837838,34.52054794520548,4.663923182441698,5.652904716145285,697
|
||||
SZ300229,41.5276261813104,0.7105166794690547,7.9580909279049346,8.736309589437125,67.76889213334246,0.37524126432278543,17.71,17.21,2.837837837837842,6.868131868131866,0.945945945945946,6.657223796033995,97.55102040816327,18.64864864864865,82.05479452054794,85.18518518518519,5.644681953392677,698
|
||||
SZ301139,3.0049288420148716,0.08512554077356992,42.476164498017106,7.874493117828112,12.467013787897956,0.27841909327806347,30.010000000000005,81.44,83.24324324324324,42.719780219780226,41.62162162162162,10.198300283286121,23.537414965986393,11.216216216216218,54.10958904109589,4.938271604938271,5.6010128521045335,699
|
||||
SZ301285,12.934815514638789,0.04721218495095433,49.540977321873655,11.454141015107002,18.942002032020238,0.18405555589252923,36.3,55.22,22.027027027027025,63.598901098901095,54.729729729729726,2.4079320113314484,39.59183673469388,7.567567567567568,42.465753424657535,24.828532235939647,5.600732259219722,700
|
||||
SZ301326,17.925767922660967,0.0477867740515964,29.47986245075503,9.18262389809992,24.284337128750465,0.38608102632632857,24.74,56.3,12.16216216216216,63.04945054945055,20.405405405405403,5.3824362606232246,54.285714285714285,19.45945945945946,65.61643835616438,23.731138545953357,5.594578889719429,701
|
||||
SZ300348,16.565308293778315,0.5157309954216176,26.141002584599786,6.702570295068924,35.01761684044363,0.5146377975456451,61.71,21.52,14.59459459459459,8.92857142857143,15.54054054054054,16.855524079320116,77.27891156462586,54.18918918918919,12.876712328767127,76.74897119341564,5.573054754088215,702
|
||||
SH688573,18.96941615612998,0.03087320907336623,63.566787621216584,9.371813676805104,9.417299177717473,0.5005432921384895,36.47,86.34,11.081081081081079,77.33516483516483,79.5945945945946,4.957507082152979,17.006802721088434,43.37837837837838,41.917808219178085,3.155006858710563,5.552025214832182,703
|
||||
SZ000539,2.8457408840092935,0.09790890558443549,79.9153054559553,6.059360752131365,4.508479286845804,0.11914815966412606,79.63,99.4,84.45945945945947,37.91208791208791,95.67567567567568,22.80453257790368,5.3061224489795915,4.594594594594595,3.561643835616435,0.0,5.5507748514153015,704
|
||||
SZ002343,2.3038024267953476,,40.733136577510834,6.324012989369953,5.252466558450896,0.5952417309635181,58.26,88.59,89.72972972972973,0.0,38.78378378378378,19.68838526912181,6.530612244897959,74.5945945945946,16.301369863013704,2.1947873799725626,5.541225068060342,705
|
||||
SZ002217,5.912941433073377,0.631234119819669,25.61095808463934,5.283364013475827,15.460773908659379,0.6589851139414692,70.14,57.13,57.16216216216217,7.55494505494505,15.135135135135137,41.359773371104815,31.020408163265305,81.62162162162161,7.671232876712331,22.633744855967073,5.484409501609568,706
|
||||
SZ002796,8.394081617604236,0.09618372061107504,36.08444652089181,8.345176810675976,7.3227498647545115,0.46332666944619955,15.02,64.7,38.37837837837837,38.73626373626373,31.351351351351354,8.640226628895187,12.244897959183673,30.270270270270274,88.76712328767124,14.266117969821678,5.479623548747227,707
|
||||
SH605186,12.18750870668011,0.08982635714654201,21.146284389891342,5.143575268858971,37.17055893279535,0.3729278940359837,81.43,48.03,24.054054054054053,41.07142857142857,9.45945945945946,48.01699716713881,81.08843537414965,18.513513513513512,2.876712328767128,34.97942386831275,5.4564509763031195,708
|
||||
SH688611,14.590356909663269,0.007055400973451212,20.086420837333478,8.190764061701755,65.59082986729103,0.5112409135562926,85.23,83.43,18.108108108108112,98.35164835164835,8.243243243243244,9.065155807365443,97.00680272108843,52.702702702702695,1.3698630136986356,3.978052126200271,5.447844370651477,709
|
||||
SZ000676,4.6266158590091235,0.08599243455496167,15.825804197807477,5.504899593641255,15.27333520990691,0.42093583718921995,77.78,46.4,68.24324324324324,42.307692307692314,4.864864864864865,34.84419263456091,30.8843537414966,23.37837837837838,4.383561643835621,37.03703703703704,5.426415030220671,710
|
||||
SZ002771,28.406406247692097,0.3016857784147185,33.2440792051361,5.6670047363649605,15.832688854910385,0.17253162506070907,12.740000000000002,31.259999999999998,4.86486486486486,14.972527472527474,26.756756756756754,29.320113314447593,31.700680272108844,6.891891891891892,93.83561643835617,61.59122085048011,5.413802752756023,711
|
||||
SH688409,13.26162674557093,0.10960425122977402,44.903032773062584,6.254624502073005,24.147336351640536,0.11310435676760268,27.66,78.81,21.486486486486488,34.2032967032967,45.94594594594595,20.396600566572243,54.01360544217687,4.324324324324325,59.45205479452055,6.310013717421126,5.409648090252579,712
|
||||
BJ835207,6.00954192487038,0.1822754668408943,48.8470760568756,,17.75056037720721,0.14560066809161684,58.42,62.03999999999999,56.351351351351354,24.313186813186817,52.83783783783784,0.0,35.374149659863946,5.9459459459459465,16.02739726027397,17.28395061728395,5.3892292494061556,713
|
||||
SH688691,13.267745358415278,0.22038226718715204,25.01535099051419,4.7361916933025885,21.620448168721307,0.4505438868923527,82.02,42.57,21.21621621621622,20.05494505494505,14.864864864864865,69.68838526912181,45.85034013605443,28.64864864864865,2.328767123287667,42.661179698216735,5.3769212579867816,714
|
||||
SZ002173,12.623108387368298,,18.52244577204816,6.739883271499981,8.959298831974046,0.23208648664294437,23.14,0.69,22.702702702702705,0.0,6.891891891891892,16.43059490084986,15.918367346938775,9.72972972972973,69.45205479452055,99.86282578875172,5.342677152000619,715
|
||||
SZ003005,41.19424687867698,0.08831968113619727,14.236623620345545,9.490526852525436,45.325805611884086,0.501712302916135,47.5,36.73,2.972972972972976,41.34615384615385,3.9189189189189193,4.815864022662886,88.9795918367347,44.86486486486487,26.027397260273975,53.360768175583,5.342336052607415,716
|
||||
SH688130,24.432216233574316,0.04396111716911166,8.73242980130143,5.049589488728876,54.362800356361475,0.04126746805544525,91.32,35.15,6.081081081081086,66.4835164835165,1.6216216216216217,52.54957507082153,93.74149659863946,0.2702702702702703,0.4109589041095929,55.692729766803836,5.328480295498826,717
|
||||
SZ301182,8.627305834383671,0.09264094196748397,57.411403193097655,5.198740365911045,-14.13067271631808,0.48407778345307934,65.16,75.78,37.70270270270271,40.10989010989011,68.37837837837839,44.90084985835694,0.27210884353741494,35.810810810810814,11.095890410958908,8.230452674897116,5.304103958885558,718
|
||||
BJ836414,17.70515880546457,0.07825667136478665,24.357264747642198,,36.4687540290481,0.23021979706753587,40.42,57.71000000000001,12.567567567567572,45.604395604395606,13.378378378378377,0.0,79.45578231292517,9.594594594594595,35.06849315068493,22.22222222222222,5.233411588755244,719
|
||||
SH600751,5.600474765342389,,15.76565647623402,6.018476894520223,7.434882037188169,0.4889723335353934,59.28,34.59,60.270270270270274,0.0,4.72972972972973,23.654390934844194,12.51700680272109,37.2972972972973,14.657534246575343,56.37860082304527,5.215350953954022,720
|
||||
SH600658,19.982041696637822,0.5368825945056361,64.13077256381918,8.148572370805288,29.91929546123002,0.22540861583762223,37.63,50.55,9.459459459459463,8.653846153846157,80.54054054054053,9.206798866855525,68.43537414965986,9.18918918918919,40.205479452054796,31.001371742112482,5.197883361830571,721
|
||||
SZ300805,2.584473378092495,1.0226466377988546,26.8431075453943,5.604638480289897,8.327896676334184,0.4922969096786759,58.91,43.83,87.16216216216216,4.5329670329670275,16.216216216216218,31.869688385269125,14.285714285714285,38.108108108108105,14.931506849315069,41.1522633744856,5.15055373366282,722
|
||||
SH688172,56.885751769417425,0.05913034902044477,22.187854039128716,4.526891674065345,9.51073602899157,0.057022703905875,37.64,41.53,1.4864864864864824,55.494505494505496,10.81081081081081,83.42776203966005,17.551020408163264,1.6216216216216217,40.0,44.307270233196164,5.1496772728594555,723
|
||||
BJ838971,6.528704098264954,0.06481369381831417,14.246507785920667,,12.227404792404235,0.37027080413581026,73.02,45.78,51.08108108108108,52.472527472527474,4.054054054054054,0.0,22.993197278911566,18.243243243243242,6.164383561643838,38.134430727023314,4.937979941940273,724
|
||||
SZ300612,17.26365883491092,1.4871135516994853,30.168887833335383,4.851979910683749,31.892652494749395,0.5351726610596704,82.47,73.26,13.378378378378375,3.296703296703296,21.35135135135135,61.1898016997167,72.10884353741497,61.75675675675676,1.9178082191780854,9.465020576131689,4.933137357083002,725
|
||||
SZ300629,23.385317803094516,0.09570423641800865,15.219735798279679,5.254360232911927,56.749814916754794,0.06402848357938733,28.54,86.91,6.756756756756754,39.01098901098901,4.45945945945946,42.63456090651558,94.6938775510204,2.027027027027027,57.945205479452056,2.6063100137174167,4.902089164246677,726
|
||||
SZ301306,17.361922104235752,0.05762649615354911,36.213452218873236,10.291651280978838,8.160071534517078,0.5103263405241769,35.2,77.61,13.108108108108107,56.59340659340659,31.62162162162162,3.399433427762044,14.013605442176871,51.621621621621614,44.38356164383561,7.133058984910834,4.8723989409295045,727
|
||||
SZ301217,0.4456303040540777,0.07381922288761728,26.417883230195017,16.566666072125987,2.7226115263650645,0.5610391820448616,83.22,66.89,99.72972972972973,47.39010989010989,15.945945945945947,0.7082152974504208,3.8095238095238098,69.05405405405406,1.7808219178082174,12.620027434842251,4.832393810283094,728
|
||||
SZ300474,20.03658768149321,0.07387131627836152,6.36466315621481,5.847959174852561,32.36940023629493,0.130136242970597,33.44,58.540000000000006,9.32432432432433,47.25274725274725,0.6756756756756757,26.06232294617564,72.38095238095238,5.135135135135135,48.150684931506845,20.713305898491086,4.810854436245089,729
|
||||
SZ300735,6.572949337027978,0.0377018995901203,31.150872188950867,8.865958590274372,11.33652505135129,0.3190630070752435,49.87,72.23,50.27027027027027,71.56593406593407,22.56756756756757,5.8073654390934815,22.040816326530614,13.243243243243244,23.9041095890411,9.876543209876543,4.734424202846067,730
|
||||
SZ300928,7.822195960748064,0.03193384151152606,11.544179075283582,4.585900976344074,6.761705049568609,0.32356431844086864,88.88,66.77,41.62162162162162,76.0989010989011,2.5675675675675675,79.88668555240793,10.884353741496598,13.648648648648647,0.9589041095890427,12.757201646090532,4.7137022808449345,731
|
||||
SH600193,1811.2669680463455,0.025487309150755037,81.81909963606785,6.1270499381378665,-34.72985922864299,0.36444643048593145,52.68000000000001,81.23,0.13513513513513375,82.6923076923077,96.62162162162163,21.813031161473084,0.13605442176870747,17.56756756756757,20.684931506849313,5.075445816186552,4.6923242556353655,732
|
||||
SH600666,20.16809007943744,0.2594552276340158,52.295873619357025,7.984732450167983,7.218755884053916,0.6304281019798531,52.51,61.75999999999999,9.189189189189184,17.994505494505496,58.108108108108105,9.915014164305946,11.972789115646258,78.78378378378378,20.95890410958904,17.695473251028805,4.670614687480749,733
|
||||
SH603003,14.167254983963945,0.7110440430956482,13.123970231373061,,25.34414220874132,0.4821643430472473,57.00999999999999,43.98,19.594594594594593,6.730769230769229,3.1081081081081083,0.0,57.55102040816327,35.4054054054054,17.53424657534246,41.015089163237306,4.651737728048435,734
|
||||
SH600977,9.969805441958357,0.6518694355798587,43.37221449103556,8.397868054830392,-3.1746173184756685,0.2828140511254047,42.65,8.44,30.94594594594594,7.417582417582413,43.108108108108105,8.498583569405094,1.6326530612244898,11.486486486486488,32.1917808219178,96.02194787379973,4.617185939283228,735
|
||||
SH688287,50.13223029950227,0.9226782573279386,6.283951315811976,5.917160493367442,16.10316212956001,0.3365353561752017,35.17,23.44,1.8918918918918948,5.082417582417587,0.5405405405405406,25.21246458923513,32.10884353741497,14.864864864864865,44.589041095890416,72.70233196159121,4.135166607287788,736
|
||||
SZ301024,46.99230453071696,0.05013674323250598,27.214562831174,6.83809723231419,-5.771772281045432,0.14286871811616164,27.169999999999998,48.79,2.0270270270270285,61.126373626373635,16.62162162162162,15.580736543909346,1.2244897959183674,5.675675675675676,60.68493150684932,33.19615912208504,4.125945763080535,737
|
||||
430139,20.198683279113645,0.002188247709111212,15.863939104696986,,20.038653101644467,0.06791357276023731,66.06,70.56,9.05405405405405,99.72527472527473,5.0,0.0,42.857142857142854,2.1621621621621623,10.547945205479447,10.699588477366252,4.001509123529673,738
|
||||
SH600868,40.07260761347074,1.015925385526408,30.200880617135784,5.255466833989001,0.003995127369166393,0.45027747147480546,15.68,76.0,3.1081081081081097,4.670329670329664,21.486486486486488,42.49291784702549,1.9047619047619049,28.513513513513512,87.67123287671232,8.093278463648835,3.998589359874704,739
|
||||
SZ002218,13.941498626127785,1.58853218177339,39.61501808351609,6.200315061229268,7.543759827328925,0.04502779023189498,29.549999999999997,60.15999999999999,19.864864864864863,2.8846153846153855,37.16216216216216,21.671388101983002,12.925170068027212,0.5405405405405406,55.958904109589035,19.20438957475995,3.91447779263361,740
|
||||
|
File diff suppressed because it is too large
Load Diff
|
|
@ -224,11 +224,11 @@ class FinancialDataCollectorV2:
|
|||
# 简化逻辑:直接从2025年开始往前推21个季度
|
||||
base_year = 2025
|
||||
base_quarters = [
|
||||
(2025, 6), (2025, 3), (2024, 12), (2024, 9), (2024, 6), (2024, 3),
|
||||
(2025, 9), (2025, 6), (2025, 3), (2024, 12), (2024, 9), (2024, 6), (2024, 3),
|
||||
(2023, 12), (2023, 9), (2023, 6), (2023, 3),
|
||||
(2022, 12), (2022, 9), (2022, 6), (2022, 3),
|
||||
(2021, 12), (2021, 9), (2021, 6), (2021, 3),
|
||||
(2020, 12), (2020, 9), (2020, 6)
|
||||
(2020, 12), (2020, 9)
|
||||
]
|
||||
|
||||
if i < len(base_quarters):
|
||||
|
|
|
|||
|
|
@ -597,7 +597,7 @@ def main():
|
|||
analyzer = OverlapAnalyzer()
|
||||
|
||||
# 示例:分析某只股票的重叠度
|
||||
stock_code = "300661.SZ" # 圣邦股份
|
||||
stock_code = "301308.SZ" # 圣邦股份
|
||||
|
||||
print(f"=== 股票重叠度分析:{stock_code} ===")
|
||||
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ class TechFundamentalFactorStrategy:
|
|||
logger.info(f"计算 {len(stock_codes)} 只股票的通用因子")
|
||||
|
||||
results = []
|
||||
latest_date = "2025-06-30" # 最新季度数据
|
||||
latest_date = "2025-09-30" # 最新季度数据
|
||||
annual_date = "2024-12-31" # 年报数据
|
||||
|
||||
for stock_code in stock_codes:
|
||||
|
|
@ -246,7 +246,7 @@ class TechFundamentalFactorStrategy:
|
|||
logger.info(f"计算 {len(stock_codes)} 只成长期股票的特色因子")
|
||||
|
||||
results = []
|
||||
latest_date = "2025-06-30" # 使用最新数据
|
||||
latest_date = "2025-09-30" # 使用最新数据
|
||||
annual_date = "2024-12-31" # 使用年度数据
|
||||
|
||||
for stock_code in stock_codes:
|
||||
|
|
@ -305,7 +305,7 @@ class TechFundamentalFactorStrategy:
|
|||
try:
|
||||
logger.info(f"计算 {len(stock_codes)} 只成熟期股票的特色因子")
|
||||
|
||||
latest_date = "2025-06-30" # 使用最新数据
|
||||
latest_date = "2025-09-30" # 使用最新数据
|
||||
|
||||
# 在循环外获取全A股PB和ROE数据,避免重复查询
|
||||
logger.info("获取全A股PB数据...")
|
||||
|
|
@ -669,7 +669,7 @@ def main():
|
|||
try:
|
||||
print("=== 科技主题基本面因子选股策略 ===")
|
||||
print("数据说明:")
|
||||
print("- 毛利率、净利润增长率等:使用最新数据 (2025-06-30)")
|
||||
print("- 毛利率、净利润增长率等:使用最新数据 (2025-09-30)")
|
||||
print("- 供应商客户集中度、折旧摊销、研发费用:使用年报数据 (2024-12-31)")
|
||||
print()
|
||||
|
||||
|
|
|
|||
|
|
@ -298,3 +298,6 @@ if __name__ == '__main__':
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ XUEQIU_HEADERS = {
|
|||
'Accept-Encoding': 'gzip, deflate, br, zstd',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
||||
'Client-Version': 'v2.44.75',
|
||||
'Cookie': 'cookiesu=811743062689927; device_id=33fa3c7fca4a65f8f4354e10ed6b7470; smidV2=20250327160437f244626e8b47ca2a7992f30f389e4e790074ae48656a22f10; HMACCOUNT=8B64A2E3C307C8C0; s=c611ttmqlj; xq_is_login=1; u=8493411634; bid=4065a77ca57a69c83405d6e591ab5449_m8r2nhs8; __utma=1.434320573.1747189698.1747189698.1747189698.1; __utmc=1; __utmz=1.1747189698.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); snbim_minify=true; _c_WBKFRo=dsWgHR8i8KGPbIyhFlN51PHOzVuuNytvUAFppfkD; _nb_ioWEgULi=; aliyungf_tc=00c6b999835b16cea9e4a6aab36cca373a0976bf55ee74770d11f421f7119ad8; Hm_lvt_1db88642e346389874251b5a1eded6e3=1760079937; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=cL1C7SjsshX5JK0Re7ihF6dZxxNiOAPyX1snDwPjwIcOT4loJZk0lvOmuGrSePCN89PG5UQYB5CVV6XtcSAIMw%3D%3D; xq_a_token=716a8b0d84aecdccf652cf125bfe9733d3a66c6e; xqat=716a8b0d84aecdccf652cf125bfe9733d3a66c6e; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjg0OTM0MTE2MzQsImlzcyI6InVjIiwiZXhwIjoxNzYyOTEyMjgyLCJjdG0iOjE3NjAzMjAyODI0MzEsImNpZCI6ImQ5ZDBuNEFadXAifQ.cFoUZrJkZMr55bCXCQpoPsTfLpyU6Es3ieEgNLwCsSd_ty3jysDF8eVjaZCXo9u0qcl15kK2tb1KYaA2_cqpFOhhfBBE6WvHIaMtzp8EWW5LhCuCfX0cGgsqua9hsE6HLCIxAM7ZUzYvR_bm-tRJWkVUrKFyyoTLn6NVSyub8eya2y9Dpd0B3n-FbDUbuRs6QIVNOVnE8OlGsBXHUOdMTo2s1-PGzZ3Qaw-LwBR3hkCBLZzeIkpGllESWATfNQ0xgOtRXwG-HO189JqmdEtEEpXiu1aXvvOerNuCxJpY-1QHS7UNYrUy6u36bz6xKVzcXnfrTn_aannNoTGDuMldEg; xq_r_token=eec2f02f63dc672682f60584946e2e697f19d846; acw_tc=b65cfd2717603418882762100e56b805ecd396f75d259a0af2bbedda624afd; is_overseas=0; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1760342262; ssxmod_itna=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3RpDDq7x4/K07np1DBw4qrDnqD80DQeDvexkGwzMFnw2b33N7hRtdeSEjvFpvTVc4RnEXGF=MSnVriUCrKexGLDY=DCqe4exrrDYYfDBYD74G_DDeDih3Dj4GmDGYtOeDFfCuNq6R5=xDwDB=DmLqTfeDEDG3D0fRxFLv3wW4DGqDS8=BWxD3Df4uzDDXz_UvqIj5DbEbN5laTS77ilm43feDMWxGX7BCsqK1cMhWNxHCLrS2FkPGuDG6Ogj0tQqQO3i2YLo44QDmmirjP4BDr0DpD43BDd0dimGxY_4BD3liiDxe4eqiD3nqdBDwn010bm2R6jpxjAMEX/aEVPirDr7eIgnv6lpz7GAOGT9bzlwGmDT/0Y_x=FRY0b47xxD; ssxmod_itna2=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3RpDDq7x4/K07nPrDGbWNrdkSmoT3Mnld744WYBD8yz4D',
|
||||
'Cookie': 'cookiesu=811743062689927; device_id=33fa3c7fca4a65f8f4354e10ed6b7470; HMACCOUNT=8B64A2E3C307C8C0; s=c611ttmqlj; xq_is_login=1; u=8493411634; bid=4065a77ca57a69c83405d6e591ab5449_m8r2nhs8; snbim_minify=true; _c_WBKFRo=dsWgHR8i8KGPbIyhFlN51PHOzVuuNytvUAFppfkD; _nb_ioWEgULi=; xq_a_token=ad294f938ec0f4739cf2240e92a5af63fe65cb92; xqat=ad294f938ec0f4739cf2240e92a5af63fe65cb92; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjg0OTM0MTE2MzQsImlzcyI6InVjIiwiZXhwIjoxNzY0MjI1NDgwLCJjdG0iOjE3NjE2MzM0ODA1MzksImNpZCI6ImQ5ZDBuNEFadXAifQ.QqKHMHHgh3_dcAjowcKT8GGsT-BC-GIidxMHoIQy_B7SlpX9LtkekXnUcc0mZkXk3TxLzs8F9MDfEIwpt55f_6-KQaNvXFOfkCdwIyWCyL5ZFA2gE_Dq0-3SoUf-TsYrCQ8TlBzBFojBgOIXFQrO_NBjXrqlIzSHVTtaAB0L9eUacvNGz8FHjhlgUh94nbOD5Y8kGoBG82AWlOkTtgPAQMyEWfrSc_IoJZ6lFehNKEfb3nDJoPUKAIBehoBhKUW7EqPfCeTPiZR9Oi48kliIbgXxYBaCO00L9B22f1WmtQsMvqI_0d5DSTvEd8J41IUKD6HSkOu5gG9qofUkLq_pvg; xq_r_token=bbc04b7f580b6a117c028e2b94470e868df34c17; acw_tc=1a0c640317627700667987423e7e8ee1ddcd7f4497028b2e109476f97be4b9; Hm_lvt_1db88642e346389874251b5a1eded6e3=; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1762770472; ssxmod_itna=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtT=03RpC7DDuDGVCQ7y_1DBw4qrDnqD80DQeDvexkGws5xRGopp5jiOvP4VFbQZPnocKt=MujHXmU8ieb3HmxrDCPDExGkSoRhDeWaDCeDQxirDD4DAWPDFxibDiWIo4Ddb_ovz3owIDGrDlKDRchob4GWDiPD7ogDLoEwbDDCDivfZ83Dixiaa/qDBZTuVCDmVDi3bUEGj8b5V4RIWihmD7v3DlPqwVwmZbUgVeSICM6no2Aff40OD0KjOb75uWgASW_mIYY0Db_xPxHYGqexqF4YAGqjiUDr4QbxCDP7YYGixxhiYDP/hPC0Y3qHiEYYIsYixaAYK0hAyZnvmBvVerqo0qcqYi7bbGPbbT/RNK_xKEqk4Nl2r5D5QGPCYKUAxBEdHAPeD; ssxmod_itna2=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtT=03RpC7DDuDGVCQ7y4rDG85vwVDx7peGKDp45Dlxw3WOWG4_hF4WbDpQWdtYAc4wA0A0ASpeo0tBkC4GEGphP1PPYVAPqVlwarEIsoKyNIrYFtRPYGQOHlrhmSEor7PFIrcDFspYx41oxoKOhKDK7jpiaeegpRO9qGaYPA4cDax_sRZuL0mH_Zt08/gpqOKCh5TyXqHFHRZLq8xC_dvYY9oKtORvmKVfmxUP7HFaCG=DFLuij7OQPGuIzd3XQ7dpKx0x7xQxwng5lP6baXBmtzxvj2EvPvvoo4ni47tz6ULojbPE1hP4ljqnv2CIY2KBaN3Dhr/pY1vKKE6gAXWeixi576Umt9CTAi3BpAgGETaGrIoE0dAB662vmgGMmjuGDUOpSooOeplYR67KhYb=mKL0T7_6xaY3S2ho3M1QxOrxKvDOolYYM6UG=Q/lATUtMFYuDq63XGfDQZpYj=BxX=ad5BG1D4YGA1mjE7HieA=OOzZpR0g9PYd7erlqWL8K0G1AxsWjl7Dq7xav83jqWdD',
|
||||
'Referer': 'https://weibo.com/u/7735765253',
|
||||
'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
|
||||
'Sec-Ch-Ua-Mobile': '?0',
|
||||
|
|
@ -125,4 +125,7 @@ def get_model_config(platform: str, model_type: str) -> dict:
|
|||
"base_url": platform_config["base_url"],
|
||||
"api_key": platform_config["api_key"],
|
||||
"model": platform_config["models"][model_type]
|
||||
}
|
||||
}
|
||||
|
||||
# Tushare配置
|
||||
TUSHARE_TOKEN = 'ecac9722ee695a9f67a1dfb98e0ba71c72f088714795b7609f0e9390' # 请替换为您的实际Tushare Token
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
# coding:utf-8
|
||||
|
||||
import requests
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
|
|
@ -25,9 +24,9 @@ class StockDailyDataCollector:
|
|||
|
||||
def fetch_all_stock_codes(self):
|
||||
# 从gp_code_all获取股票代码
|
||||
query_all = "SELECT gp_code FROM gp_code_all"
|
||||
df_all = pd.read_sql(query_all, self.engine)
|
||||
codes_all = df_all['gp_code'].tolist()
|
||||
# query_all = "SELECT gp_code FROM gp_code_all"
|
||||
# df_all = pd.read_sql(query_all, self.engine)
|
||||
# codes_all = df_all['gp_code'].tolist()
|
||||
|
||||
# 从gp_code_zs获取股票代码
|
||||
query_zs = "SELECT gp_code FROM gp_code_zs"
|
||||
|
|
@ -42,7 +41,7 @@ class StockDailyDataCollector:
|
|||
# 合并去重
|
||||
# all_codes = list(set(codes_all + codes_zs + codes_hk))
|
||||
all_codes = list(set(codes_zs + codes_hk))
|
||||
print(f"获取到股票代码: {len(codes_all)} 个来自gp_code_all, {len(codes_zs)}个来自gp_code_zs, {len(codes_hk)}个来自gp_code_hk, 去重后共{len(all_codes)}个")
|
||||
print(f"获取到股票代码: {len(codes_zs)}个来自gp_code_zs, {len(codes_hk)}个来自gp_code_hk, 去重后共{len(all_codes)}个")
|
||||
return all_codes
|
||||
|
||||
def fetch_daily_stock_data(self, symbol, begin, count=-1):
|
||||
|
|
|
|||
|
|
@ -0,0 +1,994 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
股票日线数据采集器V3版本 - 基于Tushare数据源
|
||||
作者: AI Assistant
|
||||
创建时间: 2025-11-03
|
||||
功能:
|
||||
1. 从Tushare采集A股日线行情数据
|
||||
2. 从Tushare采集每日指标数据
|
||||
3. 整合两个数据源并存储到gp_day_data表
|
||||
4. 支持历史数据采集(1800天)
|
||||
5. 支持增量更新(当日数据)
|
||||
6. 自动处理除权除息问题
|
||||
每天15~16点左右更新
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import gc
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.append(project_root)
|
||||
|
||||
# 导入配置
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class StockDailyDataCollectorV3:
|
||||
"""股票日线数据采集器V3版本 - 基于Tushare"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='gp_day_data', basic_table_name='gp_day_basic'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 日线数据表名,默认为gp_day_data(不影响原有业务)
|
||||
basic_table_name: 每日指标数据表名,默认为gp_day_basic
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
|
||||
# 目标数据表名
|
||||
self.table_name = table_name
|
||||
self.basic_table_name = basic_table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print(f"股票日线数据采集器V3 - Tushare版本")
|
||||
print(f"日线数据表: {self.table_name}")
|
||||
print(f"指标数据表: {self.basic_table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_stock_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001、BJ430047 等
|
||||
Tushare格式:600000.SH、000001.SZ、430047.BJ 等
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if symbol.startswith('SH'):
|
||||
return f"{symbol[2:]}.SH"
|
||||
elif symbol.startswith('SZ'):
|
||||
return f"{symbol[2:]}.SZ"
|
||||
elif symbol.startswith('BJ'):
|
||||
return f"{symbol[2:]}.BJ"
|
||||
else:
|
||||
# 如果已经是Tushare格式,直接返回
|
||||
return symbol
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ、430047.BJ 等
|
||||
数据库格式:SH600000、SZ000001、BJ430047 等
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def fetch_all_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有需要采集的A股股票代码
|
||||
仅从gp_code_all表获取,指数(gp_code_zs)和港股(gp_code_hk)由其他脚本处理
|
||||
|
||||
Returns:
|
||||
股票代码列表
|
||||
"""
|
||||
try:
|
||||
# 只从gp_code_all获取A股股票代码
|
||||
query = "SELECT gp_code FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
codes = df['gp_code'].tolist()
|
||||
|
||||
print(f"获取到A股股票代码: {len(codes)}个")
|
||||
print(f"注意: 指数和港股由其他采集脚本处理")
|
||||
|
||||
return codes
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_stock_daily_data(self, ts_code=None, start_date=None, end_date=None, trade_date=None):
|
||||
"""
|
||||
从Tushare获取日线行情数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=27
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
start_date: 开始日期,格式YYYYMMDD(用于历史数据查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(用于历史数据查询)
|
||||
trade_date: 交易日期,格式YYYYMMDD(用于单日查询,优先级高于start_date/end_date)
|
||||
|
||||
Returns:
|
||||
日线行情DataFrame
|
||||
"""
|
||||
try:
|
||||
if trade_date:
|
||||
# 单日查询:获取指定日期的全市场或单只股票数据
|
||||
df = self.pro.daily(ts_code=ts_code, trade_date=trade_date)
|
||||
else:
|
||||
# 范围查询:用于历史数据采集
|
||||
df = self.pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
|
||||
|
||||
time.sleep(0.1) # API限频控制
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取日线行情失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def fetch_stock_daily_basic(self, ts_code=None, start_date=None, end_date=None, trade_date=None):
|
||||
"""
|
||||
从Tushare获取每日指标数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=32
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
start_date: 开始日期,格式YYYYMMDD(用于历史数据查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(用于历史数据查询)
|
||||
trade_date: 交易日期,格式YYYYMMDD(用于单日查询,优先级高于start_date/end_date)
|
||||
|
||||
Returns:
|
||||
每日指标DataFrame
|
||||
"""
|
||||
try:
|
||||
if trade_date:
|
||||
# 单日查询:获取指定日期的全市场或单只股票数据
|
||||
df = self.pro.daily_basic(
|
||||
ts_code=ts_code,
|
||||
trade_date=trade_date,
|
||||
fields='ts_code,trade_date,turnover_rate,turnover_rate_f,volume_ratio,pe,pe_ttm,pb,ps,ps_ttm,dv_ratio,dv_ttm,total_share,float_share,free_share,total_mv,circ_mv'
|
||||
)
|
||||
else:
|
||||
# 范围查询:用于历史数据采集
|
||||
df = self.pro.daily_basic(
|
||||
ts_code=ts_code,
|
||||
start_date=start_date,
|
||||
end_date=end_date,
|
||||
fields='ts_code,trade_date,turnover_rate,turnover_rate_f,volume_ratio,pe,pe_ttm,pb,ps,ps_ttm,dv_ratio,dv_ttm,total_share,float_share,free_share,total_mv,circ_mv'
|
||||
)
|
||||
|
||||
time.sleep(0.1) # API限频控制
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取每日指标失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def merge_and_transform_data(self, df_daily, df_basic, symbol=None):
|
||||
"""
|
||||
合并日线行情和每日指标数据,并转换为数据库格式
|
||||
|
||||
Args:
|
||||
df_daily: 日线行情DataFrame
|
||||
df_basic: 每日指标DataFrame
|
||||
symbol: 数据库格式的股票代码(单只股票时使用),为None时从ts_code转换
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df_daily.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 合并两个数据源
|
||||
if not df_basic.empty:
|
||||
df = pd.merge(
|
||||
df_daily,
|
||||
df_basic[['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'pb', 'ps']],
|
||||
on=['ts_code', 'trade_date'],
|
||||
how='left'
|
||||
)
|
||||
else:
|
||||
df = df_daily.copy()
|
||||
# 如果没有指标数据,添加空列
|
||||
df['turnover_rate'] = None
|
||||
df['pe_ttm'] = None
|
||||
df['pb'] = None
|
||||
df['ps'] = None
|
||||
|
||||
# 创建符合gp_day_data表结构的DataFrame
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射和转换
|
||||
result_df['timestamp'] = pd.to_datetime(df['trade_date'].values, format='%Y%m%d')
|
||||
result_df['volume'] = df['vol'].values * 100 # Tushare的vol单位是手(100股),需要转换为股
|
||||
result_df['open'] = df['open'].values
|
||||
result_df['high'] = df['high'].values
|
||||
result_df['low'] = df['low'].values
|
||||
result_df['close'] = df['close'].values
|
||||
result_df['chg'] = df['change'].values
|
||||
result_df['percent'] = df['pct_chg'].values
|
||||
result_df['turnoverrate'] = df['turnover_rate'].values
|
||||
result_df['amount'] = df['amount'].values * 1000 # Tushare的amount单位是千元,需要转换为元
|
||||
result_df['pb'] = df['pb'].values
|
||||
result_df['pe'] = df['pe_ttm'].values
|
||||
result_df['ps'] = df['ps'].values
|
||||
result_df['pre_close'] = df['pre_close'].values
|
||||
|
||||
# symbol字段处理:如果传入了symbol则使用,否则从ts_code转换
|
||||
if symbol is not None:
|
||||
result_df['symbol'] = symbol # 单只股票:标量值会自动广播到所有行
|
||||
else:
|
||||
# 批量数据:从ts_code转换为数据库格式
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
|
||||
# 按时间排序
|
||||
result_df = result_df.sort_values('timestamp').reset_index(drop=True)
|
||||
|
||||
return result_df
|
||||
|
||||
def transform_basic_data(self, df_daily, df_basic, symbol=None):
|
||||
"""
|
||||
转换每日指标数据为数据库格式
|
||||
|
||||
Args:
|
||||
df_daily: 日线行情DataFrame(用于获取收盘价)
|
||||
df_basic: 每日指标DataFrame
|
||||
symbol: 数据库格式的股票代码(单只股票时使用),为None时从ts_code转换
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df_basic.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 如果有日线数据,合并获取收盘价
|
||||
if not df_daily.empty:
|
||||
df = pd.merge(
|
||||
df_basic,
|
||||
df_daily[['ts_code', 'trade_date', 'close']],
|
||||
on=['ts_code', 'trade_date'],
|
||||
how='left'
|
||||
)
|
||||
else:
|
||||
df = df_basic.copy()
|
||||
df['close'] = None
|
||||
|
||||
# 创建符合gp_day_basic表结构的DataFrame
|
||||
basic_df = pd.DataFrame()
|
||||
|
||||
# 字段映射和转换
|
||||
basic_df['timestamp'] = pd.to_datetime(df['trade_date'].values, format='%Y%m%d')
|
||||
basic_df['close'] = df['close'].values
|
||||
basic_df['turnover_rate'] = df['turnover_rate'].values
|
||||
basic_df['turnover_rate_f'] = df.get('turnover_rate_f', pd.Series([None] * len(df))).values
|
||||
basic_df['volume_ratio'] = df.get('volume_ratio', pd.Series([None] * len(df))).values
|
||||
basic_df['pe'] = df.get('pe', pd.Series([None] * len(df))).values
|
||||
basic_df['pe_ttm'] = df['pe_ttm'].values
|
||||
basic_df['pb'] = df['pb'].values
|
||||
basic_df['ps'] = df['ps'].values
|
||||
basic_df['ps_ttm'] = df.get('ps_ttm', pd.Series([None] * len(df))).values
|
||||
basic_df['dv_ratio'] = df.get('dv_ratio', pd.Series([None] * len(df))).values
|
||||
basic_df['dv_ttm'] = df.get('dv_ttm', pd.Series([None] * len(df))).values
|
||||
basic_df['total_share'] = df.get('total_share', pd.Series([None] * len(df))).values
|
||||
basic_df['float_share'] = df.get('float_share', pd.Series([None] * len(df))).values
|
||||
basic_df['free_share'] = df.get('free_share', pd.Series([None] * len(df))).values
|
||||
basic_df['total_mv'] = df.get('total_mv', pd.Series([None] * len(df))).values
|
||||
basic_df['circ_mv'] = df.get('circ_mv', pd.Series([None] * len(df))).values
|
||||
|
||||
# symbol字段处理
|
||||
if symbol is not None:
|
||||
basic_df['symbol'] = symbol
|
||||
else:
|
||||
basic_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
|
||||
# 按时间排序
|
||||
basic_df = basic_df.sort_values('timestamp').reset_index(drop=True)
|
||||
|
||||
return basic_df
|
||||
|
||||
def fetch_historical_data(self, symbol, days=1800):
|
||||
"""
|
||||
获取单只股票近N天的历史数据
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
days: 获取的天数,默认1800天
|
||||
|
||||
Returns:
|
||||
是否成功
|
||||
"""
|
||||
try:
|
||||
# 转换股票代码格式
|
||||
ts_code = self.convert_stock_code_to_tushare(symbol)
|
||||
|
||||
# 计算日期范围
|
||||
end_date = datetime.now().strftime('%Y%m%d')
|
||||
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
|
||||
|
||||
# 获取日线行情数据
|
||||
df_daily = self.fetch_stock_daily_data(ts_code, start_date, end_date)
|
||||
if df_daily.empty:
|
||||
print(f"未获取到{symbol}的日线行情数据")
|
||||
return False
|
||||
|
||||
# 获取每日指标数据
|
||||
df_basic = self.fetch_stock_daily_basic(ts_code, start_date, end_date)
|
||||
|
||||
# 合并并转换数据
|
||||
df_result = self.merge_and_transform_data(df_daily, df_basic, symbol)
|
||||
|
||||
if df_result.empty:
|
||||
print(f"数据转换失败: {symbol}")
|
||||
return False
|
||||
|
||||
# 保存到日线数据表(使用配置的表名)
|
||||
df_result.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{symbol}的历史数据到{self.table_name}表,共{len(df_result)}条记录")
|
||||
|
||||
# 转换并保存每日指标数据
|
||||
basic_result = self.transform_basic_data(df_daily, df_basic, symbol)
|
||||
if not basic_result.empty:
|
||||
basic_result.to_sql(self.basic_table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{symbol}的指标数据到{self.basic_table_name}表,共{len(basic_result)}条记录")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取{symbol}历史数据失败: {e}")
|
||||
return False
|
||||
|
||||
def fetch_today_data(self, symbol, target_date=None):
|
||||
"""
|
||||
获取单只股票指定日期的数据
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
target_date: 目标日期,格式YYYY-MM-DD,默认为今天
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame,失败返回空DataFrame
|
||||
"""
|
||||
try:
|
||||
# 转换股票代码格式
|
||||
ts_code = self.convert_stock_code_to_tushare(symbol)
|
||||
|
||||
# 确定目标日期
|
||||
if target_date:
|
||||
# 将YYYY-MM-DD格式转换为YYYYMMDD
|
||||
date_obj = datetime.strptime(target_date, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
else:
|
||||
# 默认为今天
|
||||
trade_date = datetime.now().strftime('%Y%m%d')
|
||||
|
||||
# 获取日线行情数据(使用同一天作为起止日期)
|
||||
df_daily = self.fetch_stock_daily_data(ts_code, trade_date, trade_date)
|
||||
if df_daily.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 获取每日指标数据(使用同一天作为起止日期)
|
||||
df_basic = self.fetch_stock_daily_basic(ts_code, trade_date, trade_date)
|
||||
|
||||
# 合并并转换数据
|
||||
df_result = self.merge_and_transform_data(df_daily, df_basic, symbol)
|
||||
|
||||
return df_result
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取{symbol}在{target_date or '今日'}的数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def check_ex_rights_before_save(self, df, date_str):
|
||||
"""
|
||||
在保存数据库之前检查除权情况,返回除权股票列表和除权日志数据
|
||||
|
||||
Args:
|
||||
df: 待保存的日线数据DataFrame
|
||||
date_str: 当前采集日期,格式YYYY-MM-DD
|
||||
|
||||
Returns:
|
||||
tuple: (除权股票列表, 除权日志数据列表)
|
||||
"""
|
||||
print("正在检查除权情况...")
|
||||
|
||||
ex_rights_stocks = []
|
||||
ex_rights_log_data = []
|
||||
|
||||
for _, row in tqdm(df.iterrows(), total=len(df), desc="检查除权"):
|
||||
symbol = row['symbol']
|
||||
current_pre_close = row['pre_close']
|
||||
|
||||
# 如果pre_close为空,跳过
|
||||
if pd.isna(current_pre_close):
|
||||
continue
|
||||
|
||||
# 查询数据库中该股票的最近两条收盘价记录
|
||||
query = text("""
|
||||
SELECT `close`, `timestamp` FROM {table_name}
|
||||
WHERE symbol = :symbol
|
||||
ORDER BY `timestamp` DESC
|
||||
LIMIT 2
|
||||
""".format(table_name=self.table_name))
|
||||
|
||||
try:
|
||||
with self.engine.connect() as conn:
|
||||
results = conn.execute(query, {"symbol": symbol}).fetchall()
|
||||
|
||||
if results:
|
||||
# 检查最新记录是否为今天的数据
|
||||
latest_record = results[0]
|
||||
latest_timestamp = latest_record[1]
|
||||
latest_date_str = latest_timestamp.strftime('%Y-%m-%d')
|
||||
|
||||
if latest_date_str == date_str and len(results) > 1:
|
||||
# 如果最新记录是今天的,且有第二条记录,则用第二条记录比较
|
||||
db_last_close = float(results[1][0])
|
||||
else:
|
||||
# 如果最新记录不是今天的,或者只有一条记录,则用最新记录比较
|
||||
db_last_close = float(results[0][0])
|
||||
|
||||
# 比较pre_close和数据库中的收盘价
|
||||
if abs(db_last_close - current_pre_close) > 0.001:
|
||||
print(f"发现除权股票: {symbol}, 数据库收盘价: {db_last_close}, 当前昨收价: {current_pre_close}")
|
||||
ex_rights_stocks.append(symbol)
|
||||
|
||||
# 收集除权日志数据
|
||||
ex_rights_log_data.append({
|
||||
'stock_code': symbol,
|
||||
'change_date': date_str,
|
||||
'before_price': db_last_close,
|
||||
'after_price': current_pre_close,
|
||||
'update_time': datetime.now()
|
||||
})
|
||||
except Exception as e:
|
||||
# 如果查询失败(比如股票是新上市的),跳过
|
||||
continue
|
||||
|
||||
if ex_rights_stocks:
|
||||
print(f"检测到 {len(ex_rights_stocks)} 只除权股票: {ex_rights_stocks}")
|
||||
else:
|
||||
print("未发现除权股票")
|
||||
|
||||
return ex_rights_stocks, ex_rights_log_data
|
||||
|
||||
def save_ex_rights_log(self, log_data):
|
||||
"""
|
||||
将除权日志保存到数据库
|
||||
|
||||
Args:
|
||||
log_data: 除权日志数据列表
|
||||
"""
|
||||
if not log_data:
|
||||
return
|
||||
|
||||
print(f"正在保存 {len(log_data)} 条除权日志到gp_ex_rights_log表...")
|
||||
try:
|
||||
df = pd.DataFrame(log_data)
|
||||
df.to_sql('gp_ex_rights_log', self.engine, if_exists='append', index=False)
|
||||
print("除权日志保存成功")
|
||||
except Exception as e:
|
||||
print(f"保存除权日志失败: {e}")
|
||||
|
||||
def handle_ex_rights_stocks(self, ex_rights_stocks, ex_rights_log_data, days=1800):
|
||||
"""
|
||||
处理除权股票:保存日志、删除历史日线数据并重新获取
|
||||
注意:每日指标数据不需要重新获取,因为除权前后这些基础数据是一致的
|
||||
|
||||
Args:
|
||||
ex_rights_stocks: 除权股票列表
|
||||
ex_rights_log_data: 除权日志数据列表
|
||||
days: 重新获取的历史天数,默认1800天
|
||||
"""
|
||||
if not ex_rights_stocks:
|
||||
return
|
||||
|
||||
print("=" * 60)
|
||||
print("开始处理除权股票...")
|
||||
print("=" * 60)
|
||||
|
||||
# 1. 保存除权日志
|
||||
if ex_rights_log_data:
|
||||
self.save_ex_rights_log(ex_rights_log_data)
|
||||
|
||||
# 2. 重新获取历史日线数据(不包括每日指标数据)
|
||||
print(f"开始处理 {len(ex_rights_stocks)} 只除权股票,重新获取历史日线数据...")
|
||||
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
|
||||
for symbol in tqdm(ex_rights_stocks, desc="处理除权股票"):
|
||||
try:
|
||||
# 转换股票代码格式
|
||||
ts_code = self.convert_stock_code_to_tushare(symbol)
|
||||
|
||||
# 删除该股票的所有历史日线数据(仅删除日线数据,不删除指标数据)
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE symbol = :symbol")
|
||||
with self.engine.begin() as conn:
|
||||
result = conn.execute(delete_query, {"symbol": symbol})
|
||||
print(f"已删除 {symbol} 的 {result.rowcount} 条历史日线数据")
|
||||
|
||||
# 计算日期范围
|
||||
end_date = datetime.now().strftime('%Y%m%d')
|
||||
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
|
||||
|
||||
# 重新获取历史日线数据
|
||||
df_daily = self.fetch_stock_daily_data(ts_code, start_date, end_date)
|
||||
if df_daily.empty:
|
||||
print(f"未获取到{symbol}的日线行情数据")
|
||||
fail_count += 1
|
||||
continue
|
||||
|
||||
# 获取每日指标数据(用于合并,获取turnover_rate等字段)
|
||||
df_basic = self.fetch_stock_daily_basic(ts_code, start_date, end_date)
|
||||
|
||||
# 合并并转换数据
|
||||
df_result = self.merge_and_transform_data(df_daily, df_basic, symbol)
|
||||
|
||||
if df_result.empty:
|
||||
print(f"数据转换失败: {symbol}")
|
||||
fail_count += 1
|
||||
continue
|
||||
|
||||
# 保存到日线数据表(只保存日线数据,不更新指标数据)
|
||||
df_result.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功重新获取 {symbol} 的历史日线数据,共{len(df_result)}条记录")
|
||||
success_count += 1
|
||||
|
||||
except Exception as e:
|
||||
print(f"处理除权股票 {symbol} 失败: {e}")
|
||||
fail_count += 1
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("除权股票处理完成")
|
||||
print("=" * 60)
|
||||
print(f"成功: {success_count}只")
|
||||
print(f"失败: {fail_count}只")
|
||||
print("=" * 60)
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量数据采集(使用全市场批量获取方式,更高效)
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量数据采集(全市场批量获取)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧数据(日线数据表和指标数据表)
|
||||
# 使用timestamp范围查询代替DATE()函数,避免全表扫描,提升性能
|
||||
# 添加LENGTH(symbol) = 8限定条件,只删除A股数据(避免误删港股等其他数据)
|
||||
delete_start = f"{date_str} 00:00:00"
|
||||
delete_end = f"{date_str} 23:59:59"
|
||||
|
||||
with self.engine.begin() as conn:
|
||||
# 删除日线数据表的旧数据(只删除A股,symbol长度为8,如SH600000)
|
||||
delete_query_day = text(f"DELETE FROM {self.table_name} WHERE `timestamp` >= :start_time AND `timestamp` <= :end_time AND LENGTH(symbol) = 8")
|
||||
result_day = conn.execute(delete_query_day, {"start_time": delete_start, "end_time": delete_end})
|
||||
print(f"已删除{self.table_name}表中{date_str}的A股旧数据,共{result_day.rowcount}条")
|
||||
|
||||
# 删除指标数据表的旧数据(只删除A股)
|
||||
delete_query_basic = text(f"DELETE FROM {self.basic_table_name} WHERE `timestamp` >= :start_time AND `timestamp` <= :end_time AND LENGTH(symbol) = 8")
|
||||
result_basic = conn.execute(delete_query_basic, {"start_time": delete_start, "end_time": delete_end})
|
||||
print(f"已删除{self.basic_table_name}表中{date_str}的A股旧数据,共{result_basic.rowcount}条")
|
||||
|
||||
# 批量获取全市场日线数据(不传ts_code,获取所有股票)
|
||||
print(f"正在获取{date_str}全市场日线行情数据...")
|
||||
df_daily = self.fetch_stock_daily_data(trade_date=trade_date)
|
||||
|
||||
if df_daily.empty:
|
||||
print(f"{date_str}没有交易数据(可能是非交易日)")
|
||||
return
|
||||
|
||||
print(f"成功获取日线行情数据,共{len(df_daily)}只股票")
|
||||
|
||||
# 批量获取全市场每日指标数据
|
||||
print(f"正在获取{date_str}全市场每日指标数据...")
|
||||
df_basic = self.fetch_stock_daily_basic(trade_date=trade_date)
|
||||
print(f"成功获取每日指标数据,共{len(df_basic)}只股票")
|
||||
|
||||
# 合并并转换数据(不传symbol参数,自动从ts_code转换)
|
||||
print("正在合并和转换数据...")
|
||||
result_df = self.merge_and_transform_data(df_daily, df_basic)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据转换失败")
|
||||
return
|
||||
|
||||
# 检查除权(保存前)
|
||||
ex_rights_stocks, ex_rights_log_data = self.check_ex_rights_before_save(result_df, date_str)
|
||||
|
||||
# 保存到日线数据表
|
||||
print(f"正在保存日线数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}只股票的日线数据")
|
||||
|
||||
# 转换并保存每日指标数据
|
||||
print(f"正在保存指标数据到{self.basic_table_name}表...")
|
||||
basic_result = self.transform_basic_data(df_daily, df_basic)
|
||||
if not basic_result.empty:
|
||||
basic_result.to_sql(self.basic_table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(basic_result)}只股票的指标数据")
|
||||
else:
|
||||
print("警告:指标数据为空")
|
||||
|
||||
# 处理除权股票(保存后)
|
||||
self.handle_ex_rights_stocks(ex_rights_stocks, ex_rights_log_data)
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日数据采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"成功采集: {len(result_df)}只股票")
|
||||
print(f"除权处理: {len(ex_rights_stocks)}只股票")
|
||||
print(f"日线数据表: {self.table_name}")
|
||||
print(f"指标数据表: {self.basic_table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日数据采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
gc.collect()
|
||||
|
||||
def run_historical_collection(self, days=1800):
|
||||
"""
|
||||
执行历史数据批量采集
|
||||
|
||||
Args:
|
||||
days: 获取的天数,默认1800天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print(f"开始执行历史数据批量采集 - 近{days}天")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 获取所有股票代码
|
||||
stock_codes = self.fetch_all_stock_codes()
|
||||
if not stock_codes:
|
||||
print("未获取到股票代码,终止采集")
|
||||
return
|
||||
|
||||
# 统计信息
|
||||
success_count = 0
|
||||
failed_count = 0
|
||||
|
||||
# 遍历所有股票
|
||||
for symbol in tqdm(stock_codes, desc=f"采集近{days}天历史数据"):
|
||||
try:
|
||||
# 先删除该股票的历史数据(日线数据表和指标数据表)
|
||||
with self.engine.begin() as conn:
|
||||
# 删除日线数据
|
||||
delete_query_day = text(f"DELETE FROM {self.table_name} WHERE symbol = :symbol")
|
||||
conn.execute(delete_query_day, {"symbol": symbol})
|
||||
|
||||
# 删除指标数据
|
||||
delete_query_basic = text(f"DELETE FROM {self.basic_table_name} WHERE symbol = :symbol")
|
||||
conn.execute(delete_query_basic, {"symbol": symbol})
|
||||
|
||||
# 获取历史数据
|
||||
if self.fetch_historical_data(symbol, days):
|
||||
success_count += 1
|
||||
else:
|
||||
failed_count += 1
|
||||
|
||||
# 休息一下,避免API限频
|
||||
# time.sleep(0.2)
|
||||
|
||||
except Exception as e:
|
||||
print(f"处理{symbol}时发生错误: {e}")
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("历史数据采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集天数: {days}")
|
||||
print(f"总股票数: {len(stock_codes)}")
|
||||
print(f"成功采集: {success_count}")
|
||||
print(f"失败: {failed_count}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"历史数据采集失败: {e}")
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
gc.collect()
|
||||
|
||||
def refetch_single_stock_history(self, symbol, days=1800):
|
||||
"""
|
||||
重新获取单只股票的历史数据(用于除权处理)
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
days: 获取的天数,默认1800天
|
||||
|
||||
Returns:
|
||||
是否成功
|
||||
"""
|
||||
try:
|
||||
# 删除该股票的历史数据(日线数据表和指标数据表)
|
||||
with self.engine.begin() as conn:
|
||||
# 删除日线数据
|
||||
delete_query_day = text(f"DELETE FROM {self.table_name} WHERE symbol = :symbol")
|
||||
conn.execute(delete_query_day, {"symbol": symbol})
|
||||
|
||||
# 删除指标数据
|
||||
delete_query_basic = text(f"DELETE FROM {self.basic_table_name} WHERE symbol = :symbol")
|
||||
conn.execute(delete_query_basic, {"symbol": symbol})
|
||||
|
||||
print(f"已删除{self.table_name}和{self.basic_table_name}表中{symbol}的历史数据")
|
||||
|
||||
# 重新获取历史数据
|
||||
success = self.fetch_historical_data(symbol, days)
|
||||
if success:
|
||||
print(f"成功重新获取{symbol}的历史数据")
|
||||
else:
|
||||
print(f"重新获取{symbol}的历史数据失败")
|
||||
|
||||
return success
|
||||
|
||||
except Exception as e:
|
||||
print(f"重新获取{symbol}历史数据失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def collect_stock_daily_data_v3(db_url, tushare_token, mode='daily', date=None, days=1800, table_name='gp_day_data', basic_table_name='gp_day_basic'):
|
||||
"""
|
||||
V3版本的股票日线数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'historical'=批量采集历史数据
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
days: 历史数据天数(仅mode='historical'时有效),默认1800天
|
||||
table_name: 日线数据表名,默认为gp_day_data(不影响原有业务)
|
||||
basic_table_name: 每日指标数据表名,默认为gp_day_basic
|
||||
"""
|
||||
collector = StockDailyDataCollectorV3(db_url, tushare_token, table_name, basic_table_name)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'historical':
|
||||
collector.run_historical_collection(days)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
def get_stock_price_data_from_db(stock_code, db_url='mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'):
|
||||
"""
|
||||
从gp_day_data和gp_day_basic表获取股票最新价格数据
|
||||
替代原StockPriceCollector.get_stock_price_data()方法
|
||||
|
||||
Args:
|
||||
stock_code: 股票代码,支持多种格式(SH600000、600000.SH、600000等)
|
||||
db_url: 数据库连接URL
|
||||
|
||||
Returns:
|
||||
dict: 包含股票实时价格信息的字典,格式与原接口兼容
|
||||
{
|
||||
'stock_code': '600000',
|
||||
'stock_name': '浦发银行',
|
||||
'current_price': 10.5,
|
||||
'change_percent': 2.5,
|
||||
'change_amount': 0.25,
|
||||
'volume': 1234567,
|
||||
'amount': 12345678.9,
|
||||
'high': 10.8,
|
||||
'low': 10.2,
|
||||
'open': 10.3,
|
||||
'pre_close': 10.25,
|
||||
'update_time': '2024-01-20 14:30:00',
|
||||
'total_market_value': 100000000.0, # 总市值(万元)
|
||||
'pe': 8.5,
|
||||
'pb': 0.6,
|
||||
'ps': 1.2
|
||||
}
|
||||
"""
|
||||
try:
|
||||
# 统一股票代码格式为数据库格式(如SH600000)
|
||||
db_code = _normalize_stock_code(stock_code)
|
||||
|
||||
# 创建数据库连接
|
||||
engine = create_engine(db_url)
|
||||
|
||||
# 从gp_day_data获取最新日线数据
|
||||
day_query = f"""
|
||||
SELECT
|
||||
symbol,
|
||||
timestamp,
|
||||
open,
|
||||
high,
|
||||
low,
|
||||
close,
|
||||
chg,
|
||||
percent,
|
||||
volume,
|
||||
amount,
|
||||
pre_close
|
||||
FROM gp_day_data
|
||||
WHERE symbol = '{db_code}'
|
||||
ORDER BY timestamp DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
|
||||
day_df = pd.read_sql(day_query, engine)
|
||||
|
||||
if day_df.empty:
|
||||
engine.dispose()
|
||||
return None
|
||||
|
||||
# 从gp_day_basic获取最新指标数据
|
||||
basic_query = f"""
|
||||
SELECT
|
||||
pe_ttm,
|
||||
pb,
|
||||
ps,
|
||||
total_mv,
|
||||
circ_mv
|
||||
FROM gp_day_basic
|
||||
WHERE symbol = '{db_code}'
|
||||
ORDER BY timestamp DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
|
||||
basic_df = pd.read_sql(basic_query, engine)
|
||||
engine.dispose()
|
||||
|
||||
# 组装返回数据
|
||||
day_row = day_df.iloc[0]
|
||||
|
||||
result = {
|
||||
'stock_code': stock_code, # 保持原格式
|
||||
'stock_name': None, # 数据库中没有股票名称,保持为None
|
||||
'current_price': float(day_row['close']) if day_row['close'] else None,
|
||||
'change_percent': float(day_row['percent']) if day_row['percent'] else None,
|
||||
'change_amount': float(day_row['chg']) if day_row['chg'] else None,
|
||||
'volume': int(day_row['volume']) if day_row['volume'] else None,
|
||||
'amount': float(day_row['amount']) if day_row['amount'] else None,
|
||||
'high': float(day_row['high']) if day_row['high'] else None,
|
||||
'low': float(day_row['low']) if day_row['low'] else None,
|
||||
'open': float(day_row['open']) if day_row['open'] else None,
|
||||
'pre_close': float(day_row['pre_close']) if day_row['pre_close'] else None,
|
||||
'update_time': day_row['timestamp'].strftime('%Y-%m-%d %H:%M:%S') if day_row['timestamp'] else None,
|
||||
}
|
||||
|
||||
# 添加估值指标(如果有)
|
||||
if not basic_df.empty:
|
||||
basic_row = basic_df.iloc[0]
|
||||
result['total_market_value'] = float(basic_row['total_mv']) * 10000 if basic_row['total_mv'] else None # 转换为元
|
||||
result['pe'] = float(basic_row['pe_ttm']) if basic_row['pe_ttm'] else None
|
||||
result['pb'] = float(basic_row['pb']) if basic_row['pb'] else None
|
||||
result['ps'] = float(basic_row['ps']) if basic_row['ps'] else None
|
||||
else:
|
||||
result['total_market_value'] = None
|
||||
result['pe'] = None
|
||||
result['pb'] = None
|
||||
result['ps'] = None
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
print(f"从数据库获取股票价格数据失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return None
|
||||
|
||||
|
||||
def _normalize_stock_code(stock_code):
|
||||
"""
|
||||
统一股票代码格式为数据库格式
|
||||
支持的输入格式:
|
||||
- SH600000、SZ000001 (数据库格式)
|
||||
- 600000.SH、000001.SZ (Tushare格式)
|
||||
- 600000、000001 (纯数字)
|
||||
|
||||
Args:
|
||||
stock_code: 股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码(如SH600000)
|
||||
"""
|
||||
stock_code = stock_code.upper().strip()
|
||||
|
||||
# 已经是数据库格式
|
||||
if stock_code.startswith(('SH', 'SZ', 'BJ')):
|
||||
return stock_code
|
||||
|
||||
# Tushare格式转换
|
||||
if '.' in stock_code:
|
||||
code, market = stock_code.split('.')
|
||||
if market == 'SH':
|
||||
return f'SH{code}'
|
||||
elif market == 'SZ':
|
||||
return f'SZ{code}'
|
||||
elif market == 'BJ':
|
||||
return f'BJ{code}'
|
||||
|
||||
# 纯数字,根据规则判断
|
||||
if stock_code.isdigit():
|
||||
if stock_code.startswith('6'):
|
||||
return f'SH{stock_code}'
|
||||
elif stock_code.startswith(('0', '3')):
|
||||
return f'SZ{stock_code}'
|
||||
elif stock_code.startswith('8') or stock_code.startswith('4'):
|
||||
return f'BJ{stock_code}'
|
||||
|
||||
# 无法识别,返回原值
|
||||
return stock_code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 增量采集当日数据(推荐每日使用)
|
||||
# collect_stock_daily_data_v3(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 批量采集历史数据(首次使用或需要重建数据时)
|
||||
# collect_stock_daily_data_v3(db_url, tushare_token, mode='historical', days=4000)
|
||||
|
||||
# 3. 采集指定日期的数据
|
||||
collect_stock_daily_data_v3(db_url, tushare_token, mode='daily', date='2025-11-07')
|
||||
|
||||
# 4. 单只股票历史数据重新获取(用于除权处理)
|
||||
# collector = StockDailyDataCollectorV3(db_url, tushare_token)
|
||||
# collector.refetch_single_stock_history('SH600000', 1800)
|
||||
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
2025-04-30 16:11:18,786 - stock_simulation - ERROR - 获取所有账户出错: 'Engine' object has no attribute 'cursor'
|
||||
2025-04-30 16:13:40,220 - stock_simulation - ERROR - 获取所有账户出错: 'Connection' object has no attribute 'cursor'
|
||||
2025-04-30 16:16:26,095 - stock_simulation - ERROR - 获取所有账户出错: 'Engine' object has no attribute 'cursor'
|
||||
2025-04-30 16:20:02,876 - stock_simulation - ERROR - 获取所有账户出错: 'Engine' object has no attribute 'cursor'
|
||||
2025-04-30 16:20:22,822 - stock_simulation - ERROR - 获取所有账户出错: 'Engine' object has no attribute 'cursor'
|
||||
2025-04-30 16:21:14,438 - stock_simulation - ERROR - 获取所有账户出错: 'Engine' object has no attribute 'cursor'
|
||||
2025-04-30 16:23:38,622 - stock_simulation - ERROR - 获取所有账户出错: 'Connection' object has no attribute 'cursor'
|
||||
2025-04-30 16:26:40,281 - stock_simulation - ERROR - 获取所有账户出错: 'Connection' object has no attribute 'cursor'
|
||||
BIN
src/src_temp.7z
BIN
src/src_temp.7z
Binary file not shown.
|
|
@ -1,25 +0,0 @@
|
|||
2025-03-05 14:51:02,426 - INFO - === 股票分析程序开始运行 ===
|
||||
2025-03-05 14:51:02,427 - INFO - 初始化 StockAnalyzer...
|
||||
2025-03-05 14:51:02,453 - INFO - StockAnalyzer 初始化完成
|
||||
2025-03-05 14:51:02,453 - INFO - 分析参数: 开始日期=2024-01-01, 结束日期=2024-12-31
|
||||
2025-03-05 14:51:02,453 - INFO - 止盈=10.0%, 止损=-10.0%, 回调建仓=-5.0%
|
||||
2025-03-05 14:51:02,453 - INFO - 开始分析所有股票...
|
||||
2025-03-05 14:51:02,453 - INFO - 开始获取股票列表...
|
||||
2025-03-05 14:51:02,597 - INFO - 获取到 1 支股票
|
||||
2025-03-05 14:51:02,600 - INFO - 开始分析股票 SZ300750
|
||||
2025-03-05 14:51:02,685 - INFO - 股票 SZ300750 分析完成,总收益: -141823874.93
|
||||
2025-03-05 14:51:02,686 - INFO - 分析完成,共分析 1/1 支股票
|
||||
2025-03-05 14:51:02,686 - INFO - 开始保存 1 支股票的分析结果
|
||||
2025-03-05 14:51:02,687 - ERROR - 程序运行出错: [Errno 13] Permission denied: 'results/SZ300750_analysis.csv'
|
||||
Traceback (most recent call last):
|
||||
File "D:\python_project\gpfx\src\stock_analysis.py", line 254, in main
|
||||
result.to_csv(csv_path, index=False)
|
||||
File "C:\Users\xy\.conda\envs\feapder_project\lib\site-packages\pandas\core\generic.py", line 3902, in to_csv
|
||||
return DataFrameRenderer(formatter).to_csv(
|
||||
File "C:\Users\xy\.conda\envs\feapder_project\lib\site-packages\pandas\io\formats\format.py", line 1152, in to_csv
|
||||
csv_formatter.save()
|
||||
File "C:\Users\xy\.conda\envs\feapder_project\lib\site-packages\pandas\io\formats\csvs.py", line 247, in save
|
||||
with get_handle(
|
||||
File "C:\Users\xy\.conda\envs\feapder_project\lib\site-packages\pandas\io\common.py", line 863, in get_handle
|
||||
handle = open(
|
||||
PermissionError: [Errno 13] Permission denied: 'results/SZ300750_analysis.csv'
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
# Tushare数据采集脚本包
|
||||
|
||||
|
|
@ -0,0 +1,404 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
股票集合竞价数据采集工具
|
||||
功能:从Tushare获取开盘和收盘集合竞价数据,合并存储到gp_auction_data表
|
||||
API文档:
|
||||
开盘集合竞价 https://tushare.pro/document/2?doc_id=353
|
||||
收盘集合竞价 https://tushare.pro/document/2?doc_id=354
|
||||
注意:
|
||||
1. 该接口需要至少2000积分权限
|
||||
2. 单次最大返回10000条数据
|
||||
3. 采用按日期遍历策略,每天获取全市场数据
|
||||
4. 每天15:30之后数据更新完成
|
||||
采集策略:
|
||||
- 按日期遍历,每个日期获取全市场的开盘和收盘集合竞价数据
|
||||
- 将同一股票同一日期的开盘和收盘数据合并为一条记录
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class AuctionDataCollector:
|
||||
"""股票集合竞价数据采集器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='gp_auction_data'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 数据表名,默认为gp_auction_data
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.table_name = table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("股票集合竞价数据采集工具")
|
||||
print(f"目标数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def fetch_open_auction(self, trade_date):
|
||||
"""
|
||||
获取开盘集合竞价数据
|
||||
|
||||
Args:
|
||||
trade_date: 交易日期,格式YYYYMMDD
|
||||
|
||||
Returns:
|
||||
开盘集合竞价DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.stk_auction_o(trade_date=trade_date)
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取开盘集合竞价数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def fetch_close_auction(self, trade_date):
|
||||
"""
|
||||
获取收盘集合竞价数据
|
||||
|
||||
Args:
|
||||
trade_date: 交易日期,格式YYYYMMDD
|
||||
|
||||
Returns:
|
||||
收盘集合竞价DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.stk_auction_c(trade_date=trade_date)
|
||||
time.sleep(0.2) # API限频控制
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取收盘集合竞价数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def merge_and_transform_data(self, open_df, close_df):
|
||||
"""
|
||||
合并开盘和收盘集合竞价数据,并转换为数据库格式
|
||||
|
||||
Args:
|
||||
open_df: 开盘集合竞价DataFrame
|
||||
close_df: 收盘集合竞价DataFrame
|
||||
|
||||
Returns:
|
||||
合并后的DataFrame
|
||||
"""
|
||||
if open_df.empty and close_df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 处理开盘集合竞价数据
|
||||
if not open_df.empty:
|
||||
open_df = open_df.rename(columns={
|
||||
'close': 'open_close',
|
||||
'open': 'open_open',
|
||||
'high': 'open_high',
|
||||
'low': 'open_low',
|
||||
'vol': 'open_vol',
|
||||
'amount': 'open_amount',
|
||||
'vwap': 'open_vwap'
|
||||
})
|
||||
open_df['trade_date'] = pd.to_datetime(open_df['trade_date'], format='%Y%m%d')
|
||||
|
||||
# 处理收盘集合竞价数据
|
||||
if not close_df.empty:
|
||||
close_df = close_df.rename(columns={
|
||||
'close': 'close_close',
|
||||
'open': 'close_open',
|
||||
'high': 'close_high',
|
||||
'low': 'close_low',
|
||||
'vol': 'close_vol',
|
||||
'amount': 'close_amount',
|
||||
'vwap': 'close_vwap'
|
||||
})
|
||||
close_df['trade_date'] = pd.to_datetime(close_df['trade_date'], format='%Y%m%d')
|
||||
|
||||
# 合并数据
|
||||
if not open_df.empty and not close_df.empty:
|
||||
# 两个都有数据,按ts_code和trade_date合并
|
||||
result_df = pd.merge(
|
||||
open_df[['ts_code', 'trade_date', 'open_close', 'open_open', 'open_high',
|
||||
'open_low', 'open_vol', 'open_amount', 'open_vwap']],
|
||||
close_df[['ts_code', 'trade_date', 'close_close', 'close_open', 'close_high',
|
||||
'close_low', 'close_vol', 'close_amount', 'close_vwap']],
|
||||
on=['ts_code', 'trade_date'],
|
||||
how='outer'
|
||||
)
|
||||
elif not open_df.empty:
|
||||
# 只有开盘数据
|
||||
result_df = open_df[['ts_code', 'trade_date', 'open_close', 'open_open', 'open_high',
|
||||
'open_low', 'open_vol', 'open_amount', 'open_vwap']].copy()
|
||||
else:
|
||||
# 只有收盘数据
|
||||
result_df = close_df[['ts_code', 'trade_date', 'close_close', 'close_open', 'close_high',
|
||||
'close_low', 'close_vol', 'close_amount', 'close_vwap']].copy()
|
||||
|
||||
# 添加symbol字段
|
||||
result_df.insert(0, 'symbol', result_df['ts_code'].apply(self.convert_tushare_code_to_db))
|
||||
|
||||
return result_df
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集
|
||||
获取指定日期的全市场开盘和收盘集合竞价数据
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(trade_date) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{self.table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 获取开盘集合竞价数据
|
||||
print(f"正在获取{date_str}开盘集合竞价数据...")
|
||||
open_df = self.fetch_open_auction(trade_date)
|
||||
if not open_df.empty:
|
||||
print(f"成功获取开盘集合竞价数据,共{len(open_df)}只股票")
|
||||
else:
|
||||
print(f"{date_str}没有开盘集合竞价数据")
|
||||
|
||||
# 获取收盘集合竞价数据
|
||||
print(f"正在获取{date_str}收盘集合竞价数据...")
|
||||
close_df = self.fetch_close_auction(trade_date)
|
||||
if not close_df.empty:
|
||||
print(f"成功获取收盘集合竞价数据,共{len(close_df)}只股票")
|
||||
else:
|
||||
print(f"{date_str}没有收盘集合竞价数据")
|
||||
|
||||
# 合并数据
|
||||
if open_df.empty and close_df.empty:
|
||||
print(f"{date_str}没有集合竞价数据(可能是非交易日)")
|
||||
return
|
||||
|
||||
print(f"正在合并数据...")
|
||||
result_df = self.merge_and_transform_data(open_df, close_df)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据合并失败")
|
||||
return
|
||||
|
||||
# 保存到数据库
|
||||
print(f"正在保存数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}条记录")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"开盘集合竞价: {len(open_df)}只股票" if not open_df.empty else "开盘集合竞价: 无数据")
|
||||
print(f"收盘集合竞价: {len(close_df)}只股票" if not close_df.empty else "收盘集合竞价: 无数据")
|
||||
print(f"合并记录: {len(result_df)}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
执行全量覆盖采集(按日期逐日采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为30天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量覆盖采集(按日期逐日采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近4000天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=4000)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 按日期逐日采集
|
||||
current_date = start_date_obj
|
||||
total_days = (end_date_obj - start_date_obj).days + 1
|
||||
processed_days = 0
|
||||
success_days = 0
|
||||
total_records = 0
|
||||
|
||||
while current_date <= end_date_obj:
|
||||
date_str = current_date.strftime('%Y-%m-%d')
|
||||
|
||||
print(f"\n[{processed_days + 1}/{total_days}] 采集日期: {date_str}")
|
||||
|
||||
try:
|
||||
# 使用每日采集方法
|
||||
trade_date = current_date.strftime('%Y%m%d')
|
||||
|
||||
# 获取开盘集合竞价数据
|
||||
open_df = self.fetch_open_auction(trade_date)
|
||||
|
||||
# 获取收盘集合竞价数据
|
||||
close_df = self.fetch_close_auction(trade_date)
|
||||
|
||||
# 合并并保存数据
|
||||
if not open_df.empty or not close_df.empty:
|
||||
result_df = self.merge_and_transform_data(open_df, close_df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 删除该日期旧数据
|
||||
# with self.engine.begin() as conn:
|
||||
# delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(trade_date) = :date_str")
|
||||
# conn.execute(delete_query, {"date_str": date_str})
|
||||
|
||||
# 保存新数据
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(result_df)
|
||||
success_days += 1
|
||||
print(f" 成功: {len(result_df)}条记录")
|
||||
else:
|
||||
print(f" 无数据(可能是非交易日)")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 采集失败: {e}")
|
||||
|
||||
# 移到下一天
|
||||
current_date += timedelta(days=1)
|
||||
processed_days += 1
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量覆盖采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"总天数: {total_days}")
|
||||
print(f"成功天数: {success_days}")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_auction_data(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
股票集合竞价数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'full'=全量覆盖采集
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 开始日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为30天前
|
||||
end_date: 结束日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
collector = AuctionDataCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每日15:30后使用)
|
||||
# collect_auction_data(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 全量覆盖采集(首次使用或需要重建数据时)
|
||||
collect_auction_data(db_url, tushare_token, mode='full')
|
||||
|
||||
# 3. 采集指定日期的数据
|
||||
# collect_auction_data(db_url, tushare_token, mode='daily', date='2025-11-03')
|
||||
|
||||
# 4. 采集指定日期范围的数据
|
||||
# collect_auction_data(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
|
||||
|
|
@ -0,0 +1,354 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
每日筹码及胜率数据采集工具
|
||||
功能:从Tushare获取每日筹码及胜率数据,存储到gp_chip_data表
|
||||
API文档: https://tushare.pro/document/2?doc_id=293
|
||||
注意:该接口需要至少10000积分权限
|
||||
每天17~18点左右更新
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class ChipDataCollector:
|
||||
"""每日筹码及胜率数据采集器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='gp_chip_data'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 数据表名,默认为gp_chip_data
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.table_name = table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("每日筹码及胜率数据采集工具")
|
||||
print(f"目标数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def convert_db_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if symbol.startswith('SH'):
|
||||
return f"{symbol[2:]}.SH"
|
||||
elif symbol.startswith('SZ'):
|
||||
return f"{symbol[2:]}.SZ"
|
||||
elif symbol.startswith('BJ'):
|
||||
return f"{symbol[2:]}.BJ"
|
||||
else:
|
||||
return symbol
|
||||
|
||||
def fetch_all_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有A股股票代码
|
||||
|
||||
Returns:
|
||||
股票代码列表
|
||||
"""
|
||||
try:
|
||||
query = "SELECT gp_code FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
codes = df['gp_code'].tolist()
|
||||
print(f"获取到A股股票代码: {len(codes)}个")
|
||||
return codes
|
||||
except Exception as e:
|
||||
print(f"获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_chip_data(self, ts_code=None, trade_date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
从Tushare获取每日筹码及胜率数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=293
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
筹码数据DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.cyq_perf(
|
||||
ts_code=ts_code,
|
||||
trade_date=trade_date,
|
||||
start_date=start_date,
|
||||
end_date=end_date,
|
||||
fields='ts_code,trade_date,his_low,his_high,cost_5pct,cost_15pct,cost_50pct,cost_85pct,cost_95pct,weight_avg,winner_rate'
|
||||
)
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取筹码数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换Tushare数据为数据库格式
|
||||
|
||||
Args:
|
||||
df: Tushare返回的DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
result_df['ts_code'] = df['ts_code']
|
||||
result_df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
result_df['his_low'] = df['his_low']
|
||||
result_df['his_high'] = df['his_high']
|
||||
result_df['cost_5pct'] = df['cost_5pct']
|
||||
result_df['cost_15pct'] = df['cost_15pct']
|
||||
result_df['cost_50pct'] = df['cost_50pct']
|
||||
result_df['cost_85pct'] = df['cost_85pct']
|
||||
result_df['cost_95pct'] = df['cost_95pct']
|
||||
result_df['weight_avg'] = df['weight_avg']
|
||||
result_df['winner_rate'] = df['winner_rate']
|
||||
|
||||
return result_df
|
||||
|
||||
def run_full_collection(self):
|
||||
"""
|
||||
执行全量覆盖采集
|
||||
先清空表,再重新采集所有股票的数据
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量覆盖采集")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 获取所有股票代码
|
||||
stock_codes = self.fetch_all_stock_codes()
|
||||
if not stock_codes:
|
||||
print("未获取到股票代码,终止采集")
|
||||
return
|
||||
|
||||
# 清空表
|
||||
print(f"正在清空{self.table_name}表...")
|
||||
with self.engine.begin() as conn:
|
||||
truncate_query = text(f"TRUNCATE TABLE {self.table_name}")
|
||||
conn.execute(truncate_query)
|
||||
print("表已清空")
|
||||
|
||||
# 统计信息
|
||||
success_count = 0
|
||||
failed_count = 0
|
||||
total_records = 0
|
||||
|
||||
# 遍历所有股票
|
||||
for symbol in tqdm(stock_codes, desc="全量采集筹码数据"):
|
||||
try:
|
||||
# 转换股票代码格式
|
||||
ts_code = self.convert_db_code_to_tushare(symbol)
|
||||
|
||||
# 获取该股票的所有历史筹码数据
|
||||
df = self.fetch_chip_data(ts_code=ts_code)
|
||||
|
||||
if df.empty:
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 保存到数据库
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
success_count += 1
|
||||
total_records += len(result_df)
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n处理{symbol}时发生错误: {e}")
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"总股票数: {len(stock_codes)}")
|
||||
print(f"成功采集: {success_count}")
|
||||
print(f"失败: {failed_count}")
|
||||
print(f"总记录数: {total_records}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集
|
||||
获取指定日期的全市场筹码数据
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(trade_date) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{self.table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 获取全市场当日筹码数据(不传ts_code,获取所有股票)
|
||||
print(f"正在获取{date_str}全市场筹码数据...")
|
||||
df = self.fetch_chip_data(trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
print(f"{date_str}没有筹码数据(可能是非交易日或接口无数据)")
|
||||
return
|
||||
|
||||
print(f"成功获取筹码数据,共{len(df)}只股票")
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据转换失败")
|
||||
return
|
||||
|
||||
# 保存到数据库
|
||||
print(f"正在保存数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}条记录")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"成功采集: {len(result_df)}只股票")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_chip_data(db_url, tushare_token, mode='daily', date=None):
|
||||
"""
|
||||
筹码数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'full'=全量覆盖采集
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
"""
|
||||
collector = ChipDataCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection()
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每日使用)
|
||||
# collect_chip_data(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 全量覆盖采集(首次使用或需要重建数据时)
|
||||
# collect_chip_data(db_url, tushare_token, mode='full')
|
||||
|
||||
# 3. 采集指定日期的数据
|
||||
collect_chip_data(db_url, tushare_token, mode='daily', date='2025-11-07')
|
||||
|
|
@ -0,0 +1,475 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
每日筹码分布数据采集工具
|
||||
功能:从Tushare获取每日筹码分布数据,存储到gp_chip_distribution表
|
||||
API文档: https://tushare.pro/document/2?doc_id=294
|
||||
注意:该接口需要至少10000积分权限,单次最大返回2000条数据
|
||||
每天17~18点之间更新当日数据
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class ChipDistributionCollector:
|
||||
"""每日筹码分布数据采集器(按年分表)"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, base_table_name='gp_chip_distribution'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
base_table_name: 基础表名,默认为gp_chip_distribution(实际表名会加上年度后缀,如gp_chip_distribution_2025)
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.base_table_name = base_table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("每日筹码分布数据采集工具(按年分表)")
|
||||
print(f"基础表名: {self.base_table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def get_table_name_by_date(self, date_str):
|
||||
"""
|
||||
根据日期获取对应的分表名称
|
||||
|
||||
Args:
|
||||
date_str: 日期字符串,格式YYYY-MM-DD
|
||||
|
||||
Returns:
|
||||
分表名称,如gp_chip_distribution_2025
|
||||
"""
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
year = date_obj.strftime('%Y')
|
||||
return f"{self.base_table_name}_{year}"
|
||||
|
||||
def create_yearly_table(self, table_name):
|
||||
"""
|
||||
创建年度分表(如果不存在)
|
||||
|
||||
Args:
|
||||
table_name: 表名,如gp_chip_distribution_2025
|
||||
"""
|
||||
try:
|
||||
create_table_sql = f"""
|
||||
CREATE TABLE IF NOT EXISTS `{table_name}` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '股票代码(数据库格式,如SH600000)',
|
||||
`ts_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Tushare股票代码(如600000.SH)',
|
||||
`trade_date` date NOT NULL COMMENT '交易日期',
|
||||
`price` decimal(10, 2) NOT NULL COMMENT '价格',
|
||||
`percent` decimal(10, 4) NULL DEFAULT NULL COMMENT '占比(%)',
|
||||
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `idx_symbol_date_price`(`symbol` ASC, `trade_date` ASC, `price` ASC) USING BTREE,
|
||||
INDEX `idx_symbol`(`symbol` ASC) USING BTREE,
|
||||
INDEX `idx_trade_date`(`trade_date` ASC) USING BTREE,
|
||||
INDEX `idx_ts_code`(`ts_code` ASC) USING BTREE
|
||||
) ENGINE = InnoDB
|
||||
CHARACTER SET = utf8mb4
|
||||
COLLATE = utf8mb4_bin
|
||||
COMMENT = '每日筹码分布数据表(Tushare)'
|
||||
ROW_FORMAT = Dynamic;
|
||||
"""
|
||||
|
||||
with self.engine.begin() as conn:
|
||||
conn.execute(text(create_table_sql))
|
||||
|
||||
print(f"✓ 表 {table_name} 已确认存在")
|
||||
|
||||
except Exception as e:
|
||||
print(f"创建表 {table_name} 失败: {e}")
|
||||
raise
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def convert_db_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if symbol.startswith('SH'):
|
||||
return f"{symbol[2:]}.SH"
|
||||
elif symbol.startswith('SZ'):
|
||||
return f"{symbol[2:]}.SZ"
|
||||
elif symbol.startswith('BJ'):
|
||||
return f"{symbol[2:]}.BJ"
|
||||
else:
|
||||
return symbol
|
||||
|
||||
def fetch_all_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有A股股票代码
|
||||
|
||||
Returns:
|
||||
股票代码列表
|
||||
"""
|
||||
try:
|
||||
query = "SELECT gp_code FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
codes = df['gp_code'].tolist()
|
||||
print(f"获取到A股股票代码: {len(codes)}个")
|
||||
return codes
|
||||
except Exception as e:
|
||||
print(f"获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_chip_distribution(self, ts_code=None, trade_date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
从Tushare获取每日筹码分布数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=294
|
||||
注意:单次最大返回2000条数据
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
筹码分布DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.cyq_chips(
|
||||
ts_code=ts_code,
|
||||
trade_date=trade_date,
|
||||
start_date=start_date,
|
||||
end_date=end_date,
|
||||
fields='ts_code,trade_date,price,percent'
|
||||
)
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取筹码分布数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换Tushare数据为数据库格式
|
||||
|
||||
Args:
|
||||
df: Tushare返回的DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
result_df['ts_code'] = df['ts_code']
|
||||
result_df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
result_df['price'] = df['price']
|
||||
result_df['percent'] = df['percent']
|
||||
|
||||
return result_df
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None, batch_size=100):
|
||||
"""
|
||||
执行全量覆盖采集(按年分表,按日期倒序采集)
|
||||
从最新日期(end_date)开始往前采集到最早日期(start_date)
|
||||
自动跳过周六和周日(非交易日)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期(最早日期),格式YYYY-MM-DD,默认为8年前
|
||||
end_date: 结束日期(最新日期),格式YYYY-MM-DD,默认为今天
|
||||
batch_size: 批量入库的股票数量,默认100
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量覆盖采集(按年分表,按日期倒序采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近8年历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=8*365)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"批量入库设置: 每{batch_size}只股票入库一次")
|
||||
print("=" * 60)
|
||||
|
||||
# 获取所有股票代码
|
||||
stock_codes = self.fetch_all_stock_codes()
|
||||
if not stock_codes:
|
||||
print("未获取到股票代码,终止采集")
|
||||
return
|
||||
|
||||
# 按日期倒序逐日采集(从最新日期往前采集,跳过周六周日)
|
||||
current_date = end_date_obj
|
||||
total_days = (end_date_obj - start_date_obj).days + 1
|
||||
processed_days = 0
|
||||
skipped_weekends = 0
|
||||
|
||||
while current_date >= start_date_obj:
|
||||
# 跳过周六(weekday() == 5)和周日(weekday() == 6)
|
||||
weekday = current_date.weekday()
|
||||
if weekday == 5: # 周六
|
||||
skipped_weekends += 1
|
||||
current_date -= timedelta(days=1)
|
||||
continue
|
||||
elif weekday == 6: # 周日
|
||||
skipped_weekends += 1
|
||||
current_date -= timedelta(days=1)
|
||||
continue
|
||||
|
||||
date_str = current_date.strftime('%Y-%m-%d')
|
||||
|
||||
# 调用每日采集方法,自动按年分表
|
||||
print(f"\n[{processed_days + 1}/{total_days - skipped_weekends}] 采集日期: {date_str} (倒序采集)")
|
||||
|
||||
try:
|
||||
# 使用每日采集方法,自动按年分表
|
||||
self.run_daily_collection(date=date_str, batch_size=batch_size)
|
||||
processed_days += 1
|
||||
except Exception as e:
|
||||
print(f"采集 {date_str} 失败: {e}")
|
||||
|
||||
# 移到前一天(倒序)
|
||||
current_date -= timedelta(days=1)
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量覆盖采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"总天数: {total_days}天")
|
||||
print(f"跳过周末: {skipped_weekends}天")
|
||||
print(f"实际采集: {processed_days}天")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_daily_collection(self, date=None, batch_size=100):
|
||||
"""
|
||||
执行每日增量采集(按年分表)
|
||||
获取指定日期的全市场筹码分布数据
|
||||
注意:单次返回限制10000条
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集(按年分表)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
# 获取当年分表名称
|
||||
table_name = self.get_table_name_by_date(date_str)
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
print(f"目标表名: {table_name}")
|
||||
print(f"批量入库设置: 每{batch_size}只股票入库一次")
|
||||
|
||||
# 创建当年分表(如果不存在)
|
||||
self.create_yearly_table(table_name)
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {table_name} WHERE DATE(trade_date) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 获取所有股票代码
|
||||
stock_codes = self.fetch_all_stock_codes()
|
||||
if not stock_codes:
|
||||
print("未获取到股票代码,终止采集")
|
||||
return
|
||||
|
||||
# 统计信息
|
||||
success_count = 0
|
||||
failed_count = 0
|
||||
total_records = 0
|
||||
|
||||
# 批量数据缓存
|
||||
batch_data_list = []
|
||||
|
||||
# 遍历所有股票,获取当日筹码分布数据
|
||||
print(f"正在获取{date_str}全市场筹码分布数据...")
|
||||
for idx, symbol in enumerate(tqdm(stock_codes, desc=f"采集{date_str}筹码分布"), 1):
|
||||
try:
|
||||
# 转换股票代码格式
|
||||
ts_code = self.convert_db_code_to_tushare(symbol)
|
||||
|
||||
# 获取当日筹码分布数据
|
||||
df = self.fetch_chip_distribution(ts_code=ts_code, trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 添加到批量缓存
|
||||
batch_data_list.append(result_df)
|
||||
success_count += 1
|
||||
total_records += len(result_df)
|
||||
|
||||
# 每达到batch_size或最后一只股票时,批量入库
|
||||
if len(batch_data_list) >= batch_size or idx == len(stock_codes):
|
||||
if batch_data_list:
|
||||
# 合并所有DataFrame
|
||||
combined_df = pd.concat(batch_data_list, ignore_index=True)
|
||||
# 批量保存到数据库(使用分表)
|
||||
combined_df.to_sql(table_name, self.engine, if_exists='append', index=False)
|
||||
# 清空缓存
|
||||
batch_data_list = []
|
||||
|
||||
except Exception as e:
|
||||
failed_count += 1
|
||||
continue
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"总股票数: {len(stock_codes)}")
|
||||
print(f"成功采集: {success_count}")
|
||||
print(f"失败: {failed_count}")
|
||||
print(f"总记录数: {total_records}")
|
||||
print(f"数据表: {table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_chip_distribution(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None, batch_size=100):
|
||||
"""
|
||||
筹码分布数据采集入口函数(按年分表)
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'full'=全量覆盖采集(倒序)
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 最早日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为8年前
|
||||
end_date: 最新日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为今天
|
||||
batch_size: 批量入库的股票数量,默认100
|
||||
|
||||
注意:
|
||||
- full模式采用倒序采集:从最新日期(end_date)往前采集到最早日期(start_date)
|
||||
- 这样可以优先采集最新数据,如果中途中断,最新数据已经采集完成
|
||||
- 自动跳过周六和周日(非交易日),只采集工作日数据
|
||||
"""
|
||||
collector = ChipDistributionCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date, batch_size)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date, batch_size)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每日使用)
|
||||
# 自动按年分表,如2025-11-03的数据会存到gp_chip_distribution_2025表
|
||||
# collect_chip_distribution(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 全量覆盖采集(首次使用或需要重建数据时)
|
||||
# 采集近8年数据,自动按年创建分表(如gp_chip_distribution_2025, gp_chip_distribution_2024等)
|
||||
collect_chip_distribution(db_url, tushare_token, mode='full')
|
||||
|
||||
# 3. 采集指定日期的数据
|
||||
# collect_chip_distribution(db_url, tushare_token, mode='daily', date='2025-10-29')
|
||||
|
||||
# 4. 采集指定日期范围的数据
|
||||
# collect_chip_distribution(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
|
||||
# 5. 调整批量入库大小(默认100只股票一批)
|
||||
# collect_chip_distribution(db_url, tushare_token, mode='daily', batch_size=200)
|
||||
|
||||
|
|
@ -0,0 +1,722 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
港股日线数据采集工具
|
||||
功能:从Tushare获取港股日线行情数据,存储到gp_day_data表(与A股共用)
|
||||
API文档: https://tushare.pro/document/2?doc_id=192
|
||||
注意:
|
||||
1. 该接口需要120积分权限
|
||||
2. 单次最大返回8000条数据
|
||||
3. 每日收盘后更新(港股交易时间:9:30-12:00, 13:00-16:00)
|
||||
4. 可按日期一次性获取全市场数据
|
||||
数据存储说明:
|
||||
- 存储表:gp_day_data(与A股共用)
|
||||
- symbol格式:纯数字5位(如01810),不带市场编码
|
||||
- 删除策略:只删除LENGTH(symbol)=5的记录,不影响A股数据
|
||||
- PB/PE/PS:港股接口无此数据,保持为NULL
|
||||
采集策略:
|
||||
- 每日增量:按日期获取全市场数据(推荐)
|
||||
- 历史数据:按股票逐个采集历史数据
|
||||
17点以后执行
|
||||
"""
|
||||
from time import sleep
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class HKDailyDataCollector:
|
||||
"""港股日线数据采集器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='gp_day_data'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 数据表名,默认为gp_day_data(与A股共用)
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.table_name = table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("港股日线数据采集工具")
|
||||
print(f"目标数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的港股代码转换为数据库格式
|
||||
Tushare格式:01810.HK、00700.HK
|
||||
数据库格式:01810、00700(不带市场编码,保留前导零,长度为5位)
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码(纯数字,5位)
|
||||
"""
|
||||
if '.HK' in ts_code:
|
||||
return ts_code.replace('.HK', '')
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def convert_db_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的港股代码转换为Tushare格式
|
||||
数据库格式:01810、00700
|
||||
Tushare格式:01810.HK、00700.HK
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if not symbol.endswith('.HK'):
|
||||
return f"{symbol}.HK"
|
||||
return symbol
|
||||
|
||||
def fetch_hk_stock_list(self):
|
||||
"""
|
||||
从数据库获取港股代码列表
|
||||
|
||||
Returns:
|
||||
港股代码列表(数据库格式)
|
||||
"""
|
||||
try:
|
||||
query = """
|
||||
SELECT DISTINCT gp_code
|
||||
FROM gp_code_hk
|
||||
WHERE gp_code IS NOT NULL
|
||||
ORDER BY gp_code
|
||||
"""
|
||||
df = pd.read_sql(query, self.engine)
|
||||
stock_codes = df['gp_code'].tolist()
|
||||
print(f"从数据库获取到{len(stock_codes)}只港股代码")
|
||||
return stock_codes
|
||||
except Exception as e:
|
||||
print(f"从数据库获取港股代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_hk_daily_data(self, trade_date=None, ts_code=None, start_date=None, end_date=None):
|
||||
"""
|
||||
获取港股日线数据
|
||||
|
||||
Args:
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
ts_code: 股票代码,Tushare格式(单股查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
港股日线数据DataFrame
|
||||
"""
|
||||
try:
|
||||
# 构建API参数
|
||||
params = {}
|
||||
if trade_date:
|
||||
params['trade_date'] = trade_date
|
||||
if ts_code:
|
||||
params['ts_code'] = ts_code
|
||||
if start_date:
|
||||
params['start_date'] = start_date
|
||||
if end_date:
|
||||
params['end_date'] = end_date
|
||||
|
||||
df = self.pro.hk_daily(**params)
|
||||
time.sleep(0.21) # API限频控制,每分钟不超过280次
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取港股日线数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换数据格式为数据库格式(与gp_day_data表结构一致)
|
||||
|
||||
Args:
|
||||
df: 原始数据DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame,存储到gp_day_data表
|
||||
|
||||
字段说明:
|
||||
- symbol: 纯数字5位(如01810),不带市场编码
|
||||
- timestamp: 交易日期
|
||||
- volume: 成交量(手)
|
||||
- open/high/low/close: 价格(转为字符串)
|
||||
- chg: 涨跌额(转为字符串)
|
||||
- percent: 涨跌幅(%)
|
||||
- turnoverrate: 换手率(港股接口无此数据,设为NULL)
|
||||
- amount: 成交额(港币)
|
||||
- pb/pe/ps: 估值指标(港股接口无此数据,设为NULL)
|
||||
- pre_close: 昨收价
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 创建符合gp_day_data表结构的DataFrame
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射和转换(与A股V3版本保持一致)
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db) # 纯数字5位
|
||||
result_df['timestamp'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
result_df['volume'] = df['vol'] # 港股vol单位是手,保持不变
|
||||
result_df['open'] = df['open'].astype(str) # 转为字符串与A股表结构一致
|
||||
result_df['high'] = df['high'].astype(str)
|
||||
result_df['low'] = df['low'].astype(str)
|
||||
result_df['close'] = df['close'].astype(str)
|
||||
result_df['chg'] = df['change'].astype(str)
|
||||
result_df['percent'] = df['pct_chg']
|
||||
result_df['turnoverrate'] = None # 港股日线接口没有换手率数据
|
||||
result_df['amount'] = df['amount'] * 1000 # Tushare的amount单位是千港币,转换为港币
|
||||
result_df['pb'] = None # 港股日线接口没有PB数据,保持NULL
|
||||
result_df['pe'] = None # 港股日线接口没有PE数据,保持NULL
|
||||
result_df['ps'] = None # 港股日线接口没有PS数据,保持NULL
|
||||
result_df['pre_close'] = df['pre_close']
|
||||
|
||||
# 按时间排序
|
||||
result_df = result_df.sort_values('timestamp').reset_index(drop=True)
|
||||
|
||||
return result_df
|
||||
|
||||
def check_ex_rights_before_save(self, df, date_str):
|
||||
"""
|
||||
在保存数据库之前检查除权情况,返回除权股票列表和除权日志数据
|
||||
|
||||
Args:
|
||||
df: 待保存的日线数据DataFrame
|
||||
date_str: 当前采集日期,格式YYYY-MM-DD
|
||||
|
||||
Returns:
|
||||
tuple: (除权股票列表, 除权日志数据列表)
|
||||
"""
|
||||
print("正在检查港股除权情况...")
|
||||
|
||||
ex_rights_stocks = []
|
||||
ex_rights_log_data = []
|
||||
|
||||
from tqdm import tqdm
|
||||
|
||||
for _, row in tqdm(df.iterrows(), total=len(df), desc="检查除权"):
|
||||
symbol = row['symbol']
|
||||
current_pre_close = row['pre_close']
|
||||
|
||||
# 如果pre_close为空,跳过
|
||||
if pd.isna(current_pre_close):
|
||||
continue
|
||||
|
||||
# 查询数据库中该股票的最近两条收盘价记录
|
||||
query = text("""
|
||||
SELECT `close`, `timestamp` FROM {table_name}
|
||||
WHERE symbol = :symbol
|
||||
ORDER BY `timestamp` DESC
|
||||
LIMIT 2
|
||||
""".format(table_name=self.table_name))
|
||||
|
||||
try:
|
||||
with self.engine.connect() as conn:
|
||||
results = conn.execute(query, {"symbol": symbol}).fetchall()
|
||||
|
||||
if results:
|
||||
# 检查最新记录是否为今天的数据
|
||||
latest_record = results[0]
|
||||
latest_timestamp = latest_record[1]
|
||||
latest_date_str = latest_timestamp.strftime('%Y-%m-%d')
|
||||
|
||||
if latest_date_str == date_str and len(results) > 1:
|
||||
# 如果最新记录是今天的,且有第二条记录,则用第二条记录比较
|
||||
db_last_close = float(results[1][0])
|
||||
else:
|
||||
# 如果最新记录不是今天的,或者只有一条记录,则用最新记录比较
|
||||
db_last_close = float(results[0][0])
|
||||
|
||||
# 比较pre_close和数据库中的收盘价
|
||||
if abs(db_last_close - current_pre_close) > 0.001:
|
||||
print(f"发现除权港股: {symbol}, 数据库收盘价: {db_last_close}, 当前昨收价: {current_pre_close}")
|
||||
ex_rights_stocks.append(symbol)
|
||||
|
||||
# 收集除权日志数据
|
||||
ex_rights_log_data.append({
|
||||
'stock_code': symbol,
|
||||
'change_date': date_str,
|
||||
'before_price': db_last_close,
|
||||
'after_price': current_pre_close,
|
||||
'update_time': datetime.now()
|
||||
})
|
||||
except Exception as e:
|
||||
# 如果查询失败(比如股票是新上市的),跳过
|
||||
continue
|
||||
|
||||
if ex_rights_stocks:
|
||||
print(f"检测到 {len(ex_rights_stocks)} 只除权港股: {ex_rights_stocks}")
|
||||
else:
|
||||
print("未发现除权港股")
|
||||
|
||||
return ex_rights_stocks, ex_rights_log_data
|
||||
|
||||
def save_ex_rights_log(self, log_data):
|
||||
"""
|
||||
将除权日志保存到数据库
|
||||
|
||||
Args:
|
||||
log_data: 除权日志数据列表
|
||||
"""
|
||||
if not log_data:
|
||||
return
|
||||
|
||||
print(f"正在保存 {len(log_data)} 条港股除权日志到gp_ex_rights_log表...")
|
||||
try:
|
||||
df = pd.DataFrame(log_data)
|
||||
df.to_sql('gp_ex_rights_log', self.engine, if_exists='append', index=False)
|
||||
print("港股除权日志保存成功")
|
||||
except Exception as e:
|
||||
print(f"保存港股除权日志失败: {e}")
|
||||
|
||||
def handle_ex_rights_stocks(self, ex_rights_stocks, ex_rights_log_data, days=180):
|
||||
"""
|
||||
处理除权港股:保存日志、删除历史数据并重新获取
|
||||
|
||||
Args:
|
||||
ex_rights_stocks: 除权股票列表
|
||||
ex_rights_log_data: 除权日志数据列表
|
||||
days: 重新获取的历史天数,默认180天
|
||||
"""
|
||||
if not ex_rights_stocks:
|
||||
return
|
||||
|
||||
print("=" * 60)
|
||||
print("开始处理除权港股...")
|
||||
print("=" * 60)
|
||||
|
||||
# 1. 保存除权日志
|
||||
if ex_rights_log_data:
|
||||
self.save_ex_rights_log(ex_rights_log_data)
|
||||
|
||||
# 2. 重新获取历史数据
|
||||
print(f"开始处理 {len(ex_rights_stocks)} 只除权港股,重新获取历史数据...")
|
||||
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
|
||||
from tqdm import tqdm
|
||||
|
||||
for symbol in tqdm(ex_rights_stocks, desc="处理除权港股"):
|
||||
try:
|
||||
# 转换为Tushare格式
|
||||
ts_code = self.convert_db_code_to_tushare(symbol)
|
||||
|
||||
# 删除该港股的所有历史数据(限制LENGTH(symbol)=5确保只删港股)
|
||||
delete_query = text(
|
||||
f"DELETE FROM {self.table_name} "
|
||||
f"WHERE symbol = :symbol "
|
||||
f"AND LENGTH(symbol) = 5"
|
||||
)
|
||||
with self.engine.begin() as conn:
|
||||
result = conn.execute(delete_query, {"symbol": symbol})
|
||||
print(f"已删除 {symbol} 的 {result.rowcount} 条历史数据")
|
||||
|
||||
# 计算日期范围
|
||||
end_date_obj = datetime.now()
|
||||
start_date_obj = end_date_obj - timedelta(days=days)
|
||||
start_date_str = start_date_obj.strftime('%Y%m%d')
|
||||
end_date_str = end_date_obj.strftime('%Y%m%d')
|
||||
|
||||
# 重新获取历史数据
|
||||
df = self.fetch_hk_daily_data(
|
||||
ts_code=ts_code,
|
||||
start_date=start_date_str,
|
||||
end_date=end_date_str
|
||||
)
|
||||
|
||||
if df.empty:
|
||||
print(f"未获取到{symbol}的历史数据")
|
||||
fail_count += 1
|
||||
continue
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print(f"数据转换失败: {symbol}")
|
||||
fail_count += 1
|
||||
continue
|
||||
|
||||
# 保存到数据库
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功重新获取 {symbol} 的历史数据,共{len(result_df)}条记录")
|
||||
success_count += 1
|
||||
|
||||
except Exception as e:
|
||||
print(f"处理除权港股 {symbol} 失败: {e}")
|
||||
fail_count += 1
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("除权港股处理完成")
|
||||
print("=" * 60)
|
||||
print(f"成功: {success_count}只")
|
||||
print(f"失败: {fail_count}只")
|
||||
print("=" * 60)
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集
|
||||
按日期获取全市场港股日线数据(推荐方式)
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集(全市场)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧港股数据(港股代码长度为5位)
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(
|
||||
f"DELETE FROM {self.table_name} "
|
||||
f"WHERE DATE(`timestamp`) = :date_str "
|
||||
f"AND LENGTH(symbol) = 5"
|
||||
)
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{self.table_name}表中{date_str}的旧港股数据(LENGTH(symbol)=5),共{result.rowcount}条")
|
||||
|
||||
# 获取全市场港股日线数据
|
||||
print(f"正在获取{date_str}全市场港股日线数据...")
|
||||
df = self.fetch_hk_daily_data(trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
print(f"{date_str}没有港股日线数据(可能是非交易日)")
|
||||
return
|
||||
|
||||
print(f"成功获取港股日线数据,共{len(df)}只股票")
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据转换失败")
|
||||
return
|
||||
|
||||
# 检查除权(保存前)
|
||||
ex_rights_stocks, ex_rights_log_data = self.check_ex_rights_before_save(result_df, date_str)
|
||||
|
||||
# 保存到数据库
|
||||
print(f"正在保存数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}条记录")
|
||||
|
||||
# 处理除权股票(保存后)
|
||||
self.handle_ex_rights_stocks(ex_rights_stocks, ex_rights_log_data)
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"股票数量: {len(result_df)}只")
|
||||
print(f"除权处理: {len(ex_rights_stocks)}只")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
执行全量历史数据采集(按股票逐个采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为180天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量历史数据采集(按股票逐个采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近180天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=180)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
start_date_str = start_date_obj.strftime('%Y%m%d')
|
||||
end_date_str = end_date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 获取港股代码列表
|
||||
stock_codes = self.fetch_hk_stock_list()
|
||||
|
||||
if not stock_codes:
|
||||
print("没有找到港股代码,请先在gp_code_hk表中添加港股代码")
|
||||
return
|
||||
|
||||
print(f"开始采集{len(stock_codes)}只港股的历史数据...")
|
||||
print("=" * 60)
|
||||
|
||||
# 按股票逐个采集
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
total_records = 0
|
||||
|
||||
for i, symbol in enumerate(stock_codes, 1):
|
||||
try:
|
||||
# 转换为Tushare格式
|
||||
ts_code = self.convert_db_code_to_tushare(symbol)
|
||||
|
||||
# 获取该股票历史数据
|
||||
df = self.fetch_hk_daily_data(
|
||||
ts_code=ts_code,
|
||||
start_date=start_date_str,
|
||||
end_date=end_date_str
|
||||
)
|
||||
|
||||
if not df.empty:
|
||||
# 删除该港股在该日期范围的旧数据(限制LENGTH(symbol)=5确保只删港股)
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(
|
||||
f"DELETE FROM {self.table_name} "
|
||||
f"WHERE symbol = :symbol "
|
||||
f"AND LENGTH(symbol) = 5 "
|
||||
f"AND `timestamp` BETWEEN :start_date AND :end_date"
|
||||
)
|
||||
conn.execute(delete_query, {
|
||||
"symbol": symbol,
|
||||
"start_date": start_date_obj.strftime('%Y-%m-%d'),
|
||||
"end_date": end_date_obj.strftime('%Y-%m-%d')
|
||||
})
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 保存到数据库
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(result_df)
|
||||
success_count += 1
|
||||
|
||||
# 每10只股票显示一次进度
|
||||
if i % 10 == 0:
|
||||
print(f"进度: {i}/{len(stock_codes)} ({success_count}成功, {fail_count}失败, 共{total_records}条记录)")
|
||||
|
||||
except Exception as e:
|
||||
fail_count += 1
|
||||
if i % 10 == 0:
|
||||
print(f"采集 {symbol} 失败: {e}")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量历史数据采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"成功采集: {success_count}只")
|
||||
print(f"失败: {fail_count}只")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量历史数据采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_date_range_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
按日期范围逐日采集全市场数据(推荐用于历史数据采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为30天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行日期范围采集(按日期逐日采集全市场)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近30天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=30)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 按日期逐日采集
|
||||
current_date = start_date_obj
|
||||
total_days = (end_date_obj - start_date_obj).days + 1
|
||||
processed_days = 0
|
||||
success_days = 0
|
||||
total_records = 0
|
||||
|
||||
while current_date <= end_date_obj:
|
||||
date_str = current_date.strftime('%Y-%m-%d')
|
||||
trade_date = current_date.strftime('%Y%m%d')
|
||||
|
||||
print(f"\n[{processed_days + 1}/{total_days}] 采集日期: {date_str}")
|
||||
sleep(31)
|
||||
try:
|
||||
# 获取全市场数据
|
||||
df = self.fetch_hk_daily_data(trade_date=trade_date)
|
||||
|
||||
if not df.empty:
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 删除该日期旧港股数据(LENGTH(symbol)=5)
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(
|
||||
f"DELETE FROM {self.table_name} "
|
||||
f"WHERE DATE(`timestamp`) = :date_str "
|
||||
f"AND LENGTH(symbol) = 5"
|
||||
)
|
||||
conn.execute(delete_query, {"date_str": date_str})
|
||||
|
||||
# 保存新数据
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(result_df)
|
||||
success_days += 1
|
||||
print(f" 成功: {len(result_df)}条记录")
|
||||
else:
|
||||
print(f" 无数据(可能是非交易日)")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 采集失败: {e}")
|
||||
|
||||
# 移到下一天
|
||||
current_date += timedelta(days=1)
|
||||
processed_days += 1
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("日期范围采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"总天数: {total_days}")
|
||||
print(f"成功天数: {success_days}")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"日期范围采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_hk_daily_data(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
港股日线数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式
|
||||
- 'daily': 增量采集当日数据(按日期获取全市场,推荐)
|
||||
- 'full': 全量覆盖采集(按股票逐个采集)
|
||||
- 'range': 日期范围采集(按日期逐日采集全市场,推荐用于历史数据)
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 开始日期(mode='full'或'range'时有效),格式YYYY-MM-DD
|
||||
end_date: 结束日期(mode='full'或'range'时有效),格式YYYY-MM-DD
|
||||
|
||||
注意:
|
||||
- 港股数据会保存到gp_day_data表(与A股共用)
|
||||
- symbol格式为纯数字5位(如01810),不带市场编码
|
||||
- 删除数据时只删除LENGTH(symbol)=5的记录,不影响A股数据
|
||||
"""
|
||||
collector = HKDailyDataCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date)
|
||||
elif mode == 'range':
|
||||
collector.run_date_range_collection(start_date, end_date)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每日17:00后使用,一次性获取全市场数据)
|
||||
# collect_hk_daily_data(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 日期范围采集(推荐用于历史数据,按日期逐日采集全市场)
|
||||
# collect_hk_daily_data(db_url, tushare_token, mode='range',
|
||||
# start_date='2022-01-01', end_date='2025-11-03')
|
||||
# 港股的采集到了11月4日的数据(待采集的)
|
||||
# 3. 采集指定日期的数据
|
||||
collect_hk_daily_data(db_url, tushare_token, mode='daily', date='2025-11-04')
|
||||
|
||||
# 4. 全量覆盖采集(按股票逐个采集,较慢,不推荐)
|
||||
# collect_hk_daily_data(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
# import akshare as ak
|
||||
# stock_zh_a_spot_df = ak.stock_zh_a_spot()
|
||||
# print(stock_zh_a_spot_df)
|
||||
|
||||
|
|
@ -0,0 +1,404 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
A股实时行情数据采集工具(基于Tushare)
|
||||
功能:从Tushare获取A股实时行情数据,存储到Redis
|
||||
API:ts.realtime_quote() - 新浪实时行情数据
|
||||
注意:
|
||||
1. 免费接口,无积分限制
|
||||
2. 单次最多支持50个股票代码
|
||||
3. 实时数据,交易时间段可频繁调用
|
||||
4. 数据结构与雪球格式对齐,便于业务兼容
|
||||
数据存储:
|
||||
- 存储位置:Redis Hash
|
||||
- Key:xq_stock_changes_latest(与雪球脚本保持一致)
|
||||
- Field:股票代码(如SZ000978)
|
||||
- Value:JSON格式的实时行情数据
|
||||
采集策略:
|
||||
- 从gp_code_all表获取所有A股代码
|
||||
- 每49只股票调用一次API(避免超过50个限制)
|
||||
- 批量写入Redis,替换旧数据
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
import redis
|
||||
import json
|
||||
from datetime import datetime
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
from sqlalchemy import create_engine
|
||||
|
||||
# Redis配置
|
||||
try:
|
||||
from src.valuation_analysis.config import REDIS_CONFIG
|
||||
except ImportError:
|
||||
REDIS_CONFIG = {
|
||||
'host': 'localhost',
|
||||
'port': 6379,
|
||||
'db': 0,
|
||||
'password': None
|
||||
}
|
||||
|
||||
REDIS_KEY = 'xq_stock_changes_latest' # 与雪球脚本保持一致
|
||||
|
||||
|
||||
class RealtimeQuoteCollector:
|
||||
"""A股实时行情数据采集器(基于Tushare)"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, batch_size=49):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
batch_size: 每批采集的股票数量,默认49(API最大支持50)
|
||||
"""
|
||||
self.db_url = db_url
|
||||
self.batch_size = batch_size
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
|
||||
# 初始化Redis连接
|
||||
self.redis_conn = self._get_redis_conn()
|
||||
|
||||
print("=" * 60)
|
||||
print("A股实时行情数据采集工具(Tushare版)")
|
||||
print(f"Redis Key: {REDIS_KEY}")
|
||||
print(f"批次大小: {batch_size}只股票/次")
|
||||
print("=" * 60)
|
||||
|
||||
def _get_redis_conn(self):
|
||||
"""获取Redis连接"""
|
||||
pool = redis.ConnectionPool(
|
||||
host=REDIS_CONFIG['host'],
|
||||
port=REDIS_CONFIG['port'],
|
||||
db=REDIS_CONFIG.get('db', 0),
|
||||
password=REDIS_CONFIG.get('password', None),
|
||||
decode_responses=True
|
||||
)
|
||||
return redis.Redis(connection_pool=pool)
|
||||
|
||||
def convert_db_code_to_tushare(self, db_code):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001、BJ430047
|
||||
Tushare格式:600000.SH、000001.SZ、430047.BJ
|
||||
|
||||
Args:
|
||||
db_code: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if db_code.startswith('SH'):
|
||||
return f"{db_code[2:]}.SH"
|
||||
elif db_code.startswith('SZ'):
|
||||
return f"{db_code[2:]}.SZ"
|
||||
elif db_code.startswith('BJ'):
|
||||
return f"{db_code[2:]}.BJ"
|
||||
else:
|
||||
return db_code
|
||||
|
||||
def fetch_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有A股股票代码
|
||||
|
||||
Returns:
|
||||
股票代码列表(数据库格式,如SH600000)
|
||||
"""
|
||||
try:
|
||||
engine = create_engine(self.db_url)
|
||||
query = "SELECT gp_code FROM gp_code_all WHERE gp_code IS NOT NULL ORDER BY gp_code"
|
||||
df = pd.read_sql(query, engine)
|
||||
engine.dispose()
|
||||
|
||||
stock_codes = df['gp_code'].tolist()
|
||||
print(f"从数据库获取到{len(stock_codes)}只A股代码")
|
||||
return stock_codes
|
||||
except Exception as e:
|
||||
print(f"从数据库获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_realtime_quote(self, ts_codes):
|
||||
"""
|
||||
获取实时行情数据
|
||||
|
||||
Args:
|
||||
ts_codes: Tushare格式的股票代码列表(如['600000.SH', '000001.SZ'])
|
||||
|
||||
Returns:
|
||||
实时行情DataFrame
|
||||
"""
|
||||
try:
|
||||
# 将列表转换为逗号分隔的字符串
|
||||
ts_code_str = ','.join(ts_codes)
|
||||
|
||||
# 调用Tushare实时行情接口
|
||||
df = ts.realtime_quote(ts_code=ts_code_str)
|
||||
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取实时行情失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_to_redis_format(self, row, db_code):
|
||||
"""
|
||||
将Tushare实时行情数据转换为Redis存储格式(与雪球格式对齐)
|
||||
|
||||
Args:
|
||||
row: Tushare实时行情数据的一行(Series)
|
||||
db_code: 数据库格式的股票代码(如SH600000)
|
||||
|
||||
Returns:
|
||||
dict: 转换后的数据字典
|
||||
"""
|
||||
# 创建与雪球格式对齐的数据结构
|
||||
result = {
|
||||
# 基础信息
|
||||
"symbol": db_code, # 股票代码(数据库格式)
|
||||
"name": row.get('NAME', ''), # 股票名称
|
||||
|
||||
# 价格信息
|
||||
"current": row.get('PRICE', None), # 当前价
|
||||
"open": row.get('OPEN', None), # 开盘价
|
||||
"high": row.get('HIGH', None), # 最高价
|
||||
"low": row.get('LOW', None), # 最低价
|
||||
"pre_close": row.get('PRE_CLOSE', None), # 昨收价(对应last_close)
|
||||
|
||||
# 涨跌信息
|
||||
"chg": None, # 涨跌额(需要计算)
|
||||
"percent": None, # 涨跌幅(需要计算)
|
||||
|
||||
# 成交信息
|
||||
"volume": row.get('VOLUME', None), # 成交量
|
||||
"amount": row.get('AMOUNT', None), # 成交额
|
||||
|
||||
# 估值信息(实时行情接口无,设为None)
|
||||
"pe_ttm": None,
|
||||
"pb": None,
|
||||
"pb_ttm": None,
|
||||
"ps": None,
|
||||
"pcf": None,
|
||||
"dividend_yield": None,
|
||||
"roe_ttm": None,
|
||||
|
||||
# 市值信息(实时行情接口无,设为None)
|
||||
"market_capital": None,
|
||||
"float_market_capital": None,
|
||||
"total_shares": None,
|
||||
"float_shares": None,
|
||||
|
||||
# 交易信息(实时行情接口无,设为None)
|
||||
"turnover_rate": None,
|
||||
"volume_ratio": None,
|
||||
"amplitude": None,
|
||||
|
||||
# 其他信息
|
||||
"fetch_time": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), # 采集时间
|
||||
"type": 11, # 默认类型
|
||||
"has_follow": False,
|
||||
"tick_size": 0.01,
|
||||
"lot_size": 100,
|
||||
}
|
||||
|
||||
# 计算涨跌额和涨跌幅
|
||||
if result['current'] is not None and result['pre_close'] is not None:
|
||||
try:
|
||||
current = float(result['current'])
|
||||
pre_close = float(result['pre_close'])
|
||||
|
||||
# 涨跌额
|
||||
result['chg'] = round(current - pre_close, 2)
|
||||
|
||||
# 涨跌幅(百分比)
|
||||
if pre_close != 0:
|
||||
result['percent'] = round((current - pre_close) / pre_close * 100, 2)
|
||||
except:
|
||||
pass
|
||||
|
||||
return result
|
||||
|
||||
def run_collection(self):
|
||||
"""
|
||||
执行实时行情采集
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行A股实时行情采集")
|
||||
print("=" * 60)
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# 获取所有股票代码
|
||||
db_codes = self.fetch_stock_codes()
|
||||
|
||||
if not db_codes:
|
||||
print("未获取到股票代码,终止采集")
|
||||
return
|
||||
|
||||
total_codes = len(db_codes)
|
||||
print(f"共需采集 {total_codes} 只股票")
|
||||
print(f"将分 {(total_codes + self.batch_size - 1) // self.batch_size} 批次进行")
|
||||
print("=" * 60)
|
||||
|
||||
# 先采集所有数据到内存,避免中途出错导致数据不完整
|
||||
print("开始采集数据(先采集到内存,完成后统一保存)...")
|
||||
all_data = {} # 存储所有采集到的数据 {db_code: data_dict}
|
||||
batch_num = 0
|
||||
total_collected = 0
|
||||
|
||||
for i in range(0, total_codes, self.batch_size):
|
||||
batch_num += 1
|
||||
batch_db_codes = db_codes[i:i + self.batch_size]
|
||||
|
||||
# 转换为Tushare格式
|
||||
batch_ts_codes = [self.convert_db_code_to_tushare(code) for code in batch_db_codes]
|
||||
|
||||
try:
|
||||
# 获取实时行情
|
||||
df = self.fetch_realtime_quote(batch_ts_codes)
|
||||
|
||||
if df.empty:
|
||||
print(f" 批次 {batch_num} 未获取到数据")
|
||||
continue
|
||||
|
||||
# 转换数据并存储到内存
|
||||
# 创建TS_CODE到DB_CODE的映射
|
||||
ts_to_db_map = {
|
||||
self.convert_db_code_to_tushare(db_code): db_code
|
||||
for db_code in batch_db_codes
|
||||
}
|
||||
|
||||
for _, row in df.iterrows():
|
||||
# 根据TS_CODE匹配对应的DB_CODE
|
||||
ts_code = row.get('TS_CODE', '')
|
||||
if ts_code in ts_to_db_map:
|
||||
db_code = ts_to_db_map[ts_code]
|
||||
|
||||
# 转换为Redis格式
|
||||
data = self.transform_to_redis_format(row, db_code)
|
||||
|
||||
# 存储到内存字典
|
||||
all_data[db_code] = data
|
||||
total_collected += 1
|
||||
|
||||
# 显示进度
|
||||
print(f" 累计进度: {total_collected}/{total_codes} ({total_collected*100//total_codes}%)")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 批次 {batch_num} 采集失败: {e}")
|
||||
continue
|
||||
|
||||
# API限频控制
|
||||
time.sleep(0.1)
|
||||
|
||||
# 采集完成后,一次性保存到Redis
|
||||
print("\n" + "=" * 60)
|
||||
print(f"数据采集完成,共采集到 {total_collected} 只股票的数据")
|
||||
print("开始保存到Redis...")
|
||||
print("=" * 60)
|
||||
|
||||
if all_data:
|
||||
# 使用pipeline批量写入,提高性能
|
||||
pipe = self.redis_conn.pipeline()
|
||||
|
||||
for db_code, data in all_data.items():
|
||||
pipe.hset(REDIS_KEY, db_code, json.dumps(data, ensure_ascii=False))
|
||||
|
||||
# 执行批量写入(这会替换Redis中的旧数据)
|
||||
pipe.execute()
|
||||
print(f"成功保存 {len(all_data)} 条记录到Redis")
|
||||
else:
|
||||
print("警告:未采集到任何数据,Redis数据保持不变")
|
||||
|
||||
end_time = time.time()
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("实时行情采集完成")
|
||||
print("=" * 60)
|
||||
print(f"总股票数: {total_codes}")
|
||||
print(f"成功采集: {total_collected}")
|
||||
print(f"成功保存: {len(all_data)}")
|
||||
print(f"失败: {total_codes - total_collected}")
|
||||
print(f"耗时: {end_time - start_time:.2f} 秒")
|
||||
print(f"Redis Key: {REDIS_KEY}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"采集过程发生错误: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
def get_stock_realtime_info(self, stock_code):
|
||||
"""
|
||||
从Redis获取单只股票的实时行情(兼容接口)
|
||||
|
||||
Args:
|
||||
stock_code: 股票代码,支持多种格式(SH600000、600000.SH等)
|
||||
|
||||
Returns:
|
||||
dict or None
|
||||
"""
|
||||
# 统一转换为数据库格式
|
||||
if '.' in stock_code:
|
||||
code, market = stock_code.split('.')
|
||||
if market == 'SH':
|
||||
db_code = f'SH{code}'
|
||||
elif market == 'SZ':
|
||||
db_code = f'SZ{code}'
|
||||
elif market == 'BJ':
|
||||
db_code = f'BJ{code}'
|
||||
else:
|
||||
db_code = stock_code
|
||||
elif stock_code.startswith(('SH', 'SZ', 'BJ')):
|
||||
db_code = stock_code
|
||||
else:
|
||||
# 默认不处理
|
||||
db_code = stock_code
|
||||
|
||||
# 从Redis获取
|
||||
value = self.redis_conn.hget(REDIS_KEY, db_code)
|
||||
if not value:
|
||||
return None
|
||||
|
||||
try:
|
||||
data = json.loads(value)
|
||||
return data
|
||||
except Exception as e:
|
||||
print(f"解析Redis数据失败: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def collect_realtime_quote(db_url, tushare_token, batch_size=49):
|
||||
"""
|
||||
A股实时行情采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
batch_size: 每批采集的股票数量,默认49
|
||||
"""
|
||||
collector = RealtimeQuoteCollector(db_url, tushare_token, batch_size)
|
||||
collector.run_collection()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 执行采集
|
||||
collect_realtime_quote(db_url, tushare_token, batch_size=49)
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
股票技术因子数据采集工具
|
||||
功能:从Tushare获取股票技术因子数据,存储到gp_stock_factor表
|
||||
API文档: https://tushare.pro/document/2?doc_id=296
|
||||
注意:该接口需要至少2000积分权限,单次最大返回10000条数据
|
||||
18点有数据
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class StockFactorCollector:
|
||||
"""股票技术因子数据采集器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='gp_stock_factor'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 数据表名,默认为gp_stock_factor
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.table_name = table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("股票技术因子数据采集工具")
|
||||
print(f"目标数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def convert_db_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if symbol.startswith('SH'):
|
||||
return f"{symbol[2:]}.SH"
|
||||
elif symbol.startswith('SZ'):
|
||||
return f"{symbol[2:]}.SZ"
|
||||
elif symbol.startswith('BJ'):
|
||||
return f"{symbol[2:]}.BJ"
|
||||
else:
|
||||
return symbol
|
||||
|
||||
def fetch_all_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有A股股票代码
|
||||
|
||||
Returns:
|
||||
股票代码列表
|
||||
"""
|
||||
try:
|
||||
query = "SELECT gp_code FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
codes = df['gp_code'].tolist()
|
||||
print(f"获取到A股股票代码: {len(codes)}个")
|
||||
return codes
|
||||
except Exception as e:
|
||||
print(f"获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_stock_factor(self, ts_code=None, trade_date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
从Tushare获取股票技术因子数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=296
|
||||
单次最大返回10000条数据
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
技术因子DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.stk_factor(
|
||||
ts_code=ts_code,
|
||||
trade_date=trade_date,
|
||||
start_date=start_date,
|
||||
end_date=end_date
|
||||
)
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取技术因子数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换Tushare数据为数据库格式
|
||||
|
||||
Args:
|
||||
df: Tushare返回的DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
result_df['ts_code'] = df['ts_code']
|
||||
result_df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
|
||||
# 基础价格字段
|
||||
result_df['close'] = df.get('close', None)
|
||||
result_df['open'] = df.get('open', None)
|
||||
result_df['high'] = df.get('high', None)
|
||||
result_df['low'] = df.get('low', None)
|
||||
result_df['pre_close'] = df.get('pre_close', None)
|
||||
result_df['change'] = df.get('change', None)
|
||||
result_df['pct_change'] = df.get('pct_change', None)
|
||||
result_df['vol'] = df.get('vol', None)
|
||||
result_df['amount'] = df.get('amount', None)
|
||||
|
||||
# 复权因子和复权价格
|
||||
result_df['adj_factor'] = df.get('adj_factor', None)
|
||||
result_df['open_hfq'] = df.get('open_hfq', None)
|
||||
result_df['open_qfq'] = df.get('open_qfq', None)
|
||||
result_df['close_hfq'] = df.get('close_hfq', None)
|
||||
result_df['close_qfq'] = df.get('close_qfq', None)
|
||||
result_df['high_hfq'] = df.get('high_hfq', None)
|
||||
result_df['high_qfq'] = df.get('high_qfq', None)
|
||||
result_df['low_hfq'] = df.get('low_hfq', None)
|
||||
result_df['low_qfq'] = df.get('low_qfq', None)
|
||||
result_df['pre_close_hfq'] = df.get('pre_close_hfq', None)
|
||||
result_df['pre_close_qfq'] = df.get('pre_close_qfq', None)
|
||||
|
||||
# 技术指标
|
||||
result_df['macd_dif'] = df.get('macd_dif', None)
|
||||
result_df['macd_dea'] = df.get('macd_dea', None)
|
||||
result_df['macd'] = df.get('macd', None)
|
||||
result_df['kdj_k'] = df.get('kdj_k', None)
|
||||
result_df['kdj_d'] = df.get('kdj_d', None)
|
||||
result_df['kdj_j'] = df.get('kdj_j', None)
|
||||
result_df['rsi_6'] = df.get('rsi_6', None)
|
||||
result_df['rsi_12'] = df.get('rsi_12', None)
|
||||
result_df['rsi_24'] = df.get('rsi_24', None)
|
||||
result_df['boll_upper'] = df.get('boll_upper', None)
|
||||
result_df['boll_mid'] = df.get('boll_mid', None)
|
||||
result_df['boll_lower'] = df.get('boll_lower', None)
|
||||
result_df['cci'] = df.get('cci', None)
|
||||
|
||||
return result_df
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
执行全量覆盖采集(按日期逐日采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为100天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量覆盖采集(按日期逐日采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近4000天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=4000)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 按日期逐日采集
|
||||
current_date = start_date_obj
|
||||
total_days = (end_date_obj - start_date_obj).days + 1
|
||||
processed_days = 0
|
||||
|
||||
while current_date <= end_date_obj:
|
||||
date_str = current_date.strftime('%Y-%m-%d')
|
||||
|
||||
print(f"\n[{processed_days + 1}/{total_days}] 采集日期: {date_str}")
|
||||
|
||||
try:
|
||||
# 使用每日采集方法
|
||||
self.run_daily_collection(date=date_str)
|
||||
except Exception as e:
|
||||
print(f"采集 {date_str} 失败: {e}")
|
||||
|
||||
# 移到下一天
|
||||
current_date += timedelta(days=1)
|
||||
processed_days += 1
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量覆盖采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"总天数: {total_days}")
|
||||
print(f"已处理: {processed_days}天")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集
|
||||
获取指定日期的全市场技术因子数据
|
||||
单次可获取10000条,足够一日所有股票数据
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(trade_date) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{self.table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 批量获取全市场当日技术因子数据(不传ts_code,获取所有股票)
|
||||
print(f"正在获取{date_str}全市场技术因子数据...")
|
||||
df = self.fetch_stock_factor(trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
print(f"{date_str}没有技术因子数据(可能是非交易日或接口无数据)")
|
||||
return
|
||||
|
||||
print(f"成功获取技术因子数据,共{len(df)}只股票")
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据转换失败")
|
||||
return
|
||||
|
||||
# 保存到数据库
|
||||
print(f"正在保存数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}条记录")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"成功采集: {len(result_df)}只股票")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_stock_factor(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
股票技术因子数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'full'=全量覆盖采集
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 开始日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为100天前
|
||||
end_date: 结束日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
collector = StockFactorCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每日使用)
|
||||
# collect_stock_factor(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 全量覆盖采集(首次使用或需要重建数据时)
|
||||
# collect_stock_factor(db_url, tushare_token, mode='full')
|
||||
|
||||
# 3. 采集指定日期的数据
|
||||
collect_stock_factor(db_url, tushare_token, mode='daily', date='2025-11-06')
|
||||
|
||||
# 4. 采集指定日期范围的数据
|
||||
# collect_stock_factor(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
|
|
@ -0,0 +1,770 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
股票技术因子数据采集工具(专业版-按年月分表)
|
||||
功能:从Tushare获取股票技术因子专业版数据,存储到gp_stock_factor_pro_YYYYMM月度分表
|
||||
API文档: https://tushare.pro/document/2?doc_id=328
|
||||
|
||||
注意事项:
|
||||
1. 该接口需要至少5000积分权限
|
||||
2. 单次最大返回10000条数据
|
||||
3. 由于全市场单日数据超过10000条限制,采用按股票逐一采集策略
|
||||
4. 每天17~18点左右更新
|
||||
5. 字段众多(261个),数据量巨大,采用按年月分表策略
|
||||
|
||||
分表策略:
|
||||
- 表名格式:gp_stock_factor_pro_202510(2025年10月)
|
||||
- 自动按数据的交易日期分配到对应月份的表
|
||||
- 每个月度表包含该月所有股票的所有技术因子数据
|
||||
|
||||
采集策略:
|
||||
- 每日增量:一次性获取指定日期全市场数据(约5000只股票),保存到当月分表(1次API调用,约1秒)
|
||||
- 全量历史:逐只股票采集日期范围数据(默认4000天),自动按月份分配到对应分表(每秒10次请求,约8分钟)
|
||||
|
||||
建表说明:
|
||||
- 首次使用建议手动创建模板表 gp_stock_factor_pro_template,包含所有261个字段
|
||||
- 或者手动创建首个月份的表(如gp_stock_factor_pro_202510),程序会自动复制表结构
|
||||
- 程序会尝试自动创建分表,但由于字段众多,建议提前手动创建
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class StockFactorProCollector:
|
||||
"""股票技术因子专业版数据采集器(按年月分表)"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, base_table_name='gp_stock_factor_pro'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
base_table_name: 基础表名,默认为gp_stock_factor_pro(实际表名会加上年月后缀,如gp_stock_factor_pro_202510)
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.base_table_name = base_table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("股票技术因子数据采集工具(专业版-按年月分表)")
|
||||
print(f"基础表名: {self.base_table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def get_table_name_by_date(self, date_str):
|
||||
"""
|
||||
根据日期获取对应的分表名称
|
||||
|
||||
Args:
|
||||
date_str: 日期字符串,格式YYYY-MM-DD
|
||||
|
||||
Returns:
|
||||
分表名称,如gp_stock_factor_pro_202510
|
||||
"""
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
year_month = date_obj.strftime('%Y%m')
|
||||
return f"{self.base_table_name}_{year_month}"
|
||||
|
||||
def create_monthly_table(self, table_name):
|
||||
"""
|
||||
创建月度分表(如果不存在)
|
||||
|
||||
Args:
|
||||
table_name: 表名,如gp_stock_factor_pro_202510
|
||||
"""
|
||||
try:
|
||||
# 由于字段太多(261个),这里使用简化的建表语句
|
||||
# 实际使用时,建议手动创建表或从模板表复制结构
|
||||
create_table_sql = f"""
|
||||
CREATE TABLE IF NOT EXISTS `{table_name}` LIKE `{self.base_table_name}_template`
|
||||
"""
|
||||
|
||||
# 如果没有模板表,则创建完整的表结构
|
||||
# 注意:由于字段太多,这里只列出关键字段,其他字段会在实际使用时动态处理
|
||||
fallback_sql = f"""
|
||||
CREATE TABLE IF NOT EXISTS `{table_name}` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '股票代码(数据库格式,如SH600000)',
|
||||
`ts_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Tushare股票代码(如600000.SH)',
|
||||
`trade_date` date NOT NULL COMMENT '交易日期',
|
||||
`open` decimal(10, 2) NULL DEFAULT NULL COMMENT '开盘价',
|
||||
`open_hfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '开盘价(后复权)',
|
||||
`open_qfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '开盘价(前复权)',
|
||||
`high` decimal(10, 2) NULL DEFAULT NULL COMMENT '最高价',
|
||||
`high_hfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '最高价(后复权)',
|
||||
`high_qfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '最高价(前复权)',
|
||||
`low` decimal(10, 2) NULL DEFAULT NULL COMMENT '最低价',
|
||||
`low_hfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '最低价(后复权)',
|
||||
`low_qfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '最低价(前复权)',
|
||||
`close` decimal(10, 2) NULL DEFAULT NULL COMMENT '收盘价',
|
||||
`close_hfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '收盘价(后复权)',
|
||||
`close_qfq` decimal(10, 2) NULL DEFAULT NULL COMMENT '收盘价(前复权)',
|
||||
`pre_close` decimal(10, 2) NULL DEFAULT NULL COMMENT '昨收价',
|
||||
`change` decimal(10, 2) NULL DEFAULT NULL COMMENT '涨跌额',
|
||||
`pct_chg` decimal(10, 4) NULL DEFAULT NULL COMMENT '涨跌幅(%)',
|
||||
`vol` decimal(20, 2) NULL DEFAULT NULL COMMENT '成交量(手)',
|
||||
`amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '成交额(千元)',
|
||||
`turnover_rate` decimal(10, 4) NULL DEFAULT NULL COMMENT '换手率(%)',
|
||||
`turnover_rate_f` decimal(10, 4) NULL DEFAULT NULL COMMENT '换手率(自由流通股)',
|
||||
`volume_ratio` decimal(10, 4) NULL DEFAULT NULL COMMENT '量比',
|
||||
`pe` decimal(10, 4) NULL DEFAULT NULL COMMENT '市盈率',
|
||||
`pe_ttm` decimal(10, 4) NULL DEFAULT NULL COMMENT '市盈率(TTM)',
|
||||
`pb` decimal(10, 4) NULL DEFAULT NULL COMMENT '市净率',
|
||||
`ps` decimal(10, 4) NULL DEFAULT NULL COMMENT '市销率',
|
||||
`ps_ttm` decimal(10, 4) NULL DEFAULT NULL COMMENT '市销率(TTM)',
|
||||
`dv_ratio` decimal(10, 4) NULL DEFAULT NULL COMMENT '股息率(%)',
|
||||
`dv_ttm` decimal(10, 4) NULL DEFAULT NULL COMMENT '股息率(TTM)(%)',
|
||||
`total_share` decimal(20, 2) NULL DEFAULT NULL COMMENT '总股本(万股)',
|
||||
`float_share` decimal(20, 2) NULL DEFAULT NULL COMMENT '流通股本(万股)',
|
||||
`free_share` decimal(20, 2) NULL DEFAULT NULL COMMENT '自由流通股本(万)',
|
||||
`total_mv` decimal(20, 2) NULL DEFAULT NULL COMMENT '总市值(万元)',
|
||||
`circ_mv` decimal(20, 2) NULL DEFAULT NULL COMMENT '流通市值(万元)',
|
||||
`adj_factor` decimal(15, 6) NULL DEFAULT NULL COMMENT '复权因子',
|
||||
`asi_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASI振动升降指标(不复权)',
|
||||
`asi_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASI振动升降指标(后复权)',
|
||||
`asi_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASI振动升降指标(前复权)',
|
||||
`asit_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASIT(不复权)',
|
||||
`asit_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASIT(后复权)',
|
||||
`asit_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ASIT(前复权)',
|
||||
`atr_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ATR真实波幅(不复权)',
|
||||
`atr_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ATR真实波幅(后复权)',
|
||||
`atr_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ATR真实波幅(前复权)',
|
||||
`bbi_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BBI多空指标(不复权)',
|
||||
`bbi_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BBI多空指标(后复权)',
|
||||
`bbi_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BBI多空指标(前复权)',
|
||||
`bias1_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS1乖离率(不复权)',
|
||||
`bias1_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS1乖离率(后复权)',
|
||||
`bias1_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS1乖离率(前复权)',
|
||||
`bias2_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS2乖离率(不复权)',
|
||||
`bias2_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS2乖离率(后复权)',
|
||||
`bias2_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS2乖离率(前复权)',
|
||||
`bias3_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS3乖离率(不复权)',
|
||||
`bias3_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS3乖离率(后复权)',
|
||||
`bias3_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BIAS3乖离率(前复权)',
|
||||
`boll_lower_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL下轨(不复权)',
|
||||
`boll_lower_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL下轨(后复权)',
|
||||
`boll_lower_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL下轨(前复权)',
|
||||
`boll_mid_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL中轨(不复权)',
|
||||
`boll_mid_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL中轨(后复权)',
|
||||
`boll_mid_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL中轨(前复权)',
|
||||
`boll_upper_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL上轨(不复权)',
|
||||
`boll_upper_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL上轨(后复权)',
|
||||
`boll_upper_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BOLL上轨(前复权)',
|
||||
`brar_ar_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-AR(不复权)',
|
||||
`brar_ar_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-AR(后复权)',
|
||||
`brar_ar_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-AR(前复权)',
|
||||
`brar_br_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-BR(不复权)',
|
||||
`brar_br_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-BR(后复权)',
|
||||
`brar_br_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'BRAR-BR(前复权)',
|
||||
`cci_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CCI顺势指标(不复权)',
|
||||
`cci_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CCI顺势指标(后复权)',
|
||||
`cci_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CCI顺势指标(前复权)',
|
||||
`cr_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CR价格动量指标(不复权)',
|
||||
`cr_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CR价格动量指标(后复权)',
|
||||
`cr_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'CR价格动量指标(前复权)',
|
||||
`dfma_dif_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIF(不复权)',
|
||||
`dfma_dif_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIF(后复权)',
|
||||
`dfma_dif_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIF(前复权)',
|
||||
`dfma_difma_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIFMA(不复权)',
|
||||
`dfma_difma_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIFMA(后复权)',
|
||||
`dfma_difma_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DFMA-DIFMA(前复权)',
|
||||
`dmi_adx_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADX(不复权)',
|
||||
`dmi_adx_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADX(后复权)',
|
||||
`dmi_adx_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADX(前复权)',
|
||||
`dmi_adxr_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADXR(不复权)',
|
||||
`dmi_adxr_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADXR(后复权)',
|
||||
`dmi_adxr_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-ADXR(前复权)',
|
||||
`dmi_mdi_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-MDI(不复权)',
|
||||
`dmi_mdi_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-MDI(后复权)',
|
||||
`dmi_mdi_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-MDI(前复权)',
|
||||
`dmi_pdi_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-PDI(不复权)',
|
||||
`dmi_pdi_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-PDI(后复权)',
|
||||
`dmi_pdi_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DMI-PDI(前复权)',
|
||||
`downdays` decimal(10, 0) NULL DEFAULT NULL COMMENT '连跌天数',
|
||||
`updays` decimal(10, 0) NULL DEFAULT NULL COMMENT '连涨天数',
|
||||
`dpo_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DPO区间震荡线(不复权)',
|
||||
`dpo_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DPO区间震荡线(后复权)',
|
||||
`dpo_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'DPO区间震荡线(前复权)',
|
||||
`madpo_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MADPO(不复权)',
|
||||
`madpo_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MADPO(后复权)',
|
||||
`madpo_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MADPO(前复权)',
|
||||
`ema_bfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA5(不复权)',
|
||||
`ema_bfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA10(不复权)',
|
||||
`ema_bfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA20(不复权)',
|
||||
`ema_bfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA30(不复权)',
|
||||
`ema_bfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA60(不复权)',
|
||||
`ema_bfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA90(不复权)',
|
||||
`ema_bfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA250(不复权)',
|
||||
`ema_hfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA5(后复权)',
|
||||
`ema_hfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA10(后复权)',
|
||||
`ema_hfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA20(后复权)',
|
||||
`ema_hfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA30(后复权)',
|
||||
`ema_hfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA60(后复权)',
|
||||
`ema_hfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA90(后复权)',
|
||||
`ema_hfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA250(后复权)',
|
||||
`ema_qfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA5(前复权)',
|
||||
`ema_qfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA10(前复权)',
|
||||
`ema_qfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA20(前复权)',
|
||||
`ema_qfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA30(前复权)',
|
||||
`ema_qfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA60(前复权)',
|
||||
`ema_qfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA90(前复权)',
|
||||
`ema_qfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMA250(前复权)',
|
||||
`emv_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMV简易波动指标(不复权)',
|
||||
`emv_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMV简易波动指标(后复权)',
|
||||
`emv_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EMV简易波动指标(前复权)',
|
||||
`maemv_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAEMV(不复权)',
|
||||
`maemv_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAEMV(后复权)',
|
||||
`maemv_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAEMV(前复权)',
|
||||
`expma_12_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA12(不复权)',
|
||||
`expma_12_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA12(后复权)',
|
||||
`expma_12_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA12(前复权)',
|
||||
`expma_50_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA50(不复权)',
|
||||
`expma_50_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA50(后复权)',
|
||||
`expma_50_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'EXPMA50(前复权)',
|
||||
`kdj_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-J(不复权)',
|
||||
`kdj_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-J(后复权)',
|
||||
`kdj_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-J(前复权)',
|
||||
`kdj_d_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-D(不复权)',
|
||||
`kdj_d_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-D(后复权)',
|
||||
`kdj_d_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-D(前复权)',
|
||||
`kdj_k_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-K(不复权)',
|
||||
`kdj_k_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-K(后复权)',
|
||||
`kdj_k_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KDJ-K(前复权)',
|
||||
`ktn_down_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN下轨(不复权)',
|
||||
`ktn_down_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN下轨(后复权)',
|
||||
`ktn_down_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN下轨(前复权)',
|
||||
`ktn_mid_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN中轨(不复权)',
|
||||
`ktn_mid_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN中轨(后复权)',
|
||||
`ktn_mid_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN中轨(前复权)',
|
||||
`ktn_upper_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN上轨(不复权)',
|
||||
`ktn_upper_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN上轨(后复权)',
|
||||
`ktn_upper_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'KTN上轨(前复权)',
|
||||
`lowdays` decimal(10, 0) NULL DEFAULT NULL COMMENT '最低价区间天数',
|
||||
`topdays` decimal(10, 0) NULL DEFAULT NULL COMMENT '最高价区间天数',
|
||||
`ma_bfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA5(不复权)',
|
||||
`ma_bfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA10(不复权)',
|
||||
`ma_bfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA20(不复权)',
|
||||
`ma_bfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA30(不复权)',
|
||||
`ma_bfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA60(不复权)',
|
||||
`ma_bfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA90(不复权)',
|
||||
`ma_bfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA250(不复权)',
|
||||
`ma_hfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA5(后复权)',
|
||||
`ma_hfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA10(后复权)',
|
||||
`ma_hfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA20(后复权)',
|
||||
`ma_hfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA30(后复权)',
|
||||
`ma_hfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA60(后复权)',
|
||||
`ma_hfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA90(后复权)',
|
||||
`ma_hfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA250(后复权)',
|
||||
`ma_qfq_5` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA5(前复权)',
|
||||
`ma_qfq_10` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA10(前复权)',
|
||||
`ma_qfq_20` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA20(前复权)',
|
||||
`ma_qfq_30` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA30(前复权)',
|
||||
`ma_qfq_60` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA60(前复权)',
|
||||
`ma_qfq_90` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA90(前复权)',
|
||||
`ma_qfq_250` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA250(前复权)',
|
||||
`macd_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD(不复权)',
|
||||
`macd_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD(后复权)',
|
||||
`macd_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD(前复权)',
|
||||
`macd_dea_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DEA(不复权)',
|
||||
`macd_dea_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DEA(后复权)',
|
||||
`macd_dea_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DEA(前复权)',
|
||||
`macd_dif_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DIF(不复权)',
|
||||
`macd_dif_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DIF(后复权)',
|
||||
`macd_dif_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MACD-DIF(前复权)',
|
||||
`mass_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MASS梅斯线(不复权)',
|
||||
`mass_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MASS梅斯线(后复权)',
|
||||
`mass_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MASS梅斯线(前复权)',
|
||||
`ma_mass_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA-MASS(不复权)',
|
||||
`ma_mass_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA-MASS(后复权)',
|
||||
`ma_mass_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MA-MASS(前复权)',
|
||||
`mfi_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MFI资金流量指标(不复权)',
|
||||
`mfi_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MFI资金流量指标(后复权)',
|
||||
`mfi_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MFI资金流量指标(前复权)',
|
||||
`mtm_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTM动量指标(不复权)',
|
||||
`mtm_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTM动量指标(后复权)',
|
||||
`mtm_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTM动量指标(前复权)',
|
||||
`mtmma_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTMMA(不复权)',
|
||||
`mtmma_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTMMA(后复权)',
|
||||
`mtmma_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MTMMA(前复权)',
|
||||
`obv_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'OBV能量潮(不复权)',
|
||||
`obv_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'OBV能量潮(后复权)',
|
||||
`obv_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'OBV能量潮(前复权)',
|
||||
`psy_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSY心理线指标(不复权)',
|
||||
`psy_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSY心理线指标(后复权)',
|
||||
`psy_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSY心理线指标(前复权)',
|
||||
`psyma_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSYMA(不复权)',
|
||||
`psyma_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSYMA(后复权)',
|
||||
`psyma_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'PSYMA(前复权)',
|
||||
`roc_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ROC变动率指标(不复权)',
|
||||
`roc_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ROC变动率指标(后复权)',
|
||||
`roc_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'ROC变动率指标(前复权)',
|
||||
`maroc_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAROC(不复权)',
|
||||
`maroc_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAROC(后复权)',
|
||||
`maroc_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'MAROC(前复权)',
|
||||
`rsi_bfq_6` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI6(不复权)',
|
||||
`rsi_bfq_12` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI12(不复权)',
|
||||
`rsi_bfq_24` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI24(不复权)',
|
||||
`rsi_hfq_6` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI6(后复权)',
|
||||
`rsi_hfq_12` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI12(后复权)',
|
||||
`rsi_hfq_24` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI24(后复权)',
|
||||
`rsi_qfq_6` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI6(前复权)',
|
||||
`rsi_qfq_12` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI12(前复权)',
|
||||
`rsi_qfq_24` decimal(15, 6) NULL DEFAULT NULL COMMENT 'RSI24(前复权)',
|
||||
`taq_down_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ下轨(不复权)',
|
||||
`taq_down_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ下轨(后复权)',
|
||||
`taq_down_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ下轨(前复权)',
|
||||
`taq_mid_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ中轨(不复权)',
|
||||
`taq_mid_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ中轨(后复权)',
|
||||
`taq_mid_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ中轨(前复权)',
|
||||
`taq_up_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ上轨(不复权)',
|
||||
`taq_up_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ上轨(后复权)',
|
||||
`taq_up_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TAQ上轨(前复权)',
|
||||
`trix_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRIX三重指数平滑平均线(不复权)',
|
||||
`trix_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRIX三重指数平滑平均线(后复权)',
|
||||
`trix_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRIX三重指数平滑平均线(前复权)',
|
||||
`trma_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRMA(不复权)',
|
||||
`trma_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRMA(后复权)',
|
||||
`trma_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'TRMA(前复权)',
|
||||
`vr_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'VR容量比率(不复权)',
|
||||
`vr_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'VR容量比率(后复权)',
|
||||
`vr_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'VR容量比率(前复权)',
|
||||
`wr_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR威廉指标(不复权)',
|
||||
`wr_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR威廉指标(后复权)',
|
||||
`wr_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR威廉指标(前复权)',
|
||||
`wr1_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR1威廉指标(不复权)',
|
||||
`wr1_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR1威廉指标(后复权)',
|
||||
`wr1_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'WR1威廉指标(前复权)',
|
||||
`xsii_td1_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD1(不复权)',
|
||||
`xsii_td1_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD1(后复权)',
|
||||
`xsii_td1_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD1(前复权)',
|
||||
`xsii_td2_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD2(不复权)',
|
||||
`xsii_td2_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD2(后复权)',
|
||||
`xsii_td2_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD2(前复权)',
|
||||
`xsii_td3_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD3(不复权)',
|
||||
`xsii_td3_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD3(后复权)',
|
||||
`xsii_td3_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD3(前复权)',
|
||||
`xsii_td4_bfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD4(不复权)',
|
||||
`xsii_td4_hfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD4(后复权)',
|
||||
`xsii_td4_qfq` decimal(15, 6) NULL DEFAULT NULL COMMENT 'XSII-TD4(前复权)',
|
||||
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `idx_symbol_trade_date`(`symbol` ASC, `trade_date` ASC) USING BTREE,
|
||||
INDEX `idx_symbol`(`symbol` ASC) USING BTREE,
|
||||
INDEX `idx_trade_date`(`trade_date` ASC) USING BTREE,
|
||||
INDEX `idx_ts_code`(`ts_code` ASC) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin
|
||||
COMMENT = '股票技术因子数据表-专业版(按月分表)' ROW_FORMAT = DYNAMIC
|
||||
"""
|
||||
|
||||
with self.engine.begin() as conn:
|
||||
try:
|
||||
# 尝试从模板表复制结构
|
||||
conn.execute(text(create_table_sql))
|
||||
print(f"✓ 表 {table_name} 已从模板表创建")
|
||||
except:
|
||||
# 如果模板表不存在,则使用基础建表语句
|
||||
# 注意:这只会创建基础字段,实际使用时Pandas会自动添加其他列
|
||||
conn.execute(text(fallback_sql))
|
||||
print(f"✓ 表 {table_name} 已创建(使用基础结构)")
|
||||
|
||||
except Exception as e:
|
||||
print(f"创建表 {table_name} 失败: {e}")
|
||||
# 不抛出异常,让程序继续运行,Pandas的to_sql会尝试创建表
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def convert_db_code_to_tushare(self, symbol):
|
||||
"""
|
||||
将数据库格式的股票代码转换为Tushare格式
|
||||
数据库格式:SH600000、SZ000001
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
|
||||
Args:
|
||||
symbol: 数据库格式的股票代码
|
||||
|
||||
Returns:
|
||||
Tushare格式的股票代码
|
||||
"""
|
||||
if symbol.startswith('SH'):
|
||||
return f"{symbol[2:]}.SH"
|
||||
elif symbol.startswith('SZ'):
|
||||
return f"{symbol[2:]}.SZ"
|
||||
elif symbol.startswith('BJ'):
|
||||
return f"{symbol[2:]}.BJ"
|
||||
else:
|
||||
return symbol
|
||||
|
||||
def fetch_all_stock_codes(self):
|
||||
"""
|
||||
从数据库获取所有A股股票代码
|
||||
|
||||
Returns:
|
||||
股票代码列表
|
||||
"""
|
||||
try:
|
||||
query = "SELECT gp_code FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
codes = df['gp_code'].tolist()
|
||||
print(f"获取到A股股票代码: {len(codes)}个")
|
||||
return codes
|
||||
except Exception as e:
|
||||
print(f"获取股票代码失败: {e}")
|
||||
return []
|
||||
|
||||
def fetch_stock_factor_pro(self, ts_code=None, trade_date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
从Tushare获取股票技术因子专业版数据
|
||||
API文档: https://tushare.pro/document/2?doc_id=328
|
||||
单次最大返回10000条数据
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码,为None时获取全市场数据
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
技术因子DataFrame
|
||||
"""
|
||||
try:
|
||||
df = self.pro.stk_factor_pro(
|
||||
ts_code=ts_code,
|
||||
trade_date=trade_date,
|
||||
start_date=start_date,
|
||||
end_date=end_date
|
||||
)
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取技术因子专业版数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换Tushare数据为数据库格式
|
||||
动态映射所有字段,支持261个字段的完整处理
|
||||
|
||||
Args:
|
||||
df: Tushare返回的DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 处理symbol和ts_code字段
|
||||
result_df['symbol'] = df['ts_code'].apply(self.convert_tushare_code_to_db)
|
||||
result_df['ts_code'] = df['ts_code']
|
||||
result_df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
|
||||
# 动态映射所有其他字段(除了ts_code和trade_date已处理)
|
||||
# 这样可以自动处理所有技术指标字段,无需手动枚举
|
||||
exclude_fields = {'ts_code', 'trade_date'}
|
||||
for col in df.columns:
|
||||
if col not in exclude_fields and col not in result_df.columns:
|
||||
result_df[col] = df[col]
|
||||
|
||||
return result_df
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
执行全量覆盖采集(按股票+日期范围采集,按年月分表)
|
||||
每只股票采集指定日期范围的数据,自动根据数据日期分配到对应的月度分表
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为4000天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量覆盖采集(按年月分表,按股票逐一采集日期范围)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近4000天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=4000)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
start_date_str = start_date_obj.strftime('%Y%m%d')
|
||||
end_date_str = end_date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 预先创建所有涉及月份的分表
|
||||
current_month = start_date_obj.replace(day=1)
|
||||
end_month = end_date_obj.replace(day=1)
|
||||
while current_month <= end_month:
|
||||
month_str = current_month.strftime('%Y-%m-%d')
|
||||
table_name = self.get_table_name_by_date(month_str)
|
||||
self.create_monthly_table(table_name)
|
||||
# 移动到下个月
|
||||
if current_month.month == 12:
|
||||
current_month = current_month.replace(year=current_month.year + 1, month=1)
|
||||
else:
|
||||
current_month = current_month.replace(month=current_month.month + 1)
|
||||
|
||||
# 获取所有A股股票代码
|
||||
stock_codes = self.fetch_all_stock_codes()
|
||||
if not stock_codes:
|
||||
print("未获取到股票代码")
|
||||
return
|
||||
|
||||
print(f"共需采集{len(stock_codes)}只股票")
|
||||
|
||||
# 逐只股票采集日期范围数据
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
total_records = 0
|
||||
|
||||
for i, symbol in enumerate(stock_codes, 1):
|
||||
try:
|
||||
# 转换为Tushare格式
|
||||
ts_code = self.convert_db_code_to_tushare(symbol)
|
||||
|
||||
# 获取该股票指定日期范围的技术因子数据
|
||||
df = self.fetch_stock_factor_pro(
|
||||
ts_code=ts_code,
|
||||
start_date=start_date_str,
|
||||
end_date=end_date_str
|
||||
)
|
||||
|
||||
if not df.empty:
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 按月份分组保存到对应的分表
|
||||
# 给每行数据添加一个临时的年月列用于分组
|
||||
result_df['year_month'] = result_df['trade_date'].dt.strftime('%Y%m')
|
||||
|
||||
# 按年月分组
|
||||
for year_month, group_df in result_df.groupby('year_month'):
|
||||
# 删除临时列
|
||||
group_df = group_df.drop(columns=['year_month'])
|
||||
|
||||
# 获取该月的表名
|
||||
table_name = f"{self.base_table_name}_{year_month}"
|
||||
|
||||
# 保存到对应的月度分表
|
||||
group_df.to_sql(table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(group_df)
|
||||
|
||||
success_count += 1
|
||||
|
||||
# 每50只股票显示一次进度
|
||||
if i % 50 == 0:
|
||||
print(f"进度: {i}/{len(stock_codes)} ({success_count}成功, {fail_count}失败, 共{total_records}条记录)")
|
||||
|
||||
# API限频控制
|
||||
time.sleep(0.1) # 每秒最多10次请求(历史数据较多,适当放慢)
|
||||
|
||||
except Exception as e:
|
||||
fail_count += 1
|
||||
if i % 50 == 0:
|
||||
print(f"采集 {symbol} 失败: {e}")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量覆盖采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"目标股票数: {len(stock_codes)}只")
|
||||
print(f"成功采集: {success_count}只")
|
||||
print(f"失败: {fail_count}只")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.base_table_name}_YYYYMM(按月分表)")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集(按年月分表)
|
||||
一次性获取指定日期全市场的技术因子专业版数据
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集(按年月分表,全市场一次性采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
# 获取当月分表名称
|
||||
table_name = self.get_table_name_by_date(date_str)
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
print(f"目标表名: {table_name}")
|
||||
|
||||
# 创建当月分表(如果不存在)
|
||||
self.create_monthly_table(table_name)
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {table_name} WHERE DATE(trade_date) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 一次性获取指定日期全市场的技术因子数据
|
||||
print(f"正在获取{date_str}全市场技术因子数据...")
|
||||
df = self.fetch_stock_factor_pro(ts_code=None, trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
print(f"{date_str}没有采集到任何数据(可能是非交易日)")
|
||||
return
|
||||
|
||||
print(f"成功获取{len(df)}条原始数据")
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print(f"数据转换后为空")
|
||||
return
|
||||
|
||||
# 一次性保存到数据库
|
||||
print(f"正在保存数据到{table_name}表...")
|
||||
result_df.to_sql(table_name, self.engine, if_exists='append', index=False)
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"采集股票数: {result_df['symbol'].nunique()}只")
|
||||
print(f"保存记录数: {len(result_df)}条")
|
||||
print(f"数据表: {table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_stock_factor_pro(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
股票技术因子专业版数据采集入口函数(按年月分表)
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式,'daily'=增量采集当日数据,'full'=全量覆盖采集
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 开始日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为4000天前
|
||||
end_date: 结束日期(仅mode='full'时有效),格式YYYY-MM-DD,默认为今天
|
||||
|
||||
分表说明:
|
||||
数据会自动保存到对应月份的分表中,表名格式为 gp_stock_factor_pro_YYYYMM
|
||||
例如:2025年10月的数据保存到 gp_stock_factor_pro_202510 表
|
||||
|
||||
采集策略:
|
||||
- 每日模式:一次性获取指定日期全市场数据(约5000只股票),保存到当月分表
|
||||
- 全量模式:逐只股票采集历史数据,自动按月份分配到对应分表
|
||||
"""
|
||||
collector = StockFactorProCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://fac_pattern:Chlry$%.8pattern@192.168.16.150:3306/factordb_mysql'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例(按年月分表):
|
||||
|
||||
# 1. 每日增量采集(推荐每日使用,一次性获取全市场数据,保存到当月分表)
|
||||
# collect_stock_factor_pro(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 全量覆盖采集(首次使用或需要重建数据时,默认采集近4000天数据,自动按月分配到对应分表)
|
||||
# collect_stock_factor_pro(db_url, tushare_token, mode='full')
|
||||
|
||||
# 3. 采集指定日期的数据(一次性获取全市场数据,保存到该日期对应的月份分表)
|
||||
collect_stock_factor_pro(db_url, tushare_token, mode='daily', date='2025-11-06')
|
||||
|
||||
# 4. 采集指定日期范围的数据(按股票逐一采集,数据会自动按月分配到对应分表)
|
||||
# collect_stock_factor_pro(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
|
||||
# 注意:
|
||||
# - 首次使用前,建议手动创建模板表 gp_stock_factor_pro_template 或首个月份表
|
||||
# - 表名格式:gp_stock_factor_pro_202510(2025年10月)
|
||||
# - 每个月度表包含该月所有股票的所有技术因子数据(261个字段)
|
||||
# - 每日模式:一次性请求全市场数据,速度快(约1秒)
|
||||
# - 全量模式:按股票逐一采集,适合采集历史数据(约5000只股票 × 0.1秒 ≈ 8分钟)
|
||||
|
||||
|
|
@ -0,0 +1,362 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
A股股票列表更新工具
|
||||
功能:从Tushare获取A股股票列表,更新gp_code_all表
|
||||
API文档: https://tushare.pro/document/2?doc_id=25
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class StockListUpdater:
|
||||
"""A股股票列表更新器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token):
|
||||
"""
|
||||
初始化更新器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("A股股票列表更新工具")
|
||||
print("=" * 60)
|
||||
|
||||
def convert_tushare_code_to_db(self, ts_code):
|
||||
"""
|
||||
将Tushare格式的股票代码转换为数据库格式
|
||||
Tushare格式:600000.SH、000001.SZ
|
||||
数据库格式:SH600000、SZ000001
|
||||
|
||||
Args:
|
||||
ts_code: Tushare格式的股票代码
|
||||
|
||||
Returns:
|
||||
数据库格式的股票代码
|
||||
"""
|
||||
if '.SH' in ts_code:
|
||||
return f"SH{ts_code.replace('.SH', '')}"
|
||||
elif '.SZ' in ts_code:
|
||||
return f"SZ{ts_code.replace('.SZ', '')}"
|
||||
elif '.BJ' in ts_code:
|
||||
return f"BJ{ts_code.replace('.BJ', '')}"
|
||||
else:
|
||||
return ts_code
|
||||
|
||||
def fetch_stock_list_from_tushare(self):
|
||||
"""
|
||||
从Tushare获取A股股票列表
|
||||
API: stock_basic
|
||||
文档: https://tushare.pro/document/2?doc_id=25
|
||||
|
||||
Returns:
|
||||
股票列表DataFrame
|
||||
"""
|
||||
try:
|
||||
print("正在从Tushare获取A股股票列表...")
|
||||
|
||||
# 获取A股股票列表(上市状态:L=上市,D=退市,P=暂停上市)
|
||||
# 只获取上市状态的股票
|
||||
df = self.pro.stock_basic(
|
||||
exchange='', # 空值表示获取所有交易所
|
||||
list_status='L', # L=上市
|
||||
fields='ts_code,symbol,name,area,industry,market,list_date,fullname,enname,cnspell,exchange,curr_type,list_status,delist_date,is_hs,act_name,act_ent_type'
|
||||
)
|
||||
|
||||
if df.empty:
|
||||
print("未获取到股票数据")
|
||||
return pd.DataFrame()
|
||||
|
||||
print(f"成功获取{len(df)}只A股股票信息")
|
||||
return df
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取股票列表失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def get_existing_stocks_from_db(self):
|
||||
"""
|
||||
从数据库获取现有的股票列表
|
||||
|
||||
Returns:
|
||||
现有股票代码列表(数据库格式)
|
||||
"""
|
||||
try:
|
||||
query = "SELECT gp_code, gp_name FROM gp_code_all"
|
||||
df = pd.read_sql(query, self.engine)
|
||||
|
||||
print(f"数据库现有股票数量: {len(df)}")
|
||||
return df
|
||||
|
||||
except Exception as e:
|
||||
print(f"查询数据库失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_to_db_format(self, df_tushare):
|
||||
"""
|
||||
将Tushare数据转换为数据库格式
|
||||
|
||||
Args:
|
||||
df_tushare: Tushare返回的股票列表DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame
|
||||
"""
|
||||
if df_tushare.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 创建新的DataFrame
|
||||
df_result = pd.DataFrame()
|
||||
|
||||
# 字段映射
|
||||
df_result['gp_name'] = df_tushare['name'] # 股票名称
|
||||
df_result['gp_code'] = df_tushare['ts_code'].apply(self.convert_tushare_code_to_db) # 主代码(如SH600000)
|
||||
df_result['gp_code_two'] = df_tushare['ts_code'] # Tushare格式代码(如300918.SZ)
|
||||
df_result['gp_code_three'] = None # 不需要填充
|
||||
|
||||
# market_cap字段为空,需要通过其他接口获取(这里暂不处理)
|
||||
df_result['market_cap'] = None
|
||||
|
||||
# mark1和mark2字段可用于标记市场类型
|
||||
# 根据交易所代码设置标记
|
||||
df_result['market'] = df_tushare['market'].apply(lambda x: '主板' if x == '主板' else ('科创板' if x == '科创板' else ('创业板' if x == '创业板' else '其他')))
|
||||
df_result['area'] = df_tushare['area']
|
||||
df_result['industry'] = df_tushare['industry']
|
||||
df_result['fullname'] = df_tushare['fullname']
|
||||
df_result['enname'] = df_tushare['enname']
|
||||
df_result['cnspell'] = df_tushare['cnspell']
|
||||
df_result['exchange'] = df_tushare['exchange']
|
||||
df_result['curr_type'] = df_tushare['curr_type']
|
||||
df_result['list_status'] = df_tushare['list_status']
|
||||
df_result['list_date'] = df_tushare['list_date']
|
||||
df_result['delist_date'] = df_tushare['delist_date']
|
||||
df_result['is_hs'] = df_tushare['is_hs']
|
||||
df_result['act_name'] = df_tushare['act_name']
|
||||
df_result['act_ent_type'] = df_tushare['act_ent_type']
|
||||
|
||||
return df_result
|
||||
|
||||
def update_stock_list(self):
|
||||
"""
|
||||
更新股票列表到数据库
|
||||
主流程:
|
||||
1. 从Tushare获取最新股票列表
|
||||
2. 从数据库获取现有股票列表
|
||||
3. 对比找出新增和需要更新的股票
|
||||
4. 执行插入和更新操作
|
||||
"""
|
||||
try:
|
||||
# 1. 从Tushare获取股票列表
|
||||
df_tushare = self.fetch_stock_list_from_tushare()
|
||||
if df_tushare.empty:
|
||||
print("未获取到Tushare数据,终止更新")
|
||||
return
|
||||
|
||||
# 2. 转换为数据库格式
|
||||
df_new = self.transform_to_db_format(df_tushare)
|
||||
print(f"转换数据完成,共{len(df_new)}条记录")
|
||||
|
||||
# 3. 从数据库获取现有股票列表
|
||||
df_existing = self.get_existing_stocks_from_db()
|
||||
|
||||
if df_existing.empty:
|
||||
# 数据库为空,全部插入
|
||||
print("数据库为空,将插入所有股票...")
|
||||
df_new.to_sql('gp_code_all', self.engine, if_exists='append', index=False)
|
||||
print(f"成功插入{len(df_new)}只股票")
|
||||
else:
|
||||
# 4. 对比数据,找出新增、更新和需要删除的股票
|
||||
existing_codes = set(df_existing['gp_code'].tolist())
|
||||
new_codes = set(df_new['gp_code'].tolist())
|
||||
|
||||
# 新增的股票代码
|
||||
codes_to_insert = new_codes - existing_codes
|
||||
# 需要更新的股票代码(已存在的)
|
||||
codes_to_update = new_codes & existing_codes
|
||||
# 需要删除的股票代码(数据库有但Tushare没有,可能已退市)
|
||||
codes_to_delete = existing_codes - new_codes
|
||||
|
||||
print(f"\n数据对比结果:")
|
||||
print(f" 数据库现有: {len(existing_codes)}只")
|
||||
print(f" Tushare获取: {len(new_codes)}只")
|
||||
print(f" 新增股票: {len(codes_to_insert)}只")
|
||||
print(f" 需更新: {len(codes_to_update)}只")
|
||||
print(f" 需删除: {len(codes_to_delete)}只(退市或其他原因)")
|
||||
|
||||
# 5. 插入新股票
|
||||
if codes_to_insert:
|
||||
df_insert = df_new[df_new['gp_code'].isin(codes_to_insert)]
|
||||
df_insert.to_sql('gp_code_all', self.engine, if_exists='append', index=False)
|
||||
print(f"\n新增股票列表:")
|
||||
for _, row in df_insert.iterrows():
|
||||
print(f" {row['gp_code']} - {row['gp_name']}")
|
||||
print(f"成功插入{len(df_insert)}只新股票")
|
||||
else:
|
||||
print("\n没有新增股票")
|
||||
|
||||
# 6. 更新已有股票信息
|
||||
if codes_to_update:
|
||||
print(f"\n正在更新{len(codes_to_update)}只股票的信息...")
|
||||
update_count = 0
|
||||
|
||||
df_update = df_new[df_new['gp_code'].isin(codes_to_update)]
|
||||
|
||||
with self.engine.begin() as conn:
|
||||
for _, row in df_update.iterrows():
|
||||
# 只更新gp_code_all表中有的字段
|
||||
update_query = text("""
|
||||
UPDATE gp_code_all
|
||||
SET gp_name = :gp_name,
|
||||
gp_code_two = :gp_code_two,
|
||||
gp_code_three = :gp_code_three,
|
||||
market = :market,
|
||||
area = :area,
|
||||
fullname = :fullname,
|
||||
enname = :enname,
|
||||
cnspell = :cnspell,
|
||||
exchange = :exchange,
|
||||
curr_type = :curr_type,
|
||||
list_status = :list_status,
|
||||
list_date = :list_date,
|
||||
delist_date = :delist_date,
|
||||
is_hs = :is_hs,
|
||||
act_name = :act_name,
|
||||
act_ent_type = :act_ent_type
|
||||
WHERE gp_code = :gp_code
|
||||
""")
|
||||
|
||||
conn.execute(update_query, {
|
||||
'gp_code': row['gp_code'],
|
||||
'gp_name': row['gp_name'],
|
||||
'gp_code_two': row['gp_code_two'],
|
||||
'gp_code_three': row['gp_code_three'],
|
||||
'market': row['market'],
|
||||
'area': row['area'],
|
||||
'fullname': row['fullname'],
|
||||
'enname': row['enname'],
|
||||
'cnspell': row['cnspell'],
|
||||
'exchange': row['exchange'],
|
||||
'curr_type': row['curr_type'],
|
||||
'list_status': row['list_status'],
|
||||
'list_date': row['list_date'],
|
||||
'delist_date': row['delist_date'],
|
||||
'is_hs': row['is_hs'],
|
||||
'act_name': row['act_name'],
|
||||
'act_ent_type': row['act_ent_type']
|
||||
})
|
||||
update_count += 1
|
||||
|
||||
print(f"成功更新{update_count}只股票信息")
|
||||
|
||||
# 7. 删除退市股票
|
||||
if codes_to_delete:
|
||||
print(f"\n正在删除{len(codes_to_delete)}只退市股票...")
|
||||
|
||||
# 显示要删除的股票
|
||||
df_delete = df_existing[df_existing['gp_code'].isin(codes_to_delete)]
|
||||
print(f"\n退市股票列表:")
|
||||
for _, row in df_delete.iterrows():
|
||||
print(f" {row['gp_code']} - {row['gp_name']}")
|
||||
|
||||
# 执行删除
|
||||
with self.engine.begin() as conn:
|
||||
for code in codes_to_delete:
|
||||
delete_query = text("DELETE FROM gp_code_all WHERE gp_code = :gp_code")
|
||||
conn.execute(delete_query, {'gp_code': code})
|
||||
|
||||
print(f"成功删除{len(codes_to_delete)}只退市股票")
|
||||
else:
|
||||
print("\n没有需要删除的股票")
|
||||
|
||||
# 8. 输出最终统计
|
||||
print("\n" + "=" * 60)
|
||||
print("股票列表更新完成")
|
||||
print("=" * 60)
|
||||
|
||||
# 查询更新后的总数
|
||||
query = "SELECT COUNT(*) as count FROM gp_code_all"
|
||||
result = pd.read_sql(query, self.engine)
|
||||
total_count = result['count'].iloc[0]
|
||||
print(f"数据库当前股票总数: {total_count}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"更新股票列表失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def show_recent_stocks(self, limit=10):
|
||||
"""
|
||||
显示最近上市的股票
|
||||
|
||||
Args:
|
||||
limit: 显示数量,默认10只
|
||||
"""
|
||||
try:
|
||||
query = """
|
||||
SELECT gp_code, gp_name, market, area
|
||||
FROM gp_code_all
|
||||
ORDER BY id DESC
|
||||
LIMIT :limit
|
||||
"""
|
||||
df = pd.read_sql(text(query), self.engine, params={'limit': limit})
|
||||
|
||||
if not df.empty:
|
||||
print(f"\n最近添加的{limit}只股票:")
|
||||
print("-" * 60)
|
||||
for _, row in df.iterrows():
|
||||
print(f"{row['gp_code']} - {row['gp_name']} ")
|
||||
|
||||
except Exception as e:
|
||||
print(f"查询失败: {e}")
|
||||
|
||||
|
||||
def update_stock_list(db_url, tushare_token):
|
||||
"""
|
||||
更新A股股票列表的入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
"""
|
||||
updater = StockListUpdater(db_url, tushare_token)
|
||||
updater.update_stock_list()
|
||||
updater.show_recent_stocks(10)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 执行更新
|
||||
update_stock_list(db_url, tushare_token)
|
||||
|
||||
|
|
@ -0,0 +1,517 @@
|
|||
# coding:utf-8
|
||||
|
||||
"""
|
||||
美股日线数据采集工具
|
||||
功能:从Tushare获取美股日线行情数据,存储到us_day_data表
|
||||
API文档: https://tushare.pro/document/2?doc_id=254
|
||||
注意:
|
||||
1. 该接口需要2000积分权限
|
||||
2. 单次最大返回5000条数据
|
||||
3. 美股交易时间:北京时间21:30-次日4:00(夏令时)或22:30-次日5:00(冬令时)
|
||||
4. 可按日期一次性获取全市场数据
|
||||
数据存储说明:
|
||||
- 存储表:us_day_data(美股专用表)
|
||||
- symbol格式:与Tushare一致(如AAPL、TSLA等)
|
||||
- PB/PE:从API获取市净率和市盈率数据
|
||||
- PS:API中无此数据,保持为NULL
|
||||
- turnoverrate:美股接口无换手率数据,保持为NULL
|
||||
采集策略:
|
||||
- 每日增量:按日期获取全市场数据(推荐)
|
||||
- 历史数据:按股票逐个采集历史数据
|
||||
- 每天美东时间收盘后(北京时间早上5-6点)更新
|
||||
"""
|
||||
|
||||
import tushare as ts
|
||||
import pandas as pd
|
||||
from sqlalchemy import create_engine, text
|
||||
from datetime import datetime, timedelta
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.scripts.config import TUSHARE_TOKEN
|
||||
|
||||
|
||||
class USDailyDataCollector:
|
||||
"""美股日线数据采集器"""
|
||||
|
||||
def __init__(self, db_url, tushare_token, table_name='us_day_data'):
|
||||
"""
|
||||
初始化采集器
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
table_name: 数据表名,默认为us_day_data
|
||||
"""
|
||||
self.engine = create_engine(
|
||||
db_url,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_recycle=3600
|
||||
)
|
||||
self.table_name = table_name
|
||||
|
||||
# 初始化Tushare
|
||||
ts.set_token(tushare_token)
|
||||
self.pro = ts.pro_api()
|
||||
|
||||
print("=" * 60)
|
||||
print("美股日线数据采集工具")
|
||||
print(f"目标数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
def fetch_us_stock_list(self):
|
||||
"""
|
||||
从数据库获取美股代码列表
|
||||
|
||||
Returns:
|
||||
美股代码列表
|
||||
"""
|
||||
try:
|
||||
query = """
|
||||
SELECT DISTINCT symbol
|
||||
FROM us_code
|
||||
WHERE symbol IS NOT NULL
|
||||
ORDER BY symbol
|
||||
"""
|
||||
df = pd.read_sql(query, self.engine)
|
||||
stock_codes = df['symbol'].tolist()
|
||||
print(f"从数据库获取到{len(stock_codes)}只美股代码")
|
||||
return stock_codes
|
||||
except Exception as e:
|
||||
print(f"从数据库获取美股代码失败: {e}")
|
||||
# 如果数据库查询失败,返回空列表
|
||||
return []
|
||||
|
||||
def fetch_us_daily_data(self, trade_date=None, ts_code=None, start_date=None, end_date=None):
|
||||
"""
|
||||
获取美股日线数据
|
||||
|
||||
Args:
|
||||
trade_date: 交易日期,格式YYYYMMDD(单日查询)
|
||||
ts_code: 股票代码,Tushare格式(单股查询)
|
||||
start_date: 开始日期,格式YYYYMMDD(范围查询)
|
||||
end_date: 结束日期,格式YYYYMMDD(范围查询)
|
||||
|
||||
Returns:
|
||||
美股日线数据DataFrame
|
||||
"""
|
||||
try:
|
||||
# 构建API参数
|
||||
params = {}
|
||||
if trade_date:
|
||||
params['trade_date'] = trade_date
|
||||
if ts_code:
|
||||
params['ts_code'] = ts_code
|
||||
if start_date:
|
||||
params['start_date'] = start_date
|
||||
if end_date:
|
||||
params['end_date'] = end_date
|
||||
|
||||
df = self.pro.us_daily(**params,fields=[
|
||||
"ts_code",
|
||||
"trade_date",
|
||||
"close",
|
||||
"open",
|
||||
"high",
|
||||
"low",
|
||||
"pre_close",
|
||||
"pct_change",
|
||||
"vol",
|
||||
"amount",
|
||||
"vwap",
|
||||
"pe",
|
||||
"pb",
|
||||
"change",
|
||||
"adj_factor",
|
||||
"turnover_ratio",
|
||||
"total_mv"
|
||||
])
|
||||
return df
|
||||
except Exception as e:
|
||||
print(f"获取美股日线数据失败: {e}")
|
||||
return pd.DataFrame()
|
||||
|
||||
def transform_data(self, df):
|
||||
"""
|
||||
转换数据格式为数据库格式(与us_day_data表结构一致)
|
||||
|
||||
Args:
|
||||
df: 原始数据DataFrame
|
||||
|
||||
Returns:
|
||||
转换后的DataFrame,存储到us_day_data表
|
||||
|
||||
字段说明:
|
||||
- symbol: 股票代码(如AAPL、TSLA)
|
||||
- timestamp: 交易日期
|
||||
- volume: 成交量(股)
|
||||
- open/high/low/close: 价格(转为字符串)
|
||||
- chg: 涨跌额(转为字符串)
|
||||
- percent: 涨跌幅(%)
|
||||
- turnoverrate: 换手率(美股接口无此数据,设为NULL)
|
||||
- amount: 成交额(美元)
|
||||
- pb/pe/ps: 估值指标(从接口获取)
|
||||
- pre_close: 昨收价
|
||||
"""
|
||||
if df.empty:
|
||||
return pd.DataFrame()
|
||||
|
||||
# 创建符合us_day_data表结构的DataFrame
|
||||
result_df = pd.DataFrame()
|
||||
|
||||
# 字段映射和转换
|
||||
result_df['symbol'] = df['ts_code'] # 美股代码保持原格式(如AAPL)
|
||||
result_df['timestamp'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
|
||||
result_df['volume'] = df['vol'] # 成交量(股)
|
||||
result_df['open'] = df['open'].astype(str) if 'open' in df.columns else None
|
||||
result_df['high'] = df['high'].astype(str) if 'high' in df.columns else None
|
||||
result_df['low'] = df['low'].astype(str) if 'low' in df.columns else None
|
||||
result_df['close'] = df['close'].astype(str)
|
||||
|
||||
# 涨跌额:优先使用change字段,转为字符串
|
||||
if 'change' in df.columns:
|
||||
result_df['chg'] = df['change'].fillna('').astype(str)
|
||||
else:
|
||||
result_df['chg'] = None
|
||||
|
||||
result_df['percent'] = df.get('pct_change', None) if 'pct_change' in df.columns else None
|
||||
|
||||
result_df['turnoverrate'] = None # 美股接口没有换手率数据
|
||||
result_df['amount'] = df.get('amount', None) # 成交额(如果接口有)
|
||||
|
||||
# 估值指标:从API获取
|
||||
result_df['pb'] = df.get('pb', None) # 市净率
|
||||
result_df['pe'] = df.get('pe', None) # 市盈率
|
||||
result_df['ps'] = None # PS字段API中可能没有
|
||||
|
||||
result_df['pre_close'] = df.get('pre_close', None)
|
||||
|
||||
# 按时间排序
|
||||
result_df = result_df.sort_values('timestamp').reset_index(drop=True)
|
||||
|
||||
return result_df
|
||||
|
||||
def run_daily_collection(self, date=None):
|
||||
"""
|
||||
执行每日增量采集
|
||||
按日期获取全市场美股日线数据(推荐方式)
|
||||
|
||||
Args:
|
||||
date: 指定日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行每日增量采集(全市场)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定采集日期
|
||||
if date is None:
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
else:
|
||||
date_str = date
|
||||
|
||||
# 转换为YYYYMMDD格式
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
||||
trade_date = date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"采集日期: {date_str} ({trade_date})")
|
||||
|
||||
# 删除指定日期的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(`timestamp`) = :date_str")
|
||||
result = conn.execute(delete_query, {"date_str": date_str})
|
||||
print(f"已删除{self.table_name}表中{date_str}的旧数据,共{result.rowcount}条")
|
||||
|
||||
# 获取全市场美股日线数据
|
||||
print(f"正在获取{date_str}全市场美股日线数据...")
|
||||
df = self.fetch_us_daily_data(trade_date=trade_date)
|
||||
|
||||
if df.empty:
|
||||
print(f"{date_str}没有美股日线数据(可能是非交易日)")
|
||||
return
|
||||
|
||||
print(f"成功获取美股日线数据,共{len(df)}只股票")
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if result_df.empty:
|
||||
print("数据转换失败")
|
||||
return
|
||||
|
||||
# 保存到数据库
|
||||
print(f"正在保存数据到{self.table_name}表...")
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
print(f"成功保存{len(result_df)}条记录")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("每日增量采集完成")
|
||||
print("=" * 60)
|
||||
print(f"采集日期: {date_str}")
|
||||
print(f"股票数量: {len(result_df)}只")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"每日增量采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_full_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
执行全量历史数据采集(按股票逐个采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为180天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行全量历史数据采集(按股票逐个采集)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近180天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=180)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
start_date_str = start_date_obj.strftime('%Y%m%d')
|
||||
end_date_str = end_date_obj.strftime('%Y%m%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 获取美股代码列表
|
||||
stock_codes = self.fetch_us_stock_list()
|
||||
|
||||
if not stock_codes:
|
||||
print("没有找到美股代码,请先在us_code表中添加美股代码")
|
||||
return
|
||||
|
||||
print(f"开始采集{len(stock_codes)}只美股的历史数据...")
|
||||
print("=" * 60)
|
||||
|
||||
# 按股票逐个采集
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
total_records = 0
|
||||
|
||||
for i, symbol in enumerate(stock_codes, 1):
|
||||
try:
|
||||
# 获取该股票历史数据
|
||||
df = self.fetch_us_daily_data(
|
||||
ts_code=symbol,
|
||||
start_date=start_date_str,
|
||||
end_date=end_date_str
|
||||
)
|
||||
|
||||
if not df.empty:
|
||||
# 删除该股票在该日期范围的旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(
|
||||
f"DELETE FROM {self.table_name} "
|
||||
f"WHERE symbol = :symbol "
|
||||
f"AND `timestamp` BETWEEN :start_date AND :end_date"
|
||||
)
|
||||
conn.execute(delete_query, {
|
||||
"symbol": symbol,
|
||||
"start_date": start_date_obj.strftime('%Y-%m-%d'),
|
||||
"end_date": end_date_obj.strftime('%Y-%m-%d')
|
||||
})
|
||||
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 保存到数据库
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(result_df)
|
||||
success_count += 1
|
||||
|
||||
# 每10只股票显示一次进度
|
||||
if i % 10 == 0:
|
||||
print(f"进度: {i}/{len(stock_codes)} ({success_count}成功, {fail_count}失败, 共{total_records}条记录)")
|
||||
|
||||
except Exception as e:
|
||||
fail_count += 1
|
||||
if i % 10 == 0:
|
||||
print(f"采集 {symbol} 失败: {e}")
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("全量历史数据采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"成功采集: {success_count}只")
|
||||
print(f"失败: {fail_count}只")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"全量历史数据采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
def run_date_range_collection(self, start_date=None, end_date=None):
|
||||
"""
|
||||
按日期范围逐日采集全市场数据(推荐用于历史数据采集)
|
||||
|
||||
Args:
|
||||
start_date: 开始日期,格式YYYY-MM-DD,默认为30天前
|
||||
end_date: 结束日期,格式YYYY-MM-DD,默认为今天
|
||||
"""
|
||||
print("=" * 60)
|
||||
print("开始执行日期范围采集(按日期逐日采集全市场)")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 确定日期范围
|
||||
if end_date is None:
|
||||
end_date_obj = datetime.now()
|
||||
else:
|
||||
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
|
||||
|
||||
if start_date is None:
|
||||
# 默认采集近30天历史数据
|
||||
start_date_obj = end_date_obj - timedelta(days=30)
|
||||
else:
|
||||
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
|
||||
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 按日期逐日采集
|
||||
current_date = start_date_obj
|
||||
total_days = (end_date_obj - start_date_obj).days + 1
|
||||
processed_days = 0
|
||||
success_days = 0
|
||||
total_records = 0
|
||||
|
||||
while current_date <= end_date_obj:
|
||||
date_str = current_date.strftime('%Y-%m-%d')
|
||||
trade_date = current_date.strftime('%Y%m%d')
|
||||
|
||||
print(f"\n[{processed_days + 1}/{total_days}] 采集日期: {date_str}")
|
||||
|
||||
try:
|
||||
# 获取全市场数据
|
||||
df = self.fetch_us_daily_data(trade_date=trade_date)
|
||||
|
||||
if not df.empty:
|
||||
# 转换数据格式
|
||||
result_df = self.transform_data(df)
|
||||
|
||||
if not result_df.empty:
|
||||
# 删除该日期旧数据
|
||||
with self.engine.begin() as conn:
|
||||
delete_query = text(f"DELETE FROM {self.table_name} WHERE DATE(`timestamp`) = :date_str")
|
||||
conn.execute(delete_query, {"date_str": date_str})
|
||||
|
||||
# 保存新数据
|
||||
result_df.to_sql(self.table_name, self.engine, if_exists='append', index=False)
|
||||
total_records += len(result_df)
|
||||
success_days += 1
|
||||
print(f" 成功: {len(result_df)}条记录")
|
||||
else:
|
||||
print(f" 无数据(可能是非交易日)")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 采集失败: {e}")
|
||||
|
||||
# 移到下一天
|
||||
current_date += timedelta(days=1)
|
||||
processed_days += 1
|
||||
|
||||
# 输出统计信息
|
||||
print("\n" + "=" * 60)
|
||||
print("日期范围采集完成")
|
||||
print("=" * 60)
|
||||
print(f"日期范围: {start_date_obj.strftime('%Y-%m-%d')} 至 {end_date_obj.strftime('%Y-%m-%d')}")
|
||||
print(f"总天数: {total_days}")
|
||||
print(f"成功天数: {success_days}")
|
||||
print(f"总记录数: {total_records}条")
|
||||
print(f"数据表: {self.table_name}")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"日期范围采集失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
self.engine.dispose()
|
||||
|
||||
|
||||
def collect_us_daily_data(db_url, tushare_token, mode='daily', date=None, start_date=None, end_date=None):
|
||||
"""
|
||||
美股日线数据采集入口函数
|
||||
|
||||
Args:
|
||||
db_url: 数据库连接URL
|
||||
tushare_token: Tushare API Token
|
||||
mode: 采集模式
|
||||
- 'daily': 增量采集当日数据(按日期获取全市场,推荐)
|
||||
- 'full': 全量覆盖采集(按股票逐个采集)
|
||||
- 'range': 日期范围采集(按日期逐日采集全市场,推荐用于历史数据)
|
||||
date: 指定日期(仅mode='daily'时有效),格式YYYY-MM-DD
|
||||
start_date: 开始日期(mode='full'或'range'时有效),格式YYYY-MM-DD
|
||||
end_date: 结束日期(mode='full'或'range'时有效),格式YYYY-MM-DD
|
||||
|
||||
注意:
|
||||
- 美股数据保存到us_day_data表(美股专用表)
|
||||
- symbol格式与Tushare一致(如AAPL、TSLA等)
|
||||
- 每天美东收盘后(北京时间早上5-6点)更新
|
||||
"""
|
||||
collector = USDailyDataCollector(db_url, tushare_token)
|
||||
|
||||
if mode == 'daily':
|
||||
collector.run_daily_collection(date)
|
||||
elif mode == 'full':
|
||||
collector.run_full_collection(start_date, end_date)
|
||||
elif mode == 'range':
|
||||
collector.run_date_range_collection(start_date, end_date)
|
||||
else:
|
||||
print(f"未知的采集模式: {mode}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库配置
|
||||
db_url = 'mysql+pymysql://root:Chlry#$.8@192.168.18.199:3306/db_gp_cj'
|
||||
|
||||
# Tushare Token(从config.py读取)
|
||||
tushare_token = TUSHARE_TOKEN
|
||||
|
||||
# 使用方式示例:
|
||||
|
||||
# 1. 每日增量采集(推荐每天早上6点后使用,一次性获取全市场数据)
|
||||
# collect_us_daily_data(db_url, tushare_token, mode='daily')
|
||||
|
||||
# 2. 日期范围采集(推荐用于历史数据,按日期逐日采集全市场)
|
||||
# collect_us_daily_data(db_url, tushare_token, mode='range',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
#10月28日的待采集
|
||||
# 3. 采集指定日期的数据
|
||||
collect_us_daily_data(db_url, tushare_token, mode='daily', date='2025-10-28')
|
||||
|
||||
# 4. 全量覆盖采集(按股票逐个采集,较慢,不推荐)
|
||||
# collect_us_daily_data(db_url, tushare_token, mode='full',
|
||||
# start_date='2024-01-01', end_date='2024-12-31')
|
||||
|
||||
|
|
@ -25,6 +25,17 @@ sys.path.append(str(project_root))
|
|||
|
||||
from src.valuation_analysis.config import DB_URL, LOG_FILE
|
||||
|
||||
# 条件导入代理管理器
|
||||
proxy_manager = None
|
||||
try:
|
||||
sys.path.append(os.path.dirname(project_root))
|
||||
from src.scripts.ProxyIP import EnhancedProxyManager
|
||||
proxy_manager = EnhancedProxyManager()
|
||||
except ImportError:
|
||||
logger = logging.getLogger("stock_price_collector")
|
||||
logger.warning("代理管理器导入失败,将使用直接请求模式")
|
||||
proxy_manager = None
|
||||
|
||||
# 获取项目根目录
|
||||
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
|
|
@ -96,7 +107,7 @@ class StockPriceCollector:
|
|||
self.headers = {
|
||||
"accept": "*/*:*/*",
|
||||
"accept-encoding": "gzip, deflate, br, zstd:gzip, deflate, br, zstd",
|
||||
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8:zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"connection": "keep-alive:keep-alive",
|
||||
"cookie": "qgqp_b_id=3d1376c8b3609b85ddd613ff70797b21; st_nvi=OkigGRrjz_ZnTtL_7eE4-4595; nid=0820fd3f15fe4f7c0164f8a7eff85c5f; nid_create_time=1754027308372; gvi=p9WxDMFjnfkCUiL8CQ3ex015a; gvi_create_time=1754027308372; fullscreengg=1; fullscreengg2=1; st_si=11531712238902; st_asi=delete; st_pvi=49494569999152; st_sp=2025-05-12%2009%3A11%3A41; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=11; st_psi=20250904172534993-113200301321-0920486271:qgqp_b_id=3d1376c8b3609b85ddd613ff70797b21; st_nvi=OkigGRrjz_ZnTtL_7eE4-4595; nid=0820fd3f15fe4f7c0164f8a7eff85c5f; nid_create_time=1754027308372; gvi=p9WxDMFjnfkCUiL8CQ3ex015a; gvi_create_time=1754027308372; fullscreengg=1; fullscreengg2=1; st_si=11531712238902; st_asi=delete; st_pvi=49494569999152; st_sp=2025-05-12%2009%3A11%3A41; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=11; st_psi=20250904172534993-113200301321-0920486271",
|
||||
"host": "push2.eastmoney.com:push2.eastmoney.com",
|
||||
|
|
@ -107,7 +118,7 @@ class StockPriceCollector:
|
|||
"sec-fetch-dest": "script:script",
|
||||
"sec-fetch-mode": "no-cors:no-cors",
|
||||
"sec-fetch-site": "same-site:same-site",
|
||||
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
|
||||
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
||||
}
|
||||
logger.info("东方财富实时股价数据采集器初始化完成")
|
||||
|
||||
|
|
@ -168,12 +179,13 @@ class StockPriceCollector:
|
|||
logger.warning(f"无法解析日期: {date_str}")
|
||||
return None
|
||||
|
||||
def fetch_data(self, page: int = 1) -> pd.DataFrame:
|
||||
def fetch_data(self, page: int = 1, use_proxy: bool = False) -> pd.DataFrame:
|
||||
"""
|
||||
获取指定页码的实时股价数据
|
||||
|
||||
Args:
|
||||
page: 页码
|
||||
use_proxy: 是否使用代理
|
||||
|
||||
Returns:
|
||||
包含实时股价数据的DataFrame
|
||||
|
|
@ -193,7 +205,12 @@ class StockPriceCollector:
|
|||
|
||||
logger.info(f"开始获取第 {page} 页数据")
|
||||
|
||||
response = requests.get(self.base_url, params=params, headers=self.headers)
|
||||
# 根据配置选择是否使用代理
|
||||
if use_proxy and proxy_manager:
|
||||
response = proxy_manager.request_with_proxy('get', self.base_url, headers=self.headers, params=params)
|
||||
else:
|
||||
response = requests.get(self.base_url, params=params, headers=self.headers, timeout=10)
|
||||
|
||||
if response.status_code != 200:
|
||||
logger.error(f"获取第 {page} 页数据失败: HTTP {response.status_code}")
|
||||
return pd.DataFrame()
|
||||
|
|
@ -467,6 +484,6 @@ if __name__ == "__main__":
|
|||
# 创建实时股价数据采集器
|
||||
collector = StockPriceCollector()
|
||||
|
||||
# 更新最新数据
|
||||
# 更新最新数据(使用代理)
|
||||
logger.info("开始更新最新实时股价数据...")
|
||||
collector.update_latest_data()
|
||||
Loading…
Reference in New Issue