# encoding:utf-8
import sys,copy,traceback
import pandas as pd
sys.path.append("..")
from QhSetting import QHJSPATH
from QhCsvMode import *
try:
from .QhMyTT import *
except:
from QhMyTT import *
def QhCV(S):
# 计算变异系数
# 作者:阙辉
mu = S.mean()
std = S.std()
return std / mu if mu!= 0 else 0
def QhRollCV(S,N):
# 滚动计算变异系数
# 作者:阙辉
return S.rolling(N).apply(QhCV)
def QhChangeDataTypeS(QhJieGuoDf,QhFileds,QhType = float):
"""
将数据类型转换为指定类型 转换为数值
作者:阙辉
"""
QhDfData_columns=QhJieGuoDf.columns.tolist()
if not isinstance(QhFileds,list):
QhFileds = [QhFileds]
for QhRow in QhFileds:
try:
if QhRow not in QhDfData_columns: continue
QhFiled = QhRow
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].replace("-", "0")
QhJieGuoDf[QhFiled] = pd.to_numeric(QhJieGuoDf[QhFiled], errors='coerce') # 非数值字符串转换为NaN
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].replace("",0)
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].fillna(0)
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].astype(QhType)
except:
QhErrMsg = traceback.format_exc()
print(QhErrMsg)
return QhJieGuoDf
def QhStockJiaoYiFlowYinZiJiSuan(QhScode="Q000001",QhIsCsv=True):
"""
交易数据因子计算
作者:阙辉
"""
# 读取数据
QhDfData = QhDFReadStockFlow(QhFuncKey = "QhDFStockHisJiaoYiFlow",
QhScode=QhScode,
QhTiaoJian=[["周期名",["日",]],
["复权名",["前复权",]]],
QhDatePaiXu = "交易日期",
QhAscending=True # 是否升序
)
# 数据预处理
QhFlowDfColumns=QhDfData.columns.tolist()
QhDfNumber = ["收盘","开盘","最高","最低","成交量","成交额","振幅","涨跌幅","涨跌额","换手率"]
QhDfData = QhChangeDataTypeS(QhDfData,QhDfNumber,QhType = float) # 替换掉“-”为0,及转换格式
if "收盘" in QhFlowDfColumns: CLOSE = QhDfData["收盘"]
if "开盘" in QhFlowDfColumns: OPEN = QhDfData["开盘"]
if "最高" in QhFlowDfColumns: HIGH = QhDfData["最高"]
if "最低" in QhFlowDfColumns: LOW = QhDfData["最低"]
if "成交量" in QhFlowDfColumns: VOL = QhDfData["成交量"]
if "成交额" in QhFlowDfColumns: AMOUNT = QhDfData["成交额"]
if "振幅" in QhFlowDfColumns: CHANGE = QhDfData["振幅"]
if "涨跌幅" in QhFlowDfColumns: PCTCHANGE = QhDfData["涨跌幅"]
if "涨跌额" in QhFlowDfColumns: ADE = QhDfData["涨跌额"]
if "换手率" in QhFlowDfColumns: TOR = QhDfData["换手率"]
# 计算因子
QhDfData["MA5"] = MA(CLOSE,5) # 计算5日均线
QhDfData["MA10"] = MA(CLOSE,10) # 计算10日均线
QhDfData["MA20"] = MA(CLOSE,20) # 计算20日均线
QhDfData["MA30"] = MA(CLOSE,30) # 计算30日均线
QhDfData["MA60"] = MA(CLOSE,60) # 计算360日均线
QhDfData["MA120"] = MA(CLOSE,120) # 计算120日均线
QhDfData["MA250"] = MA(CLOSE,250) # 计算250日均线
QhDfData["VOL_MA5"] = MA(VOL,5) # 计算5日成交量均线
QhDfData["VOL_MA10"] = MA(VOL,10) # 计算10日成交量均线
QhDfData["VOL_MA30"] = MA(VOL,30) # 计算30日成交量均线
QhDfData["VOL_MA60"] = MA(VOL,60) # 计算60日成交量均线
QhDfData["VOL_MA120"] = MA(VOL,120) # 计算120日成交量均线
QhDfData["MACD_DIF_12_26_9"],QhDfData["MACD_DEA_12_26_9"],QhDfData["MACD_12_26_9"] = MACD(CLOSE,SHORT=12,LONG=26,M=9) # 计算MACD
QhDfData["KDJ_K_9_3_3"],QhDfData["KDJ_D_9_3_3"],QhDfData["KDJ_J_9_3_3"] = KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3) # 计算标准KDJ
QhDfData["RSI_24"] = RSI(CLOSE, N=24) # 计算RSI
QhDfData["WR_10_6"],QhDfData["WR1_10_6"] = WR(CLOSE, HIGH, LOW, N=10, N1=6)
QhDfData["BIAS1_6_12_24"],QhDfData["BIAS2_6_12_24"],QhDfData["BIAS3_6_12_24"] = BIAS(CLOSE,L1=6, L2=12, L3=24)
QhDfData["BOLL_UPPER_20_2"],QhDfData["BOLL_MID_20_2"],QhDfData["BOLL_LOWER_20_2"] = BOLL(CLOSE,N=20, P=2)
QhDfData["PSY_12_6"],QhDfData["PSYMA_12_6"] = PSY(CLOSE,N=12, M=6)
QhDfData["CCI_14"] = CCI(CLOSE,HIGH,LOW,N=14)
QhDfData["ATR_20"] = ATR(CLOSE,HIGH,LOW, N=20)
QhDfData["BBI_3_6_12_20"] = BBI(CLOSE,M1=3,M2=6,M3=12,M4=20)
QhDfData["DMI_PDI_14_6"],QhDfData["DMI_MDI_14_6"],QhDfData["DMI_ADX_14_6"],QhDfData["DMI_ADXR_14_6"] = DMI(CLOSE,HIGH,LOW,M1=14,M2=6)
QhDfData["TAQ_UP_6"],QhDfData["TAQ_MID_6"],QhDfData["TAQ_DOWN_6"] = TAQ(HIGH,LOW,N=6)
QhDfData["KTN_UPPER_20_10"],QhDfData["KTN_MID_20_10"],QhDfData["KTN_LOWER_20_10"] = KTN(CLOSE,HIGH,LOW,N=20,M=10)
QhDfData["TRIX_12_20"],QhDfData["TRMA_12_20"] = TRIX(CLOSE,M1=12, M2=20)
QhDfData["VR_26"] = VR(CLOSE,VOL,M1=26)
QhDfData["EMV_14_9"],QhDfData["MAEMV_14_9"] = EMV(HIGH,LOW,VOL,N=14,M=9)
QhDfData["DPO_20_10_6"],QhDfData["MADPO_20_10_6"] = DPO(CLOSE,M1=20, M2=10, M3=6)
QhDfData["AR_26"],QhDfData["BR_26"] = BRAR(OPEN,CLOSE,HIGH,LOW,M1=26)
QhDfData["DIF_10_50_10"],QhDfData["DIFMA_10_50_10"] = DFMA(CLOSE,N1=10,N2=50,M=10)
QhDfData["MTM_12_6"],QhDfData["MTMMA_12_6"] = MTM(CLOSE,N=12,M=6)
QhDfData["MASS_9_25_6"],QhDfData["MA_MASS_9_25_6"] = MASS(HIGH,LOW,N1=9,N2=25,M=6)
QhDfData["MAROC"],QhDfData["MAROC"] = ROC(CLOSE,N=12,M=6)
QhDfData["EXPMA1_12_50"],QhDfData["EXPMA2_12_50"] = EXPMA(CLOSE,N1=12,N2=50)
QhDfData["OBV"] = OBV(CLOSE,VOL)
QhDfData["MFI_14"] = MFI(CLOSE,HIGH,LOW,VOL,N=14)
QhDfData["ASI_26_10"],QhDfData["ASIT_26_10"] = ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10)
QhDfData["CV_30"] = QhRollCV(VOL,N=30)
QhDfData["MU_30"] = VOL.rolling(30).apply(lambda S: S.mean())
QhDfData["STD_30"] = VOL.rolling(30).apply(lambda S: S.std())
# 因子数据存储
QhFactionKey = "QhStockJiaoYiFlowYinZiJiSuan"
QhUniqueValue = QHYZDBJSON[QhFactionKey]["QhUniqueValue"] # 唯一值参数获取
QhCsvPath = QHYZDBJSON[QhFactionKey]["QhCsvPath"]
QhCsvPath = QhDbPathJieXiIsMkdir(QhCsvPath,QHJSPATH)
QhCsvName0 = copy.deepcopy(QHYZDBJSON[QhFactionKey]["QhCsvName"])
if "{}" in QhCsvName0:
print(QhCsvName0)
QhCsvName = QhCsvName0.format(QhScode)
QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvName)
QhDBToCsv(QhCsvPath,
QhUniqueValue,
QhJieGuoDf=QhDfData,
# QhDateSort=QhDateSort,
QhIsCsv=QhIsCsv,
QhIsMd5=True)
# print(QhDfData)
return QhDfData
def QhShaiXuanYinZiJiSuan(QhScode,QhIsCsv=True):
# 读取数据
QhDfData = QhDFReadStockFlow(QhFuncKey = "QhStockJiaoYiFlowYinZiJiSuan",
QhScode=QhScode,
QhTiaoJian=[["周期名",["日",]],
["复权名",["前复权",]]],
QhDatePaiXu = "交易日期",
QhAscending=True, # 是否升序
QhJsonPeiZhi = QHYZDBJSON
)
print(QhDfData.tail(1)[QhDfData.tail(1)["CV_30"]>1])
pass
if __name__ == "__main__":
# QhStockJiaoYiFlowYinZiJiSuan(QhScode="Q600539")
QhShaiXuanYinZiJiSuan(QhScode="Q600539")
股票指标因子计算
于 2025-03-15 22:26:48 首次发布