量化例子
低估价值选股策略
''' 1.市净率小于2; 2.负债比例高于市场平均值; 3.企业的流动资产至少是流动负债的1.2倍; 4.每年四次调仓,即在1/4/7/10月调仓; 5.可加入止损(十天HS300跌幅达10%清仓); ''' ## 初始化函数,设定要操作的股票、基准等等 def initialize(context): # 设定指数 g.stockindex = '000300.XSHG' # 设定沪深300作为基准 set_benchmark('000300.XSHG') # True为开启动态复权模式,使用真实价格交易 set_option('use_real_price', True) # 设定成交量比例 set_option('order_volume_ratio', 1) # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱 set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \ open_commission=0.0003, close_commission=0.0003,\ close_today_commission=0, min_commission=5), type='stock') # 最大持仓数量 g.stocknum = 10 ## 自动设定调仓月份(如需使用自动,注销下段) f = 4 # 调仓频率 log.info(list(range(1,13,12//f))) g.Transfer_date = list(range(1,13,12//f)) ## 手动设定调仓月份(如需使用手动,注释掉上段) # g.Transfer_date = (3,9) #根据大盘止损,如不想加入大盘止损,注释下句即可 # run_daily(dapan_stoploss, time='open') ## 按月调用程序 run_monthly(trade, monthday=20, time='open') ## 交易函数 def trade(context): # 获取当前月份 months = context.current_dt.month # 如果当前月为交易月 if months in g.Transfer_date: ## 获得Buylist Buylist = check_stocks(context) ## 卖出 if len(context.portfolio.positions) > 0: for stock in context.portfolio.positions.keys(): if stock not in Buylist: order_target(stock, 0) ## 分配资金 if len(context.portfolio.positions) < g.stocknum : Num = g.stocknum - len(context.portfolio.positions) Cash = context.portfolio.cash/Num else: Cash = 0 ## 买入 if len(Buylist) > 0: for stock in Buylist: if stock not in context.portfolio.positions.keys(): order_value(stock,Cash) else: return ## 选股函数 def check_stocks(context): # 获取沪深成分股 security = get_index_stocks(g.stockindex) Stocks = get_fundamentals(query( valuation.code, valuation.pb_ratio, balance.total_assets, balance.total_liability, balance.total_current_assets, balance.total_current_liability ).filter( valuation.code.in_(security), valuation.pb_ratio < 2, #市净率低于2 balance.total_current_assets/balance.total_current_liability > 1.2 #流动资产至少是流动负债的1.2倍 )) # 计算股票的负债比例 Stocks['Debt_Asset'] = Stocks['total_liability']/Stocks['total_assets'] # 获取负债比率的市场均值 me = Stocks['Debt_Asset'].median() # 获取满足上述条件的股票列表 Codes = Stocks[Stocks['Debt_Asset'] > me].code return list(Codes) ## 根据局大盘止损,具体用法详见dp_stoploss函数说明 def dapan_stoploss(context): stoploss = dp_stoploss(kernel=2, n=3, zs=0.1) if stoploss: if len(context.portfolio.positions)>0: for stock in list(context.portfolio.positions.keys()): order_target(stock, 0) ## 大盘止损函数 def dp_stoploss(kernel=2, n=10, zs=0.03): ''' 方法1:当大盘N日均线(默认60日)与昨日收盘价构成“死叉”,则发出True信号 方法2:当大盘N日内跌幅超过zs,则发出True信号 ''' # 止损方法1:根据大盘指数N日均线进行止损 if kernel == 1: t = n+2 hist = attribute_history('000300.XSHG', t, '1d', 'close', df=False) temp1 = sum(hist['close'][1:-1])/float(n) temp2 = sum(hist['close'][0:-2])/float(n) close1 = hist['close'][-1] close2 = hist['close'][-2] if (close2 > temp2) and (close1 < temp1): return True else: return False # 止损方法2:根据大盘指数跌幅进行止损 elif kernel == 2: hist1 = attribute_history('000300.XSHG', n, '1d', 'close',df=False) if ((1-float(hist1['close'][-1]/hist1['close'][0])) >= zs): return True
小市值策略
''' 筛选出市值介于20-30亿的股票,选取其中市值最小的三只股票, 每天开盘买入,持有五个交易日,然后调仓。 ''' ## 初始化函数,设定要操作的股票、基准等等 def initialize(context): # 设定沪深300作为基准 set_benchmark('000300.XSHG') # True为开启动态复权模式,使用真实价格交易 set_option('use_real_price', True) # 设定成交量比例 set_option('order_volume_ratio', 1) # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱 set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \ open_commission=0.0003, close_commission=0.0003,\ close_today_commission=0, min_commission=5), type='stock') # 持仓数量 g.stocknum = 3 # 交易日计时器 g.days = 0 # 调仓频率 g.refresh_rate = 5 # 运行函数 run_daily(trade, 'every_bar') ## 选出小市值股票 def check_stocks(context): # 设定查询条件 q = query( valuation.code, valuation.market_cap ).filter( valuation.market_cap.between(20,30) ).order_by( valuation.market_cap.asc() ) # 选出低市值的股票,构成buylist df = get_fundamentals(q) buylist =list(df['code']) # 过滤停牌股票 buylist = filter_paused_stock(buylist) return buylist[:g.stocknum] ## 交易函数 def trade(context): if g.days%g.refresh_rate == 0: ## 获取持仓列表 sell_list = list(context.portfolio.positions.keys()) # 如果有持仓,则卖出 if len(sell_list) > 0 : for stock in sell_list: order_target_value(stock, 0) ## 分配资金 if len(context.portfolio.positions) < g.stocknum : Num = g.stocknum - len(context.portfolio.positions) Cash = context.portfolio.cash/Num else: Cash = 0 ## 选股 stock_list = check_stocks(context) ## 买入股票 for stock in stock_list: if len(context.portfolio.positions.keys()) < g.stocknum: order_value(stock, Cash) # 天计数加一 g.days = 1 else: g.days += 1 # 过滤停牌股票 def filter_paused_stock(stock_list): current_data = get_current_data() return [stock for stock in stock_list if not current_data[stock].paused]
双均线策略
# 导入函数库 from jqdata import * # 初始化函数,设定基准等等 def initialize(context): # 设定沪深300作为基准 set_benchmark('000300.XSHG') # 开启动态复权模式(真实价格) set_option('use_real_price', True) # 输出内容到日志 log.info() log.info('初始函数开始运行且全局只运行一次') # 过滤掉order系列API产生的比error级别低的log # log.set_level('order', 'error') ### 股票相关设定 ### # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱 set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock') ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的) # 开盘前运行 run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') # 开盘时运行 run_daily(market_open, time='open', reference_security='000300.XSHG') # 收盘后运行 run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') ## 开盘前运行函数 def before_market_open(context): # 输出运行时间 log.info('函数运行时间(before_market_open):'+str(context.current_dt.time())) # 给微信发送消息(添加模拟交易,并绑定微信生效) # send_message('美好的一天~') # 要操作的股票:平安银行(g.为全局变量) g.security = '000001.XSHE' ## 开盘时运行函数 def market_open(context): log.info('函数运行时间(market_open):'+str(context.current_dt.time())) security = g.security # 获取股票的收盘价 close_data = get_bars(security, count=5, unit='1d', fields=['close']) # 取得过去五天的平均价格 MA5 = close_data['close'].mean() # 取得上一时间点价格 current_price = close_data['close'][-1] # 取得当前的现金 cash = context.portfolio.available_cash # 如果上一时间点价格高出五天平均价1%, 则全仓买入 if (current_price > 1.01*MA5) and (cash > 0): # 记录这次买入 log.info("价格高于均价 1%%, 买入 %s" % (security)) print("当前可用资金为{0}, position_value为{0}".format(cash, context.portfolio.positions_value)) # 用所有 cash 买入股票 order_value(security, cash) # 如果上一时间点价格低于五天平均价, 则空仓卖出 elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0: # 记录这次卖出 log.info("价格低于均价, 卖出 %s" % (security)) # 卖出所有股票,使这只股票的最终持有量为0 order_target(security, 0) ## 收盘后运行函数 def after_market_close(context): log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time()))) #得到当天所有成交记录 trades = get_trades() for _trade in trades.values(): log.info('成交记录:'+str(_trade)) log.info('一天结束') log.info('##############################################################')