"""
|
目标代码管理
|
"""
|
import decimal
|
|
from code_attribute.history_k_data_util import JueJinHttpApi
|
from log_module.log import printlog
|
from utils import tool
|
|
# 有效代码的缓存
|
# 数据格式:{"日期":[]}
|
__valid_codes_cache = {}
|
# 正股到可转债代码的索引
|
__valid_underlying_code_map_cache = {}
|
|
# 可转债代码到正股代码的索引
|
__valid_cb_to_underlying_code_map_cache = {}
|
|
# 可转债昨日收盘价
|
__valid_pre_close_price_map_cache = {}
|
|
|
def __request_valid_codes_info():
|
"""
|
请求有效的代码信息
|
:return:
|
"""
|
results = JueJinHttpApi.get_exchanges_codes("SHSE,SZSE", sec_types=[8], skip_suspended=True, skip_st=True,
|
fields="symbol, sec_type, sec_id,sec_name, underlying_symbol, delisted_date, sec_level, pre_close")
|
fresults = []
|
for r in results:
|
if r['sec_name'].find('转') == -1 or r['sec_level'] != 1 or int(tool.get_now_date_str('%Y%m%d')) >= int(
|
r['delisted_date'].strftime('%Y%m%d')):
|
continue
|
fresults.append(r)
|
# 排除同一股票有2个转债
|
cb_count_dict = {}
|
exclude_codes = []
|
for r in fresults:
|
if r['underlying_symbol'] not in cb_count_dict:
|
cb_count_dict[r['underlying_symbol']] = []
|
cb_count_dict[r['underlying_symbol']].append(r['symbol'])
|
if len(cb_count_dict[r['underlying_symbol']]) > 1:
|
printlog(r['underlying_symbol'], cb_count_dict[r['underlying_symbol']])
|
exclude_codes.extend(cb_count_dict[r['underlying_symbol']])
|
ffresults = []
|
for x in fresults:
|
if x['symbol'] in exclude_codes:
|
continue
|
ffresults.append(x)
|
return ffresults
|
|
|
def load_valid_codes_info(day=tool.get_now_date_str()):
|
"""
|
加载有效数据
|
:param day:
|
:return:
|
"""
|
if day in __valid_codes_cache:
|
return __valid_codes_cache.get(day)
|
results = __request_valid_codes_info()
|
if results:
|
__valid_codes_cache[day] = results
|
__valid_underlying_code_map_cache[day] = {}
|
__valid_pre_close_price_map_cache[day] = {}
|
__valid_cb_to_underlying_code_map_cache[day] = {}
|
for r in results:
|
__valid_underlying_code_map_cache[day][r['underlying_symbol'].split('.')[1]] = r['sec_id']
|
__valid_cb_to_underlying_code_map_cache[day][r['sec_id']] = r['underlying_symbol'].split('.')[1]
|
__valid_pre_close_price_map_cache[day][r['sec_id']] = r['pre_close']
|
|
|
def get_subscript_underlying_codes():
|
"""
|
获取需要订阅的正股代码
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
if not __valid_codes_cache.get(day):
|
load_valid_codes_info(tool.get_now_date_str())
|
ffresults = __valid_codes_cache.get(tool.get_now_date_str())
|
return [x['underlying_symbol'].split('.')[1] for x in ffresults]
|
|
|
def get_subscript_cb_codes():
|
"""
|
获取需要订阅的代码
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
if not __valid_codes_cache.get(day):
|
load_valid_codes_info(tool.get_now_date_str())
|
ffresults = __valid_codes_cache.get(tool.get_now_date_str())
|
return [x['sec_id'] for x in ffresults]
|
|
|
def get_underlying_to_cb_code_map():
|
"""
|
获取股票代码-可转债代码的map
|
:param code:
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
if day not in __valid_underlying_code_map_cache:
|
load_valid_codes_info(day)
|
|
return __valid_underlying_code_map_cache.get(day)
|
|
|
def get_cb_to_underlying_code_map():
|
"""
|
获取可转债代码-股票代码的map
|
:param code:
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
if day not in __valid_cb_to_underlying_code_map_cache:
|
load_valid_codes_info(day)
|
|
return __valid_cb_to_underlying_code_map_cache.get(day)
|
|
|
def get_cb_code(code):
|
"""
|
获取可转债代码
|
:param code:
|
:return:
|
"""
|
map = get_underlying_to_cb_code_map()
|
if map:
|
return map.get(code)
|
return None
|
|
|
def get_underlying_code(code):
|
map = get_cb_to_underlying_code_map()
|
if map:
|
return map.get(code)
|
return None
|
|
|
def get_limit_up_price(cb_code):
|
"""
|
获取可转债的涨停价
|
:param cb_code:
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
pre_close_price_map = __valid_pre_close_price_map_cache.get(day)
|
if not pre_close_price_map:
|
return None
|
price_close = pre_close_price_map.get(cb_code)
|
price_close = tool.to_price(decimal.Decimal(str(price_close)))
|
|
return str(tool.to_price(price_close * decimal.Decimal("1.2"), "0.000"))
|
|
|
def get_limit_down_price(cb_code):
|
"""
|
获取可转债的跌停价
|
:param cb_code:
|
:return:
|
"""
|
day = tool.get_now_date_str()
|
pre_close_price_map = __valid_pre_close_price_map_cache.get(day)
|
if not pre_close_price_map:
|
return None
|
price_close = pre_close_price_map.get(cb_code)
|
price_close = tool.to_price(decimal.Decimal(str(price_close)))
|
|
return str(tool.to_price(price_close * decimal.Decimal("0.8"), "0.000"))
|
|
|
|
if __name__ == '__main__':
|
load_valid_codes_info()
|
print(get_limit_up_price("110060"), get_limit_down_price("110060"))
|