股票模板实例
先上代码:
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方法将所有待买股票买入或卖出到等全。通常会将卖出操作卸载买入操作前面,这样才可腾出现金买入其他股票。
上一篇: flash动画课件模板实例应当如何应用
下一篇: 单向链表 ---- C++使用类模板实现