@晚起的小虫 尝试修改了购买部分的函数,输入一个含有权重的buy_stocks_dict字典,根据每只股票及其权重进行购买,如果账户现有持仓相应股票的仓位总额大于目标总额,则不变,其余则根据权重加以购买,请帮忙指点一二!
```
'''---------------买入股票规则2--------------'''
class Buy_stocks_a(Adjust_position):
def __init__(self,params):
self.buy_count = params.get('buy_count',5)
def update_params(self,context,params):
self.buy_count = params.get('buy_count',self.buy_count)
def adjust(self,context,data,buy_stocks_dict):
if buy_stocks_dict:
hold_stocklist=[]
for hold_stock in context.portfolio.positions.keys():
hold_stocklist.append(hold_stock)
cantsell_stock_list=list(set(hold_stocklist).difference(set(buy_stocks_dict.keys())))
cantsell_values=0
_ratio_sum=0
if cantsell_stock_list:
for stock in cantsell_stock_list:
hStocks = history(1, '1d', 'close', stock, df=False)
cantsell_curPrice = hStocks[stock]
cantsell_curValue = float(context.portfolio.positions[stock].total_amount * cantsell_curPrice)
cantsell_values+=cantsell_curValue
rebalance_value_1=float(context.portfolio.total_value-cantsell_values)
alreadyexist_stocks=list(set(hold_stocklist)&set(buy_stocks_dict.keys()))
stock_allvalue_list=[]
for _stock,_ratio in buy_stocks_dict.items():
stock_allvalue_list.append([_stock ,_ratio, context.portfolio.positions[_stock].value if _stock in alreadyexist_stocks else 0, rebalance_value_1*_ratio])
_ratio_sum+=_ratio
stock_allvalue_list.sort(key=lambda x:x[3]-x[2])
for i in range(len(stock_allvalue_list)):
stock_value_temp=float(rebalance_value_1*stock_allvalue_list[i][1]/(_ratio_sum))
if stock_allvalue_list[i][2]>stock_value_temp:
stock_allvalue_list[i][3]=stock_allvalue_list[i][2]
else:
stock_allvalue_list[i][3]==stock_value_temp
rebalance_value_1= rebalance_value_1- stock_allvalue_list[i][3]
_ratio_sum-=stock_allvalue_list[i][1]
position_count = len(context.portfolio.positions)
if self.buy_count > position_count:
for stock_value_list in stock_allvalue_list:
if self.open_position(stock_value_list[0], stock_value_list[3]):
g.buy_list.append(stock_value_list[0])
if len(context.portfolio.positions) == self.buy_count:
break
def __str__(self):
return '股票调仓买入规则:按权重买入股票相同股票只加仓不减仓'
```
2017-02-11