QMT练习精简的低市净率策略

市净率指的是每股股价与每股净资产的比率。每股净资产是股票的账面价值,它是用成本计量的,而每股市价是这些资产的现在价值,它是证券市场上交易的结果。

从公司发展潜力方面来看。市净率高的股票,说明市场认可公司的发展潜力,愿意溢价购买股票。市净率低的股票,说明市场认为公司成长前景不行,低于净资产才能购买该公司的股票。

而从风险方面来看,高市净率股票,泡沫较大,万一公司成长速度不及预期,市场还是会考虑价格与市净率的匹配问题。低市净率的股票,由于市值低于净资产,就算公司破产,那分到的净资产也会超过股票价格,只要公司经营不要继续恶化,导致接连亏损,那么股票的风险就极低,一旦公司业绩有了起色,那市场定价的时候也会考虑到市净率过低的问题。

本文的策略更看重风险方面,因此,主要逻辑如下:

1、每66个交易日(大约三个月)换仓一次。

2、每次选择市净率最低的(但小大于0,小于0就成负资产啦!)30支股票作为目标持仓。

3、将原持仓中、不在第2条的30支股票中的股票清仓。

4、将不在原持仓中、在第2条的30支股票中的股票买入。

# coding:gbkimport datetime#省事起见,继续用tushare的数据import ****_tushare as tsts.set_token('********************')pro = ts.pro_api()pro = ts.pro_api(env='qa')pro = ts.pro_api(server='************')#初始化函数def init(C):#这个C.days是记录策略运行的次数,也就是天数  C.days = 0  #账户  C.accountID = '666'  #账户类型  C.strAccountType = 'STOCK'  #每日运行一次def handlebar(C):#获取策略中的“当天”  date = timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')  #66个交易日运行一次  if C.days%66 == 0:  #在tushare中获取市净率数据    df = pro.daily_basic_ts(trade_date=date, fields="ts_code,pb")    #筛选市净率>0    df = df[df['pb']>0]    #按市净率升序排列并取前30支    df = df.sort_values(by='pb', ascending=True).head(30)    #股票代码转换成列表    low_pb_list = df['ts_code'].tolist()    #获取持仓情况    pos = get_trade_detail_data(C.accountID, C.strAccountType, 'POSITION', '低市净率')    #持股代码和数量的字典    hold = {}    #填充字典    for p in pos:      hold[p.m_strInstrumentID+'.'+p.m_strExchangeID]=p.m_nVolume    #卖出(逻辑前面说过)    for j,k in hold.items():      if j not in high_dv_list:        passorder(24, 1101, C.accountID, j, 5, 0,k, 2, C)        print(f'已清仓{j}!-{date}')            #买入(逻辑前面说过)    for i in high_dv_list:      if i not in hold.keys():        passorder(23, 1102, C.accountID, i, 5, 0,100000, 2, C)        print(f'已买入{i},金额3万元!-{date}')       #每运行一日,记录的天数增加1  C.days += 1

收益情况:

QMT练习精简的低市净率策略

QMT练习精简的低市净率策略

代码中的需要说明的地方我已经在代码区注释了,此策略是简化版,不建议用来模拟或实盘。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/129438
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 6小时前
下一篇 6小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注