网友基于唐奇安通道和macd均线考虑的一个策略
昨天有网友发了一个基于PTrade交易的策略来看问题,问题描述是该策略只有买进,没有卖出。下面是原始策略代码:
import talib
def initialize(context):
# 初始化策略
g.security = "603580.SS"
# 设定每次开仓使用资金的比率
g.capital_usage_ratio = 0.3
g.position = 0 # 是否开仓
set_universe(g.security) # 股票池
set_slippage(slippage=0.002) # 设定滑点
def handle_data(context, data):
# 获取历史数据
df = get_history(100, '1d', ['open', 'high', 'low', 'close'], g.security, fq=None, include=True)
# 计算唐千安通道指标
df["DonHi_n1"] = df["high"].rolling(20).max()
df["DonLo_n1"] = df["low"].rolling(20).min()
# 计算MACD指标
close_prices = df["close"].values
diff, dea, macd = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)
df["diff"] = diff
df["dea"] = dea
df["macd"] = macd
# 判断MACD日线底部结构钝化形成,买入30%仓位
if df["macd"].iloc[-1] < df["macd"].iloc[-2] < df["macd"].iloc[-3]:
cash = context.portfolio.cash
order_value(g.security, cash * 0.3)
log.info("买入30%仓位")
# 判断顶部MACD日线级别钝化形成,卖出70%仓位
if df["macd"].iloc[-1] > df["macd"].iloc[-2] > df["macd"].iloc[-3]:
if g.position == 1:
order_target(g.security, 0)
log.info("卖出70%仓位")
g.position = 0
# 判断是否突破唐千安通道上轨,买入剩余70%仓位
if data[g.security]["close"] > df["DonHi_n1"].iloc[-1]:
if g.position == 0:
cash = context.portfolio.cash
target_value = cash * 0.7
order_value(g.security, target_value)
log.info("买入剩余70%仓位")
g.position = 1
# 判断是否跌破唐千安通道下轨,清仓
if data[g.security]["low"] < df["DonLo_n1"].iloc[-1]:
order_target(g.security, 0)
log.info("清仓")
g.position = 0
================================(这里是分割线)
首先这个策略有一定想法,其策略意图是这样的:
- 如果股票MACD指标的日线底部结构钝化形成,则买入30%仓位。
- 如果股票MACD指标的日线顶部结构钝化形成,且已经满仓持入,则卖出70%仓位。
- 如果股价突破唐奇安通道的上轨,且当前只有底仓,则买入剩余70%仓位。
- 如果当前价跌破唐奇安通道的下轨,则清仓。
但是在代码实现中,逻辑并不完备,造成策略永远只有买入,没有卖出。于是操刀在原代码上做了手术,实现上述策略意图。此策略适合在上升趋势中把握行情,具有一定风险把控和盈利锁定考虑,适合初接触PTrade量化交易者学习。修改后的代码在附件中,感兴趣者可自行下载学习。
2025-01-12 17:32
2024-11-25 16:51