欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

股票模板实例

程序员文章站 2022-06-01 13:12:17
...

先上代码:

import pandas as pd
start='2014-11-01'
end='2018-01-01'
benchmark='HS300'
universe=DynamicUniverse('HS300')
refresh_rate=60   #此处未给出频率参数,默认是‘d’(天)
max_history_window=60
accounts={
    'fantasy_account':AccountConfig(account_type="security",capital_base=10000000,
                                     commission=Commission(buycost=0.001,sellcost=0.002,unit='perValue'),
                                    slippage=Slippage(value=0.0,unit='perValue'))
                                    }
def initialize(context):
     pass
                                   
def handle_data(context):
     account=context.get_account('fantasy_account')
     universe=context.get_universe(exclude_halt=True)
     history=context.history(universe,'closePrice',60)   #获取K线图等时间序列数据(获取60条历史K线图universe证券列表的前复权收盘价)
     momentum={'symbol':[],'c_ret':[]}   #字典初始化
     for stk in history.keys():  #对每只股票进行循环,用最近的前复权价格除以60个交易日之前的前复权价格,得到累计净值
            momentum['symbol'].append(stk)
            momentum['c_ret'].append(history[stk]['closePrice'][-1]/history[stk]['closePrice'][0])
     #按照过去60日收益率排序,并且选择前60只得股票作为买入候选
     momentum=pd.DataFrame(momentum).sort(columns='c_ret',ascending=False).reset_index()
     #print momentum
     momentum=momentum[:60] #选择
     buylist=momentum['symbol'].tolist()   #待买证券池,tolist函数是将数组或矩阵转化为列表形式
    
     for stk in account.get_positions():  #get.position()用于获取策略当前的所有持仓
            if stk not in buylist:
                order_to(stk,0)  #将该股票清仓
     #等权重买入所选股票
     portfolio_value=account.portfolio_value #account.portfolio_value为获取组合的市值
     for str in buylist:
        order_pct_to(stk,1.0/len(buylist))   #等权重买入
                                    

股票模板实例
这是一个动量策略,策略思想为选取过去60个交易日累计收益率最高的60只股票买入,换仓率为60天。回测区间为2014年11月1日-2018年1月1日,股票池是动态沪深300成分股,比较基准是沪深300指数,调仓频率为每60个交易日调仓一次。

另外,上述代码有涉及到max_history_window。之所以设置是因为我们在handle_data中调用了context的history方法。max_history_window默认对日线数据支持30个交易日,对分钟线数据支持240条K线数据,回溯长度在超出范围时需要手动指定。当在history中调用的历史数据窗口大于max_history_window的默认值时,会报错。所以,如果我们想用context自带的history方法,就需要确保此时的max_history_window大于调用历史数据窗口。

接着,我们又看到了对accounts账户的设置,account_type及capital_base和之前讲解的一致,因为我们采用的是股票策略,所以account_type=‘security’,capital_base(初始资金)还是1000万元。但是这里还需要设置另外两个参数:一个是commission,另一个是slippage。commission参数用于设置手续费,而slippage参数用来设置滑点。

然后,我们可以看到策略最重要的逻辑都是在handle_data函数里实现。首先是通过account=context.get_account(‘fantas_account’)获取我们在前面设定好的股票账户。context自带了一些日期属性及价量信息、股票池处理等功能,此处我们看到了context的get_universe方法,并且参数exclude_halt设置成了True,意思是获取我们当前的股票池并且剔除停牌的股票。

我们还看到了context的另一个history,参数如下:

context.history(symbol,attribute,time_range,freq='1d',style='sat',rtype='frame')

history方法用于获取K线图等时间序列数据,参数说明:
(1)symbol:指需要获取的证券列表,支持单个证券或证券列表
(2)attribute:指需要获取的属性,支持单个值或属性列表,可选范围如下:
openPrice:前复权开盘价
highPrice:前复权最高价
lowPrice:前复权最低价
closePrice:前复权收盘价
preClosePrice:前复权前开盘价
turnoverVol:前复权成交量
turnoverValue:前复权成交额
(3)time_range:指所需回溯的历史K线图条数,和freq属性相对应
(4)freq:指K线图周期,支持’1d’,‘1m’,‘5m’,‘15m’,‘30m’,'60m’等周期。‘1d’表示日线,‘1m’表示一分钟线。分钟K线图尽可以在分钟频率回溯时使用。
(5)style:指数据返回类型,可以选择‘ast’,'sat’或者’tas’这三种类型。其中‘a’代表‘attribute’,‘s’代表symbol,‘t’代表时间,三种选择分别对应这三个维度的呈现顺序,例如"ast",表示在返回的字典中的键是attribute,其值为列为symbol,行为time的DataFrame。
(6)rtype:指返回值的数据类型,可以选择‘frame’、‘array’这两种类型。
由上述可知,通过context.history(universe,‘closePrice’,60),我们获取了各只股票在历史上60个交易日的前复权收盘价,格式是一个字典,键为股票代码,值是一个索引为时间、列为前复权开盘价的DataFrame。

接下来我们把一个字典初始化,然后对每只股票进行循环,用最近的前复权价格除以60个交易日之前的前复权价格,得到累积净值。然后对股票按累积净值进行排序,选取前60只股票作为待买股票池。

接下来我们就要进行股票的下单买卖。这里出现了account的方法get_position(),用于获取策略当前的所有持仓,具体返回的是一个字典,键为股票代码,值为持仓股票数量。我们对我们的持仓的股票进行遍历,若它不在我们的待买股票池里,就做一个order_to(stk,0),即将该股票清仓。

除了order_to方法。还有其他的下单方法:
1、order(symbol,amount,price=0.,otype=‘market’)
指根据指定的参数,进行订单委托。订单类型支持市价单或限价单,在限价单中需将otype设置为‘limit’,并设置下单价格。
对其参数说明如下:
(1)symbol:指交易的证券代码,必须包含后缀,其中上证证券为.XSHG,深证证券为’XSHZ’
(2)amount:指需要交易的证券代码为symbol的证券数量,为正则买入,为负则卖出;程序会自动对amount向下取整到最近的整百。
(3)price:指下限价单时的下单价格(仅日内策略使用)
(4)otype:指可选‘market’(市价单)和‘limit’(限价单)这两个值,表示交易指令(为limit时仅日内策略可用)

2、order_to(symbol,amount,price=0.,otype=‘market’)
指通过下单,将某只股票的持仓调整到持有多少手。策略藏家会自动计算当前持仓和目标持仓的差额,并进行下单。在每次handle_data时调用,最多只允许一次order_to函数调用否则可能造成下单量计算错误。
对其参数说明:
(1)symbol:指交易的证券代码,必须包含后缀,其中上证证券为.XSHG,深证证券为’XSHZ’
(2)amount:指需要交易的证券代码为symbol的证券数量,为正则买入,为负则卖出;程序会自动对amount向下取整到最近的整百。
(3)price:指下限价单时的下单价格(仅日内策略使用)
(4)otype:指可选‘market’(市价单)和‘limit’(限价单)这两个值,表示交易指令(为limit时仅日内策略可用)

3、order_pct(symbol,pct)
指根据当前的账户权益按一定比例下单,比如当前账户有100000元,下单20%,就会使用2000元计算最大可委托手数并下单。
对其参数说明:
(1)symbol:指交易的证券代码,必须包含后缀,其中上证证券为.XSHG,深证证券为’XSHZ’
(2)pct:指需要交易的证券代码为symbol的证券占虚拟账户当前总价值的百分比,范围为0-1,为正则买入,为负则卖出。程序会自动对amount向下取整到最近的整百。

4、order_pct_to(symbol,pct)
指根据当前的账户权益按一定比例下单。策略框架会自动计算当前持仓和目标持仓差额,并进行下单,比如当前账户有100000元,下单20%,就会使用20000元计算最大可委托手数,为500股,当前持有300股,则下单200股。
参数说明:
(1)symbol:指交易的证券代码,必须包含后缀,其中上证证券为.XSHG,深证证券为’XSHZ’
(2)pct:指需要交易的证券代码为symbol的证券占虚拟账户当前总价值的百分比,范围为0-1,为正则买入,为负则卖出。程序会自动对amount向下取整到最近的整百。

我们首先把在持仓里但不在待买股票池里的股票卖出,接着也是通过account的方法account.portfolio_value获取组合的市值,然后运用order_pct_to方法将所有待买股票买入或卖出到等全。通常会将卖出操作卸载买入操作前面,这样才可腾出现金买入其他股票。

相关标签: 股票模板实例