市净率指的是每股股价与每股净资产的比率。每股净资产是股票的账面价值,它是用成本计量的,而每股市价是这些资产的现在价值,它是证券市场上交易的结果。
从公司发展潜力方面来看。市净率高的股票,说明市场认可公司的发展潜力,愿意溢价购买股票。市净率低的股票,说明市场认为公司成长前景不行,低于净资产才能购买该公司的股票。
而从风险方面来看,高市净率股票,泡沫较大,万一公司成长速度不及预期,市场还是会考虑价格与市净率的匹配问题。低市净率的股票,由于市值低于净资产,就算公司破产,那分到的净资产也会超过股票价格,只要公司经营不要继续恶化,导致接连亏损,那么股票的风险就极低,一旦公司业绩有了起色,那市场定价的时候也会考虑到市净率过低的问题。
本文的策略更看重风险方面,因此,主要逻辑如下:
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
收益情况:


代码中的需要说明的地方我已经在代码区注释了,此策略是简化版,不建议用来模拟或实盘。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/129438
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!