不多废话,直接教贴,本帖是面向新手的,以及不知道怎么通过帮助把功能实现出来的人,高手跳过

代码一个大框架,几个小框架,比如导入,init函数立下一些规则和全局变量,用来在整个代码中使用,before_trade,然后是handle_data主要算法逻辑;

import pandas as pd
import numpy as np
from datetime import datetime,timedelta

先导入常用的包,不懂的人可以去学python基础,有慧根的人两三天即可;

然后是init,这里可以参考帮助文档里面,找自己需要的功能,比如基准参考,默认是沪深300;

滑点的问题,在北大讲座请教玄耀先生的时候得到了一个靠谱点的答案:滑点尽量根据最近的单子级别来设定,比较合理;

def init(context):
    
    context.set_benchmark("000001.SZ") 
    #这里选了000001.SZ作为参考基准,大家可以根据自己的不同需要进行修改;
    context.buyList = []
    #制定了一个买股的集合单子;存放在buyList里面的就是我们选出来后的要买的股
    context.curPflInfo = {}
    #curPflInfo 的key为当前持仓股票,value为股票信息  
    #如 context.curPflInfo = {'000001.XSHE':{'time':1,'avgCost':9.5}}
    #avgCost是平均成本
    context.holdSize = 10
    #持仓数
    context.weight = 0
    #新买个股的初始仓位 每天开盘前初始化
    context.stpPftPrice = 0.05
    #止盈,可以是值,也可以是百分比制;
    context.stpLosRate = -0.05
    #止损,和止盈同样的道理
    context.orderList = []
    #下单集合
def before_trade(context):
    q = query(
        fundamentals.equity_valuation_indicator.market_cap_2
    ).filter(
        fundamentals.equity_valuation_indicator.market_cap_2<1e11
    ).order_by(
        fundamentals.equity_valuation_indicator.market_cap_2.asc() 
    ).limit(2500)
    df = get_fundamentals(q)
    context.allStocks = df.columns.values
    for stk in context.curPflInfo.keys():   
        context.curPflInfo[stk]['holdDays'] += 1

上面这个很基础的,通过市值来选取股,帮助文档里面能找到相关说明,这里就不多废话了,asc是从小到大取,如果选得多,成交机制也是从小到大进行成交;limit()为限制数量;

接下来是过滤st和停牌,涨跌停股,目前不设置也不会买

def filterStAndPaused(stkList,data_dict):
    #过滤st和停牌股票
    stkList = [stk for stk in stkList if not is_st(stk) and data_dict[stk].sf==0]
    return stkList
def filterLimitStk(stk,data_dict,context):
    #过滤涨跌停股票
    yesterday = get_history(2,'1d', 'close')[stk].values[-1]
    zt = round(1.10 * yesterday,2)
    dt = round(0.97 * yesterday,2)
     if dt < data_dict[stk].last < zt :
        return True
    else : 
        return False

老实讲,实盘是不分涨跌停限制的,因为可能会被打开,如果你的策略有针对涨跌停股打开后的操作,这个可以不设置或者增加判断;

def doSelect(context, data_dict, stkList):
    #根据一定条件筛选所要操作的股票
    buyList = []
    buyList = sanliandie(stkList, data_dict,context)
    # 选出股票
    
    buyList = filterStAndPaused(buyList,data_dict)
    buyList = [stk for stk in buyList if filterLimitStk(stk,data_dict, context)]
    buyList = [stk for stk in buyList if data_dict[stk].close<200]
    buyList = getReturn(buyList, data_dict, context)
    #过滤股价大于 200 的股票
    return buyList

上面是选出你需要的股票池,这里我过滤了超过200价格的股;

止盈止损的设定:

if not (now.hour == 14 and now.minute >= 56) and now.hour != 15:
        # 每天9.31-14.51分 监控当前持仓的股票
        popList = []
        for stk in context.curPflInfo.keys():
            if (data_dict[stk].close / context.curPflInfo[stk]['avgCost']) -1  >= context.stpPftPrice:
                #如果 当前价和成本价的差价大于预定值 则卖出
                order_target_value(stk, 0)
                print ('止盈卖出 :', stk)
                popList.append(stk)
        for stk in popList:
            context.curPflInfo.pop(stk)
            

        popList = []
        for stk in context.curPflInfo.keys():
            if (context.curPflInfo[stk]['avgCost']==0):
                popList.append(stk)
                continue
            if (data_dict[stk].close / context.curPflInfo[stk]['avgCost']) -1 <= context.stpLosRate:
                #如果当前亏损大于预定值 则止损卖出
                order_target_value(stk, 0)
                if now.hour ==14 and now.minute == 55 :
                    print ('止损卖出 :', stk)
                popList.append(stk)
        for stk in popList:
            context.curPflInfo.pop(stk)

随后是建仓下单的设定:

if len(context.curPflInfo.keys()) < context.holdSize:
            #如果当前持仓数小于 预设值 则进行选股 买入操作
            buyList = doSelect(context, data_dict, context.allStocks)
            buyCount = context.holdSize-len(context.curPflInfo.keys())
            buyList = buyList[:buyCount]
            
            for stk in buyList:
                #order_value(stk, context.weight)
                order_percent(stk, 0.1)
                #order_traget_percent(stk,0.095)
                print ('建仓 :', stk)
                #这里建仓有好几种方法,可以通过帮助文档,或者请教群里的大神来了解

还设定了一个超过n天强制卖出的:

popList = []
        for stk in context.curPflInfo.keys():
            # 如果持仓时间大于n则卖出
            if context.curPflInfo[stk]['holdDays'] >= n:
                order_target_value(stk, 0)
                print('超过持仓时间卖出:', stk)
                if context.portfolio.positions[stk].quantity == 0:
                    popList.append(stk)
        for stk in popList:
            context.curPflInfo.pop(stk)

判断成本价和持仓天数更新:

for stk in context.portfolio.positions.keys():
            if context.portfolio.positions[stk].quantity==0:
                continue
            else:
                stkInfo = {}
                stkInfo['avgCost'] = context.portfolio.positions[stk].bought_value/context.portfolio.positions[stk].bought_quantity
                stkInfo['holdDays'] = 1
                context.curPflInfo[stk] = stkInfo

如有错误欢迎指正~

祝大家玩的愉快

7条回复 添加回复
daoyuchuan

详细,感谢如此温柔的对待新手~


2016-12-08 15:17:29
Shibar

学习了!


2017-05-19 10:05:54
Insomniabeta

大大的赞


2017-05-22 15:16:31
qinrenaoo

怒赞!


2017-06-30 23:06:52
elesky

看起来不错!


2017-08-17 15:39:53
jingleix

为啥没有看到handle_data的用法,后边的都是handle_data的处理吗?


2017-08-19 13:29:52
nickchen169

很有帮助的 谢谢


2017-08-29 21:17:49
1
提交
Copyright © 2004-2017 京东JD.com 版权所有 | 投资有风险,购买需谨慎