前些天有位粉丝让我写一个底部震荡选股策略,正好以前我在通达信上写过一个类似的指标,于是就用之前的逻辑,在QMT中编写了一下。
主要逻辑为:
选股方面:
1、当日收盘价低于近460个交易日(大约两年)的最高收盘价。这代表了底部特性。
2、近60个交易日的最高收盘价/近60个交易日的最低收盘价<1.2。这代表了震荡特性。
3、昨日收盘价>近60个交易日的最高收盘价。这代表了突破特性。
交易方面:
4、最多持有5只股票。
5、止盈止损。每只股票收益超过50%卖出止盈,损失超过-30%卖出止损。
根据以上逻辑生成了代码:
#encoding:gbk
class a():
pass
A = a() #创建空的类的实例 用来保存委托状态
def init(C):
A.acct= '666' #随便设置一个账号
A.acct_type= 'STOCK' #账号类型
A.stocknum = 5#最多持有5支股票
def handlebar(C):
print(timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'))
pos = get_trade_detail_data(A.acct, A.acct_type, 'position')#获取持仓
#如果有持仓股票,则单只股票50%止盈,-30%止损。
if len(pos)>0:
for p in pos:
print(f' 股票代码:{p.m_strInstrumentID}.{p.m_strExchangeID},\n 剩余数量:{p.m_nVolume},\n 持仓成本:{p.m_dOpenPrice:.3f},\n 盈亏比例:{p.m_dProfitRate:.2%}')
if p.m_dProfitRate>=0.5 or p.m_dProfitRate<=-0.3:
passorder(24,1123,A.acct,p.m_strInstrumentID,5,0,1,C)
else:
print(' 空仓')
#选股
A.stock = C.get_stock_list_in_sector('沪深A股')
data = C.get_market_data_ex(['close'],A.stock, end_time=timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'),period = "1d",count = 460)
for s in A.stock:
df = data[s]
if len(data[s]) < 460:
print('行情长度不足(新上市或最近有停牌) 跳过运行')
continue
df.dropna()
high_2years = max(df['close'])
high = max(df['close'][-61:-2])
low = min(df['close'][-61:-2])
try :#近60日收盘价波动在20%以内,当日收盘价比2年内最高价的40%还低,收盘价格跳出60日震荡平台
if df['close'][-1] / high_2years < 0.4 and high/low < 1.2 and df['close'][-1] > high:
print(timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'),s)
if len(pos)<A.stocknum:#如果持仓不足5支,则买入筛选出来的股票
passorder(23, 1101, A.acct, s, 5, 0, 100, "", 1, "",C)
except ZeroDivisionError:#解决因数据问题,导致除数为0的异常。
print(timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'),'数据问题,除数为0',s)
返回(开头部分截图):

收益情况,很明显,没跑过沪深300:

一些知识点讲解一下:
20行,每只持仓股票,收益超过50%卖出止盈,损失超过-30%卖出止损。
33行,近460个交易日的最高收盘价。
34、35行,近61日的最高、最近收盘价(不含当日)。
39、40行,如果持仓股不够5只,则买入策略选出的股票100股。
因为是全A选股,又获取取了460个交易日的数据,所以策略运行很慢。点击“回测”后,7分钟左右才更新日志(这个时间跟电脑的配置有关)。大家可以更改股票池或将460缩短一些,以缩短回测时间。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73397
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!