stock for stock in tohold if stock not in context.portfolio.positions
时间: 2024-03-07 16:51:29 浏览: 57
你的第一个问题是关于 Python 语言的列表推导式。该代码行的功能是从列表 tohold 中选出那些不在 context.portfolio.positions 列表中的股票,然后返回一个新的列表。换句话说,该代码行的作用是过滤掉已经在持仓中的股票,只保留那些新的股票。这在股票交易中很常见,可以用于筛选出新的买入机会。希望我的回答对你有帮助!
相关问题
import jqdata # 初始化聚宽账号密码 def initialize(context): # 设置回测日期区间 set_benchmark('000300.XSHG') set_option('use_real_price', True) # 设置买入的股票数量上限 g.max_stock_count = 5 def handle_data(context, data): # 获取当前日期 current_date = context.current_dt.date() # 获取股票池中的股票列表 stocks = get_index_stocks('000852.XSHG') # 按照股票池中的股票进行遍历 for stock in stocks: # 判断股票是否满足买入条件 if check_buy_condition(stock, current_date, context): buy_stock(stock, context) # 判断持有的股票是否满足卖出条件 if check_sell_condition(stock, current_date, context): sell_stock(stock, context) def check_buy_condition(stock, current_date, context): # 判断股票是否连续下跌三天 prices = attribute_history(stock, 3, '1d', ['close']) if len(prices) == 3 and prices['close'][-1] < prices['close'][-2] < prices['close'][-3]: return True else: return False def buy_stock(stock, context): # 判断当前持仓的股票数量是否已达上限 if len(context.portfolio.positions) >= g.max_stock_count: return # 买入股票 order_value(stock, context.portfolio.cash / g.max_stock_count) def check_sell_condition(stock, current_date, context): # 获取持有股票的买入日期 buy_date = context.portfolio.positions[stock].init_time.date() # 判断是否满足卖出条件 if current_date - buy_date >= 3: # 判断是否亏损超过5% if (context.portfolio.positions[stock].last_price - context.portfolio.positions[stock].avg_cost) / context.portfolio.positions[stock].avg_cost <= -0.05: return True return False def sell_stock(stock, context): # 卖出股票 order_target(stock, 0)当中buy_date = context.portfolio.positions[stock].init_time.date()报错'NoneType' object has no attribute 'date'
这个错误是因为在`check_sell_condition`函数中,`context.portfolio.positions[stock].init_time`返回了`None`,没有日期属性。这可能是因为你在买入股票之前没有设置买入日期。你可以在买入股票时设置买入日期,例如:
```python
def buy_stock(stock, context):
# 判断当前持仓的股票数量是否已达上限
if len(context.portfolio.positions) >= g.max_stock_count:
return
# 设置买入日期
buy_date = context.current_dt.date()
# 买入股票
order_value(stock, context.portfolio.cash / g.max_stock_count, date=buy_date)
```
然后在`check_sell_condition`函数中,你可以直接使用`buy_date`判断是否满足卖出条件:
```python
def check_sell_condition(stock, current_date, context):
# 获取持有股票的买入日期
buy_date = context.portfolio.positions[stock].init_time.date()
# 判断是否满足卖出条件
if current_date - buy_date >= 3:
# 判断是否亏损超过5%
if (context.portfolio.positions[stock].last_price - context.portfolio.positions[stock].avg_cost) / context.portfolio.positions[stock].avg_cost <= -0.05:
return True
return False
```
这样就可以避免报错了。
def initialize(context): # 设置回测日期区间 set_benchmark('000300.XSHG') set_option('use_real_price', True) # 设置买入的股票数量上限 g.max_stock_count = 5 def handle_data(context, data): # 获取当前日期 current_date = context.current_dt.date() # 获取股票池中的股票列表 stocks = get_index_stocks('000852.XSHG') # 按照股票池中的股票进行遍历 for stock in stocks: # 判断股票是否满足买入条件 if check_buy_condition(stock, current_date, context): buy_stock(stock, context) # 判断持有的股票是否满足卖出条件 if check_sell_condition(stock, current_date, context): sell_stock(stock, context) def check_buy_condition(stock, current_date, context): # 判断股票是否连续下跌三天 prices = attribute_history(stock, 3, '1d', ['close']) if len(prices) == 3 and prices['close'][-1] < prices['close'][-2] < prices['close'][-3]: return True else: return False def buy_stock(stock, context): # 判断当前持仓的股票数量是否已达上限 if len(context.portfolio.positions) >= g.max_stock_count: return buy_date = context.current_dt.date() # 买入股票 order_value(stock, context.portfolio.cash / g.max_stock_count) def check_sell_condition(stock, current_date, context): # 获取持有股票的买入日期 buy_date = context.current_dt.date() time_diff = current_date - buy_date threshold = timedelta(days=3) # 判断是否满足卖出条件 if time_diff >= threshold or ((context.portfolio.positions[stock].last_price - context.portfolio.positions[stock].avg_cost) / context.portfolio.positions[stock].avg_cost <= -0.05): # 判断是否亏损超过5% return order_target(stock, 0) 报错 type object 'UserObject' has no attribute '__getattr__'
这个错误是由于在代码中使用了错误的函数来下单。在buy_stock函数中,应该使用order_target_value函数而不是order_value函数来下单。同样,在check_sell_condition函数中,应该使用order_target函数而不是order_target_value函数来卖出股票。以下是修改后的代码:
```python
def initialize(context):
# 设置回测日期区间
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 设置买入的股票数量上限
g.max_stock_count = 5
def handle_data(context, data):
# 获取当前日期
current_date = context.current_dt.date()
# 获取股票池中的股票列表
stocks = get_index_stocks('000852.XSHG')
# 按照股票池中的股票进行遍历
for stock in stocks:
# 判断股票是否满足买入条件
if check_buy_condition(stock, current_date, context):
buy_stock(stock, context)
# 判断持有的股票是否满足卖出条件
if check_sell_condition(stock, current_date, context):
sell_stock(stock, context)
def check_buy_condition(stock, current_date, context):
# 判断股票是否连续下跌三天
prices = attribute_history(stock, 3, '1d', ['close'])
if len(prices) == 3 and prices['close'][-1] < prices['close'][-2] < prices['close'][-3]:
return True
else:
return False
def buy_stock(stock, context):
# 判断当前持仓的股票数量是否已达上限
if len(context.portfolio.positions) >= g.max_stock_count:
return
buy_date = context.current_dt.date()
# 买入股票
order_target_value(stock, context.portfolio.cash / g.max_stock_count)
def check_sell_condition(stock, current_date, context):
# 获取持有股票的买入日期
buy_date = context.current_dt.date()
time_diff = current_date - buy_date
threshold = timedelta(days=3)
# 判断是否满足卖出条件
if time_diff >= threshold or ((context.portfolio.positions[stock].last_price - context.portfolio.positions[stock].avg_cost) / context.portfolio.positions[stock].avg_cost <= -0.05):
# 判断是否亏损超过5%
return
order_target(stock, 0)
```
请尝试使用这个修改后的代码,并检查是否还有其他错误。
阅读全文