问财量化策略,有谁知道代码错在哪里?万分感谢

用户头像shmaek
2023-03-07 发布

'''
#使用问财选股
#卖出条件:
#1、如果持仓个股不在问财选中股池中,按昨日收盘价算,亏损>7%,卖出
#2、如果持仓个股不在问财选中股池中,个股盈利>19%,但个股最大回撤>7%,卖出
#3、如果持仓个股不在问财选中股池中,亏损<7%,盈利<19%,持仓天数>5天的个股,卖出
#4、5天里沪深300指数跌过13%,清仓,清仓后休息50个交易日
#5、设最大持仓个股只数为5只
#6、每日开盘后运行1次,检查是否要卖出与买入
'''
'''
运行时出错,不知道错误在哪,要疯了
2017-09-28 00:49:19 - ERRORhandle_data函数错误:
File "backtest_code.py", line 85, in handle_data
ValueError:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().(温馨提示:第85行,参数输入不合法,请检查参数输入类型和内容。)
'''
'''
#以下为具体代码
'''
#初始化账户
def initialize(account):
set_commission(PerShare(cost=0.0004, min_trade_cost=5.0))
#设置交易费
get_iwencai('非新股,非ST,非亏损,非停牌,非大盘股,总市值由小到大取200')
#问财选股
#以下声明全局变量与列表
g.max_num=5
#最多持股只数
g.max_day=5
#亏损<7%,盈利<19%,最高价回落<7%,这些个股持仓超过5天,就卖出
g.hz300_count=0
#沪深300若5天下跌>13%,则开始计数,每天加1,其后50天不买股票
g.max_down=0
#个股最大回撤
g.gp_cys=0
#个股盈亏幅度
g.list_sn=[]
#持仓股票代码列表
g.list_buy_date=[]
#个股买入日期列表
g.list_hold_day=[]
#个股持仓天数列表
#设置买卖条件,每个交易频率(日/分钟/tick)调用一次
def handle_data(account,data):
if g.hz300_count>0 and g.hz300_count<51:
#如果0<沪深300计数器<51
g.hz300_count=g.hz300_count+1
#沪深300计数器计数加1
return
if g.hz300_count>=51:
g.hz300_count=0
last_date = get_last_datetime().strftime('%Y%m%d')
#上个交易日期
len_gp=len(account.positions)
#当前持仓股票只数
if len_gp==0:
#当仓位里无股票
g.list_sn=[]
g.list_buy_date=[]
g.list_hold_day=[]
#清空持仓股票代码列表、买个日期列表、持仓天数列表
if len_gp>0:
for s in list(account.positions):
#循环持仓信息
i=g.list_sn.index(s)
#获取持仓股票列表中该股代码的索引
value_high =get_price(s,g.list_buy_date[i],last_date,'1d',['high'],False,'pre',0,1)
#查询该股买入日期后至上个交易日的个股最高价
gp_high=value_high['high']
#取出最高价
value_close=get_price(s,None,last_date,'1d',['close'],False,'pre',1,1)
#查询该股上个交易日收盘价
gp_close=value_close['close']
#取出收盘价
g.list_hold_day[i]=g.list_hold_day[i]+1
#更新该股持仓天数
gp_cost_basis=account.positions[s].cost_basis
#该股成本价
g.gp_cys = (gp_close/gp_cost_basis)-1
#计算该股盈亏比
g.max_down=gp_close/gp_high-1
#该股的最大回撤
if s not in account.iwencai_securities:
#如果个股未在选股股票池内
if g.gp_cys < -0.07:
#如果个股亏损>7%
order_target(s, 0)
#卖出该股
i=g.list_sn.index(s)
g.list_sn.remove(g.list_sn[i])
g.list_hold_day.remove(g.list_hold_day[i])
g.list_buy_date.remove(g.list_buy_date[i])
#列表移除卖出的个股数据
else:
#如果个股亏损<=7%
if gp_cys>0.19:
#如果个股盈利>0.19
if g.max_down<-0.07:
#如果最大回撤>7%
order_target(s,0)
#卖出
i=g.list_sn.index(s)
g.list_sn.remove(g.list_sn[i])
g.list_hold_day.remove(g.list_hold_day[i])
g.list_buy_date.remove(g.list_buy_date[i])
#列表移除卖出的个股数据
else:
#如果最大回撤<7%
i=g.list_sn.index(s)
#获取该股在列表中的索引
if g.list_hold_day[i]>g.max_day:
#如果该股持仓天数>设定天数
order_target(s,0)
#卖出
g.list_sn.remove(g.list_sn[i])
g.list_hold_day.remove(g.list_hold_day[i])
g.list_buy_date.remove(g.list_buy_date[i])
#列表移除卖出的个股数据
len_gp=len(account.positions)
#当前持仓个股只数
value300_close=get_price('000300.SH',None,last_date,'1d',['close'],skip_paused=False,fq=None,bar_count = 6,is_panel = 1)
#查询沪深300前6个交易日的收盘价
if 1-value300_close['close'][1]/value300_close['close'][5]>0.13:
#如果大盘突然下跌13%
g.hz300_count=g.hz300_count+1
#沪深300计数器计数加1
if len_gp>0:
#如果当前有持仓
for s in list(account.positions):
#循环持仓股票信息中的股票代码
order_target(s,0)
#卖出
i=list_sn.index(s)
#获取持仓股票列表中个股代码的索引
g.list_sn.remove(g.list_sn[i])
g.list_hold_day.remove(g.list_hold_day[i])
g.list_buy_date.remove(g.list_buy_date[i])
#列表中移除卖出的个股数据
if g.hz300_count>0:
#如果沪深300计数器>0
return
len_gp=len(account.positions)
#获取持仓股票只数
if len_gp>=g.max_num:
#如果持仓>=5只
return
gp_pool=account.iwencai_securities
#问财选股选中的股票池
if len(gp_pool)==0:
#股票池中的股票只数为0
return
for s in list(account.positions):
#循环持仓的股票池
if s in gp_pool:
#如果该股在问财选中的股票池里
gp_pool.remove(s)
#问财股票池删除该股,避免买入同一只股票
if len(gp_pool)==0:
#如果问财股票池中无股票
return
for s in gp_pool:
#循环问财股票池
value = data.current(s)
#查询当前股票信息
if value[s].is_paused==1:
#如果是停牌
gp_pool.remove(s)
#问财股票池删除该股
if len(gp_pool)==0:
#如果问财股票池中无股票
return
cur_money=account.available_cash
#当前可用金额
len_gp=len(account.positions)
#当前持仓个股只数
if len(gp_pool)<=g.max_num-len_gp:
#如果问财股票池里的股票只数加上当前持仓个股只数<=最大持股只数
for s in gp_pool:
#循环问财股票池
order_value(s,cur_money/len(gp_pool))
#买入股票
g.list_sn.append(s)
g.list_hold_day.append(0)
g.list_buy_date.append(get_datetime().strftime('%Y%m%d'))
#3个列表分别加上股票代码、持仓天数、买入日期
else:
i=0
for s in gp_pool:
#循环问财股票池
if i #当i<最高持股只数-当前持股只数
order_value(s,cur_money/(g.max_num-len_gp))
#买入股票
g.list_sn.append(s)
g.list_hold_day.append(0)
g.list_buy_date.append(get_datetime().strftime('%Y%m%d'))
#3个列表分别加上股票代码、持仓天数、买入日期
i=i+1
else:
return












评论