股票指标因子计算

# 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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值