赞
踩
在看其中一个新手教程的时候,发现没有一个总的代码。
然后,就根据自己的理解,整合了一下。
对于,一开始根据研究发现,在这段时间,如果买全市场市值最低的几个,那绝对是要亏本亏到难以理解的。
所以,我这里就选的是,全市值最高的几个。
但是,这样就跟指数的波动相近较大了。(beta偏高)
def initialize(context):
g.stocksnum = 5 # 持有最小市值股票数
g.period = 10 # 轮动频率
run_daily(daily, time='every_bar') # 周期循环daily
g.days = 1 # 记录策略进行到第几天,初始为1
def trade(context, buylist):
# 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
for stock in context.portfolio.positions:
if stock not in buylist: # 如果stock不在buylist
order_target(stock, 0) # 调整stock的持仓为0,即卖出
# 将总资产(现金+股票)除以持股数g.stocksnum
position_per_stk = context.portfolio.total_value / g.stocksnum
# 调整buylist中的每个股票持仓价值为position_per_stk
for stock in buylist:
order_target_value(stock, position_per_stk)
# 止损
def stop(context):
# 循环查看持仓的每个股票
for stock in context.portfolio.positions:
# 如果股票最新价格除以平均成本小于0.8,即亏损超过20%
if context.portfolio.positions[stock].price / context.portfolio.positions[stock].avg_cost < 0.8:
# 调整stock的持仓为0,即卖出
order_target(stock, 0)
# 输出日志:股票名 止损
print "\n%s 止损" % stock
def pick(context):
date = context.current_dt.strftime("%Y-%m-%d")
# 获取上证指数和深证综指的成分股代码并连接,即为全A股市场所有股票
scu = get_index_stocks('000001.XSHG') + get_index_stocks('399106.XSHE')
# 选出在scu内的股票的股票代码,并按照当前时间市值从小到大排序
df = get_fundamentals(query(
valuation.code, valuation.market_cap
).filter(
valuation.code.in_(scu)
).order_by(
valuation.market_cap.desc()
), date=date
)
# 取出前g.stocksnum名的股票代码,并转成list类型,buylist为选中的股票
buylist = list(df['code'][:g.stocksnum])
return buylist
def daily(context):
# 每日止损
stop(context)
# 判断策略进行天数是否能被轮动频率整除余1
if g.days % g.period == 1:
buylist = pick(context)
trade(context, buylist)
else:
pass # 什么也不做
g.days = g.days + 1 # 策略经过天数增加1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。