量化交易研究———高级篇(2)MACD检测实现

本文介绍了一个基于MACD指标的股票交易策略实现。该策略通过计算指定股票列表中各股票的MACD值,并根据MACD的金叉和死叉信号决定买卖操作。具体而言,当MACD从负值转为正值时买入股票,反之则卖出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import talib
import numpy as np
import pandas as pd


securities=['601006.SH','601008.SH','601155.SH','600519.SH','300136.SZ','600741.SH']
count = 0
for stock in securities:
    values = get_price(stock, None, '20180105', '1d', ['close', 'high', 'low'], True, None, 40, is_panel=1)
    DIFF, DEA, MACD = talib.MACD(values['close'].values,
            fastperiod=12, slowperiod=26, signalperiod=9)
        # 若出现MACD死叉(MACD变为负值),则卖出股票
    if MACD[-1] < 0:
        log.info(MACD[-1])
        order_target(stock, 0)


    # 买入股票
for stock in account.iwencai_securities:
        # 若股票数量到达限制,则跳出
    if len(account.positions) >= account.n:
        break
    if stock not in account.positions:
            # 获取股票收盘价数据
        values = data.attribute_history(stock, ['close'], 100, '1d', False, None)
        if values.empty:
            continue
            # 计算MACD值
        DIFF, DEA, MACD = talib.MACD(values['close'].values,
                fastperiod=12, slowperiod=26, signalperiod=9)
            # 若出现MACD金叉,则买入1/n仓位的股票
        if MACD[-1] > 0 and MACD[-2] < 0:
            order_target_percent(stock, 1/account.n)
``` {—————————————— 系统参数模块 ——————————————} {——机器学习动态参数——} INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5); //机器学习训练周期 VAR_PERIOD:=ML_OPTIMIZE(VOLATILITY,CLOSE,ML_WIN); //机器学习优化波动率参数 {——智能估值中枢——} DYNPETTM:=IF(FINANCE(33)>0, CLOSE/(FINANCE(33)/FINANCE(1)), 1000); //动态市盈率 G_VALUE:=EMA(CLOSE,20*21)/CLOSE; //月线价值偏离度 PB_RATE:=IF(FINANCE(5)>0, CLOSE/FINANCE(5), 1000); //市净率 PEG_VAL:=DYNPETTM/MAX(FINANCE(54)/FINANCE(34)*100,0.0001); //PEG估值 {——行业动量因子——} SECTOR_MOM:=(EMA(C,5)/EMA(C,21)-1)*100; //行业5日动量 CAPITAL_FLOW:=SUM(IF(C>O,VOL,-VOL),13)/MA(VOL,13); //行业资金流向 IND_RANK:RANK(SECTOR_MOM)*0.4 + RANK(CAPITAL_FLOW)*0.6; //行业动量综合评分 {——市场情绪引擎——} MARKET_SENT:=(ADVANCE/DECLINE)*MA(VOL,5)/REF(MA(VOL,5),1); //涨跌家数比 ST_EMOTION:=EMA((C-LLV(L,21))/(HHV(H,21)-LLV(L,21)),5)*100; //短期情绪指标 {—————————————— 核心指标模块 ——————————————} {——三周期MACD共振——} MACD_MONTH:=EMA(C,12*21)-EMA(C,26*21); //月线MACD MACD_WEEK:=EMA(C,12*5)-EMA(C,26*5); //周线MACD MACD_DAY:=EMA(C,12)-EMA(C,26); //日线MACD MACD_SYNC:=MACD_MONTH>REF(MACD_MONTH,3) AND MACD_WEEK>0 AND MACD_DAY>0; {——量价时空体系——} VOL_ER:=EMA(VOL/FINANCE(1),5)/REF(EMA(VOL/FINANCE(1),5),21); //量能扩张比 PRICE_POWER:=(C-MA(C,21))/STD(C,21)*VOL_ER; //量价动力指数 {——三维趋势验证——} STRATEGIC_LINE:=EMA(CLOSE,20*21); //月线战略线 BATTLE_LINE:=EMA(CLOSE,5*5); //周线战役线 TACTICAL_LINE:=EMA(CLOSE,5); //日线战术线 TREND_CONFIRM:=STRATEGIC_LINE>REF(STRATEGIC_LINE,3) AND BATTLE_LINE>STRATEGIC_LINE AND TACTICAL_LINE>BATTLE_LINE; {——关键突破识别——} BREAK_DAY:=C>HHV(REF(HHV(H,20),1),5) AND VOL>MA(VOL,5)*1.8; //日线突破 BREAK_HOUR:=DYNAINFO(11)>HHV(REF(H,1),6) AND RSI(DYNAINFO(11),14)>58; //60分钟突破 {—————————————— 信号合成模块 ——————————————} {——战略安全边际——} VALUE_FILTER:G_VALUE<0.85 AND PB_RATE<2.5 AND PEG_VAL<0.75; {——战术启动点——} TRIGGER_SIGNAL:CROSS(PRICE_POWER,1.2) AND MACD_DAY>REF(MACD_DAY,3) AND VOL_ER>1.5; {——动态风险控制——} RISK_CONTROL:=ST_EMOTION>30 AND MARKET_SENT>0.8 AND FINANCE(10)/FINANCE(1)>0.4 AND SLOPE(CLOSE,60)>0; {——最终信号合成——} FINAL_SIGNAL:VALUE_FILTER AND TREND_CONFIRM AND MACD_SYNC AND BREAK_DAY AND BREAK_HOUR AND RISK_CONTROL AND IND_RANK>0.75 AND COUNT(TRIGGER_SIGNAL,3)>=1; {—————————————— 优化增强模块 ——————————————} //引入遗传算法优化参数 OPTIMIZE VAR_PERIOD USING MAX(PROFIT_FACTOR) WITHIN VAR_PERIOD IN (21,34,55,89) OVER N_EPOCH; //机器学习特征工程 ML_FEATURES:= [DYNPETTM, PB_RATE, PEG_VAL, SECTOR_MOM, CAPITAL_FLOW, MACD_SYNC, PRICE_POWER, VOL_ER, ST_EMOTION]; //动态权重调整 SIGNAL_WEIGHT:=ML_PREDICT(ML_FEATURES, 'XGBOOST'); FINAL_SIGNAL:=FILTER(FINAL_SIGNAL AND SIGNAL_WEIGHT>0.7,5);```的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时选股】代码,遇到了 【错误句 : {—————————————— 系统参数模块 ——————————————} {——机器学习动态参数——} INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5) 详细信息 : 您在括号前写的不是函数、公式等, 且缺少必要的运算符! 】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留
03-25
``` {—————————————— 系统参数模块(行业中性化处理) ——————————————} 行业代码:=INDUSTRY; DYNPETTM:=IF(FINANCE(33)>0, CLOSE/(FINANCE(33)/FINANCE(1)+0.0001), 1000); PB_RATE:=IF(FINANCE(5)>0, CLOSE/FINANCE(5), 1000); PEG_VAL:=DYNPETTM/MAX(FINANCE(54)/FINANCE(34)*100,0.0001); {——估值参数行业分位数优化——} PETTM_QUANTILE:=DYNPETTM/REF(HHV(DYNPETTM,240),行业代码); PB_QUANTILE:=PB_RATE/REF(HHV(PB_RATE,240),行业代码); PEG_QUANTILE:=PEG_VAL/REF(HHV(PEG_VAL,240),行业代码); {——波动率动态加权——} VOLATILITY:=EMA(STD(CLOSE,20)/MA(CLOSE,20),5); VAR_PERIOD:=IF(VOLATILITY<0.06,55,IF(VOLATILITY<0.12,34,21))*0.6 + REF(VAR_PERIOD,1)*0.4; FAST_LEN:=CEILING(EMA(VAR_PERIOD*0.382,3)); SLOW_LEN:=FLOOR(EMA(VAR_PERIOD*1.618,3)); SGNL_LEN:=IF(VAR_PERIOD<=21,5,7); {—————————————— 核心指标模块(动量增强) ——————————————} {——MACD状态机——} DIF:=EMA(CLOSE,FAST_LEN) - EMA(CLOSE,SLOW_LEN); DEA:=EMA(DIF,SGNL_LEN); MACD:=2*(DIF-DEA); MACD_PHASE:=IF(DIF>DEA AND DEA>0,2,IF(DIF>DEA,1,IF(DIF<DEA AND DEA<0,-2,-1))); {——均线收敛系统——} MA5:=EMA(CLOSE,5); MA10:=EMA(CLOSE,10); MA_CONV:=ATAN(MA5/MA10)*180/3.1416; TREND_ARR:=MA5>MA10 AND MA10>MA20 AND MA20>MA60 AND MA_CONV>15; {——量价共振模型——} VOL_MA5:=MA(VOL,5); VOL_MA20:=EMA(VOL,20); VOL_SIG:=VOL>VOL_MA20*1.3 AND VOL>REF(HHV(VOL,5),1)*1.1 AND (CLOSE-OPEN)/(HIGH-LOW+0.0001)>0.5; {——动量状态检测——} MOMENTUM:=EMA(C,5)/REF(EMA(C,5),3)-1; WEEK_CHG:=(C-REF(C,5))/REF(C,5)*100; MOM_CONF:=EMA(C,5)>EMA(C,13) AND C>EMA(C,34)*1.05 AND WEEK_CHG>HHV(WEEK_CHG,20)*0.6; {—————————————— 信号合成模块(分时/盘后双模式) ——————————————} {——盘中异动预警——} INTRADAY_SIG:VOL>DYNAINFO(5)*1.5 AND (C-DYNAINFO(3))/DYNAINFO(3)*100>2.5 AND MACD_PHASE>=1 AND MOMENTUM>0.015 FILTER(CROSS(VOL_MA5,VOL_MA20),30); {——盘后主升浪选股——} VALUATION:=PETTM_QUANTILE<0.7 AND PB_QUANTILE<0.8 AND PEG_QUANTILE<0.9; TREND_SIG:=TREND_ARR AND BETWEEN(C/MA60,1.08,1.35); MOM_SIG:=MACD_PHASE>=1 AND MOM_CONF; PRICE_VOL:=VOL_SIG AND WEEK_CHG>5; {——风险过滤(行业适配)——} BETA_COEF:=SLOPE(C/INDEXC,60)*STD(C,60)/STD(INDEXC,60); DEBT_RATIO:=FINANCE(42)/FINANCE(1); CASH_RATIO:=FINANCE(10)/FINANCE(1); RISK_FLT:=IF(INSTR(行业代码,'银行|地产'),DEBT_RATIO<0.85 AND CASH_RATIO>0.15, DEBT_RATIO<0.55 AND CASH_RATIO>0.25); {——周期共振验证——} CY_MON:=MA(C,10)>REF(MA(C,10),5) AND MA(C,20)>REF(MA(C,20),10); CY_WK_DIFF:=EMA(C,10)-EMA(C,30); CY_WK_DEA:=EMA(CY_WK_DIFF,8); CY_WK:=CY_WK_DIFF>CY_WK_DEA AND CY_WK_DIFF>0; {——最终信号生成——} SCAN_SIG:VALUATION AND RISK_FLT AND CY_MON AND CY_WK AND COUNT(TREND_SIG AND MOM_SIG,5)>=2 AND WEEK_CHG>HHV(WEEK_CHG,20)*0.6; FINAL_SIGNAL:FILTER(SCAN_SIG,3),COLORGREEN;```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时选股】代码,遇到了 【错误句 : {—————————————— 系统参数模块(行业中性化处理) ——————————————} 行业代码:=INDUSTRY 详细信息 : 未知字符串 INDUSTRY 错误起始位置 : 102 ; 长度: 8】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留,所有参数计算关系和信号触发条件均不改变。
03-24
``` {—————————————— 系统参数模块 ——————————————} SW1_CODE := INBLOCK('申万一级') * 1; TOTAL_MV := FINANCE(7) / 100000000; { 单位统一转换为亿,避免后续计算溢出 } {——行业轮动优化——} INDU_REL_STR := EMA(C / MAX(FINANCE(45), 1E-6), 20) * 0.55 + EMA(C / MAX(FINANCE(48), 1E-6), 10) * 0.35 + IIF(HKHOLD(5) > 0, HKHOLD(5) / MA(HKHOLD(5), 20), 0) * 0.1; {——估值因子重构——} EPS_TTM := FINANCE_EX(1, 0, 0); DYNPETTM := IF(EPS_TTM > 0.2, C / MAX(EPS_TTM, 0.2), 1000); EVEBITDA := (C * FINANCE(1) + FINANCE(20) - FINANCE(22)) / MAX(FINANCE(23), FINANCE(1) * 0.01); {——波动率优化——} VOL_REGIME := EMA(STD(C, 60) / MA(C, 60), 5); VAR_PERIOD := IF(VOL_REGIME < 0.05, 55, IF(VOL_REGIME < 0.1, 34, IF(VOL_REGIME < 0.15, 21, 13))); VAR_PERIOD := WMA(VAR_PERIOD, 3) * 0.6 + WMA(VAR_PERIOD, 5) * 0.4; {——资金监控体系——} NORTH_FLOW := HKHOLD('A') / TOTAL_MV * 100; { 同步使用修正后变量名 } NORTH_ALPHA := SLOPE(EMA(NORTH_FLOW, 5), 5) / STD(NORTH_FLOW, 20); {——机器学习模块——} MOM_WEIGHT := CORR(ROC(C, 20), INDU_REL_STR, 60) * 0.7 - STD(MACD_POWER, 20) * 0.3; FACTOR_SYN := MOM_WEIGHT * INDU_REL_STR + (RANK(DYNPETTM) + RANK(EVEBITDA)) / 2 * 0.45; {——核心信号引擎——} VALUATION := DYNPETTM < PERCENTILE(DYNPETTM, 90, 0.3) AND EVEBITDA < PERCENTILE(EVEBITDA, 90, 0.25) AND PEG_VAL < 0.9 AND PEG_VAL > 0.2; TREND_SIG := CROSS(EMA(C, 5), EMA(C, 13)) AND EMA(C, 13) > EMA(C, 34) AND C / EMA(C, 89) > IF(VOL_REGIME < 0.08, 1.028, 1.016); MOM_SIG := MACD_POWER > IF(VOL_REGIME < 0.1, 0.5, 0.8) AND SLOPE(VOLATILITY, 5) < 0; REALTIME_SIG := V > MA(V, 20) * 1.25 AND (C - L) / REF(H - L, 1) > 0.618 AND LIQUIDITY > IF(VOL_REGIME < 0.1, 1.1, 1.25); {——信号合成——} FINAL_SIGNAL := FILTER( VALUATION AND TREND_SIG AND MOM_SIG AND FACTOR_SYN > PERCENTILE(FACTOR_SYN, 70) AND NORTH_ALPHA > 0.5, 3), LINETHICK2; REALTIME_ALERT := FILTER( FINAL_SIGNAL AND REALTIME_SIG AND BETWEEN(TIME, 93000, 145500) AND VOLATILITY < PERCENTILE(VOLATILITY, 60), 0), COLORMAGENTA;```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时选股】代码,遇到了 【{ 单位统一转换为亿,避免后续计算溢出 } {——行业轮动优化——} INDU_REL_STR := EMA(C / MAX(FINANCE(45), 1E-6), 20) * 0.55 + EMA(C / MAX(FINANCE(48), 1E-6), 10) * 0.35 + IIF(HKHOLD(5) > 0, HKHOLD(5) / MA(HKHOLD(5), 20), 0) * 0.1 详细信息 : 未知字符串 1E 错误起始位置 : 246 ; 长度: 2】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留,所有参数计算关系和信号触发条件均不改变。
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值