历史交易数据涨跌分级
python
# encoding:utf-8
import sys,traceback
from loguru import logger
sys.path.append("..")
from QhSpiderTool import QhDorpFiled
from QhCsvMode import *
def QhZhangDieFenJi(QhDfData,QhFangFa="A"):
"""
历史交易数据涨跌分级
作者:阙辉
:param QhDfData:
:return:
"""
QhZDFZ10 = 0.1
QhZDFZ20 = 0.2
QhJYBK = QhDfData["JYBK"].values[0] # 交易板块,从流数据获取
QhZhangTingBiCanShu = { # 涨跌停分级参数
"ZhangDieFu": [
{# SHA|上证A股,SZA|深证A股,BJA|北证A股,
"TiaoJian": ["SHA", "SZA", "BJA"],"BiLi": 0.1,},
{# KCB|科创板,CYB|创业板,
"TiaoJian": ["KCB", "CYB"],"BiLi": 0.2,},
],
"ZhangDieFu0": {"SHA": QhZDFZ10, # SHA|上证A股
"SZA": QhZDFZ10, # SZA|深证A股
"BJA": QhZDFZ10, # BJA|北证A股
"KCB": QhZDFZ20, # KCB|科创板
"CYB": QhZDFZ20, # CYB|创业板
},
"FanWei": [-0.98, -0.8, -0.7, -0.5, -0.2, 0, 0.2, 0.5, 0.7, 0.8, 0.98], # 计算比例参数
"FenJiCanShu":{
# 涨跌分级参数 "FZ":[] 作为阀值缓存使用,暂时不用
-6:{"FW":[0,-0.2],"PD":"<|>=","FZ":[]},
-5:{"FW":[-0.2,-0.5],"PD":"<|>=","FZ":[]},
-4:{"FW":[-0.5,-0.7],"PD":"<|>=","FZ":[]},
-3:{"FW":[-0.7,-0.8],"PD":"<|>=","FZ":[]},
-2:{"FW":[-0.8,-0.98],"PD":"<|>=","FZ":[]},
-1:{"FW":[-0.98],"PD":"<","FZ":[]}, # 跌停
0:{"FW":[0],"PD":"==","FZ":[]}, # 平
1:{"FW":[0.98],"PD":">","FZ":[]}, # 涨停
2:{"FW":[0.8,0.98],"PD":">|<=","FZ":[]},
3:{"FW":[0.7,0.8],"PD":">|<=","FZ":[]},
4:{"FW":[0.5,0.7],"PD":">|<=","FZ":[]},
5:{"FW":[0.2,0.5],"PD":">|<=","FZ":[]},
6:{"FW":[0,0.2],"PD":">|<=","FZ":[]},
},
}
# 获取参数 阙辉
QhZhangDieFuDic = QhZhangTingBiCanShu["ZhangDieFu"]
QhFanWeiA = QhZhangTingBiCanShu["FanWei"]
FenJiCanShuDic = QhZhangTingBiCanShu["FenJiCanShu"]
ZhangDieFu0Dic = QhZhangTingBiCanShu["ZhangDieFu0"]
if QhFangFa == "A":
# 计算比例 阙辉
# JYBK 代表交易板块
for QhRow in QhZhangDieFuDic:
QhTiaoJian = QhRow["TiaoJian"] #
QhBiLi = QhRow["BiLi"] # 涨跌比例
for QhRow01 in QhFanWeiA:
QhFaZhi = QhRow01 # 阀值
# 根据不同板块计算阀值,用于分级比较,阀值存储在df中,比较完后,阀值再删除掉 阙辉
QhDfData.loc[(QhDfData["JYBK"].isin(QhTiaoJian)),"QFZ_{}".format(str(QhFaZhi))] = round(QhBiLi * QhFaZhi,4) # 计算阀值比例
# 分级判断 阙辉
for QhKey,QhValue in FenJiCanShuDic.items():
QhFenJi = QhKey # 分级值
QhFanWei = QhValue["FW"] # 分级范围
QhFanWeiLen = len(QhFanWei)
QhPanDuan = QhValue["PD"] # 分级判断值
print(QhFanWei)
# print(QhFanWeiLen)
if QhFanWeiLen > 2:
logger.error("【涨跌分级】分级范围参数超范围,请检查,本次不计算,QueHui!")
continue
# QZDFJ|涨跌分级
QhFiledZD = "ZDF"
if QhFanWeiLen == 1: # 单条件
QhFanWei0 = QhFanWei[0]
if QhPanDuan == ">": # 涨停
QhDfData.loc[(QhDfData[QhFiledZD] > QhDfData["QFZ_{}".format(str(QhFanWei0))]),"QZDFJ"] = QhFenJi
elif QhPanDuan == "==": # 平
QhDfData.loc[(QhDfData[QhFiledZD] == QhDfData["QFZ_{}".format(str(QhFanWei0))]), "QZDFJ"] = QhFenJi
elif QhPanDuan == "<": # 跌停
QhDfData.loc[(QhDfData[QhFiledZD] < QhDfData["QFZ_{}".format(str(QhFanWei0))]), "QZDFJ"] = QhFenJi
elif QhFanWeiLen == 2: # 多条件
QhFanWei0 = QhFanWei[0]
QhFanWei1 = QhFanWei[1]
if QhPanDuan == ">|<=": # 涨
QhDfData.loc[(QhDfData[QhFiledZD] > QhDfData["QFZ_{}".format(str(QhFanWei0))]) &
(QhDfData[QhFiledZD] <= QhDfData["QFZ_{}".format(str(QhFanWei1))]),
"QZDFJ"] = QhFenJi
elif QhPanDuan == "<|>=": # 跌
QhDfData.loc[(QhDfData[QhFiledZD] < QhDfData["QFZ_{}".format(str(QhFanWei0))]) &
(QhDfData[QhFiledZD] >= QhDfData["QFZ_{}".format(str(QhFanWei1))]),
"QZDFJ"] = QhFenJi
# 删除用于比较的阀值
QhDfData = QhDorpFiled(QhDfData,["QFZ_{}".format(str(QhRow)) for QhRow in QhFanWeiA])
else:
# 分级判断 阙辉
for QhKey, QhValue in FenJiCanShuDic.items():
QhFenJi = QhKey # 分级值
QhFanWei = QhValue["FW"] # 分级范围
QhFanWeiLen = len(QhFanWei)
QhPanDuan = QhValue["PD"] # 分级判断值
QhZDFRow = ZhangDieFu0Dic[QhJYBK] # 找到板块的涨跌幅
if QhFanWeiLen > 2: # 校验参数是否超范围
logger.error("【涨跌分级】分级范围参数超范围,请检查,本次不计算,QueHui!")
continue
# QZDFJ|涨跌分级 直接法
QhFiledZD = "ZDF"
if QhFanWeiLen == 1: # 单条件
QhFanWei0 = QhFanWei[0]
QhFZ0 = round(QhFanWei0 * QhZDFRow,4) # 阀值0
if QhPanDuan == ">": QhDfData.loc[(QhDfData[QhFiledZD] > QhFZ0), "QZDFJ"] = QhFenJi # 涨停
elif QhPanDuan == "==": QhDfData.loc[(QhDfData[QhFiledZD] == QhFZ0), "QZDFJ"] = QhFenJi # 平
elif QhPanDuan == "<": QhDfData.loc[(QhDfData[QhFiledZD] < QhFZ0), "QZDFJ"] = QhFenJi # 跌停
elif QhFanWeiLen == 2: # 多条件
QhFanWei0 = QhFanWei[0]
QhFZ0 = round(QhFanWei0 * QhZDFRow, 4) # 阀值0
QhFanWei1 = QhFanWei[1]
QhFZ1 = round(QhFanWei1 * QhZDFRow, 4) # 阀值1
if QhPanDuan == ">|<=": QhDfData.loc[(QhDfData[QhFiledZD] > QhFZ0) & (QhDfData[QhFiledZD] <= QhFZ1),"QZDFJ"] = QhFenJi # 涨
elif QhPanDuan == "<|>=": QhDfData.loc[(QhDfData[QhFiledZD] < QhFZ0) & (QhDfData[QhFiledZD] >= QhFZ1),"QZDFJ"] = QhFenJi # 跌
return QhDfData
if __name__ == '__main__':
QhDfData = QhStockHisJiaoYiModel(QhScode="Q000001",QhFrom="DF",QhShiChang="SZA",QhZhouQi="日",QhFuQuan="前复权")
QhDfData = QhZhangDieFenJi(QhDfData)
QhDfData.to_csv("test.csv",encoding="gbk")
print(QhDfData)
pass