京东量化 context.in stock是什么意思思

量化进阶——量化交易策略之羊驼和均线策略
阅读原文:
京东金融官方资讯QQ群: 有什么想咨询的都可以来询问我们
相当于加了一个开关,站在40日均线上,就执行羊驼策略,否则,就空仓。
import random
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import scipy.stats as stats
import math
# 设置股票池,本程序中为所有沪深300的股票
stocks = get_index_stocks('000300.XSHG')
#求出股票池中有多少股票
num=len(stocks)
set_universe(stocks)
#设置benchmark,默认为沪深300
#set_benchmark('510050.XSHG')
#设置回测条件
set_commission(PerTrade(buy_cost=0.0008, sell_cost=0.0015, min_cost=5))
set_slippage(FixedSlippage(0))
#设置初始买入多少只股票
num_of_stocks=10
#设置每次更新时替换多少只股票
num_of_change=3
#设置计算几日收益率
#用一个列表来保存每天持有的股票代码
stockshold=[]
#判断参数输入是否符合条件,如果不符合,则重置为默认值
if num_of_stocks&num:
log.info('too large num_of_stocks')
num_of_stocks=10
elif num_of_change&num_of_stocks:
log.info('too large num_of_change')
num_of_change=1
security = '000300.XSHG'
#预处理数据,将没有数据的股票剔除,同时加入收益率
#构成一个列索引为股票名,收益率一行的索引为
#'return'的dataframe,并返回这个dataframe
def process():
#取出每只股票period天的收盘价格
stocks_info=history(period,'1d','close')
#去除信息不全的数据
stocks_info.dropna(axis=0,how='any',thresh=None)
#取出昨天和period天之前的收盘价,计算收益率
a1=list(stocks_info.iloc[0])
a2=list(stocks_info.iloc[period-1])
a1=np.array(a1)
a2=np.array(a2)
#用一个dataframe来保存所有股票的收益率信息
stocks_return=DataFrame(a2/a1,columns=['return'],index=stocks_info.columns)
stocks_info=stocks_info.T
#把收益率的数据加到相应的列
stocks_info=pd.concat([stocks_info,stocks_return],axis=1)
#将股票信息按照收益率从大到小来存储
stocks_info=stocks_info.sort(columns=['return'],ascending=[False])
#返回处理好的dataframe
return stocks_info#股票入池
def BuyStocks(stocks_info,cash):
#计算现在持有的股票数
current_num=len(stockshold)
stocks_info=stocks_info.T
#将已持有的股票从股票池中剔除
for i in range(0,current_num):
if stockshold[i] in stocks_info.columns:
del stocks_info[stockshold[i]]
stocks_info=stocks_info.T
#计算在每只股票上可以支付的现金
cash=cash/num_of_stocks-current_num
for i in range(0,num_of_stocks-current_num):
#取得股票当前的价格
current_price=stocks_info['current_price'][i]
#判断是否有价格数据
if math.isnan(current_price)==False:
#计算可以每只股票可以购买的数量
num_of_shares=int(cash/current_price)
if num_of_shares&0:
order(stocks_info.index[i],+num_of_shares)
log.info('buying %s' %(stocks_info.index[i]))
#将购买的股票代码加到stockhold中
stockshold.append(stocks_info.index[i])
def SellStocks(stocks_info,num_of_change):
stocks_hold=DataFrame()
current_num=len(stockshold)
'log.info('here' % (current_num))'
#用一个dataframe来保存持有的股票的信息
for i in range(0,current_num):
stocks_hold=pd.concat([stocks_hold,stocks_info.loc[stockshold[i]]],axis=1)
stocks_hold=stocks_hold.T
#在持有的股票数不为0时,将持有的股票信息按照收益率大小从小到大排序
if current_num&0:
stocks_hold=stocks_hold.sort(columns=['return'])
#把收益率最低的股票卖空
for k in range(0,min(num_of_change,current_num)):
log.info(num_of_change)
#判断是否停牌
if stocks_hold['paused'][k]=='False':
order_target(stocks_hold.index[k],0)
log.info('Selling %s' % (stocks_hold.index[k]))
#在stockshold中去除已经卖空的股票的信息
stockshold.remove(stocks_hold.index[k])
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
stocks_info=process()
stocks_num=len(stocks_info.index)
#用一个列表来保存所有股票是否停牌的信息
for i in range(0,stocks_num):
if data[stocks_info.index[i]].paused==True:
pause.append('True')
pause.append('False')
#将列表转换成dataframe以便加入到stocks_info中
paused=DataFrame(pause,columns=['paused'],index=stocks_info.index)
stocks_info=pd.concat([stocks_info,paused],axis=1)
#用一个列表来保存所有股票当前的价格信息
currentprice=[]
for i in range(0,stocks_num):
currentprice.append(data[stocks_info.index[i]].price)
current_price=DataFrame(currentprice,columns=['current_price'],index=stocks_info.index)
#将股票是否停牌,当前价格的信息添加到stocks_info中
stocks_info=pd.concat([stocks_info,current_price],axis=1)
#取得当前现金
cash=context.portfolio.cash
#判断MA的条件
close_price =history(num_MA,'1d', 'close', ['000300.XSHG'])
Closemean=close_price[security].mean()
# 取得当前价格
Current_close = close_price.iloc[-1,-1]
log.info('close %s' % (Current_close))
log.info('mean %s' % Closemean)
if Current_close & Closemean:
#执行卖出股票的函数
SellStocks(stocks_info,3)
#执行买入股票的函数
BuyStocks(stocks_info,cash)
elif Current_close &&
SellStocks(stocks_info,10)
阅读原文:
没有更多推荐了,京东为什么要做量化平台业务?各大量化平台未来可能有怎样的发展_百度知道
京东为什么要做量化平台业务?各大量化平台未来可能有怎样的发展
我有更好的答案
量化交易平台的功能一般包含三大块:研究、模拟、实盘。转化到技术层面为:数据、回测、实盘、安全等等。基于国内市场,我们遇到的挑战如下:1:数据数据包含两类,一类是行情数据,一类是财务、基本面、舆情、研报等其他数据。行情数据:目前市面上分钟级的数据比较精准,可以用于中低频的交易回测;历史、实盘TICK级的Level-1、Level-2数据需要自己找渠道去获得,较容易找到的渠道很容易出现漏数据、不精确等情况,需要工程师专门结合了多家数据源进行核对修复。2:回测回测最难的在于如何确定成交量,同时要考虑复权、停牌、ST*等问题,这里面有很多细节3:安全安全在交易平台的开发中是重中之重,如何保证策略的安全性,不被外部、内部人员所窃取,分为2部分。一部分是WEB安全,一部分是策略的编译安全。因为量化交易平台是用户可编程的,我们京东量化选用的是PYTHON语言,因为有强大的科学计算库和高性能,导致用户可以调用很多系统级API,在这上面我们下了很大的功夫来保证用户的策略安全,做到理论级的策略隔离。只能大概讲一下,这里面每一个部分都可以延伸出来成为一个话题。
采纳率:63%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。京东量化平台初始化设置
init(context)
初始化函数,用来设置初始化配置,如滑点,交易费等。此函数返回None。
Python对象
初始化设置存储在该参数中,可以自定义属性,具体属性可查看Context对象
def init(context):
# context对象设置如下
#设置选择的股票
context.stock
= "000001.SZ"
#不使用滑点默认值2‰,手动设置滑点为5‰
context.set_slippage(0.005)
#不使用交易费默认值0.25‰,手动设置交易费比例为0.6‰,需注意参数值值为0.0006
context.set_commission(0.0006)
#将基准从默认的沪深300改为中国银行
context.set_benchmark("601988.SH")
没有更多推荐了,京东量化教你如何用简单的策略回测盈利
阅读原文:
今天来教大家使用量化平台中Python的部分,完成一个简单的策略回测。
首先,回测界面是长这个样子的
可以看到,左半边的大部分区域是编辑代码的地方,开发环境会自动识别Python语言的关键词。在代码区上面的设置标志里面可以个性化调节开发环境的视觉效果。
Python的回测代码主要包括init()函数,handle_data()函数,以及其他用户自定义内容。如果在每天开盘前要进行额外的处理或计算,可选择添加before_trade()函数。
def init(context):
# 这里用来写策略开始时要做什么
def before_trade(context):
# 非强制,在这里写每天开盘之前要做什么,不可下单
def handle_data(context, data_dict):
# 这里用来写每天开盘后要做什么,可以是计算,输出日志,或者下单
其中,init()是初始化函数,可以设置基准,滑点,佣金等回测参数,也可以利用context自定义变量。在Python及大部分其他编程语言中,在局部变量只在该变量定义的函数体有效,在其他函数体内是无效的。而context被定义为一个局部变量,可以把内容在不同函数代码之间传导。该函数在回测开始时运行一次。
handle_data()是每个交易时间点(分钟/日)时自动运行一次的函数,可以在此函数内设置交易判断和下单,是策略核心逻辑所在。
用户可以按照Python语言规则定义其他函数,包括运算/数据处理函数,也可以通过task()函数设置自定义函数的执行频率和执行时间。
接下来,我们用一个简单的策略来演示这个过程。我们策略的内容是对平安银行(000001.SZ)进行择时,如果前一天收益率大于中证全指收益率,则买入持仓,反之则不持仓。
首先,我们在init()函数里面设置我们的股票和比较的标的:
# init方法是您的初始化逻辑。context对象可以在任何方法之间传递。
def init(context):
context.stock = '000001.SZ'
context.set_benchmark = '000985.SH'
其中,只要在“#”后面的内容都是注释,不会被Python编译。设置stock和set_benchmark对象时,一定要在前面加上“context.”,这样才能传递到之后的函数中。设置标的后,回测中的基准曲线和收益将采用设置的指数。
然后我们来编辑每个交易日的逻辑:
# 日或分钟或实时数据更新,将会调用这个方法
def handle_data(context, data_dict):
price = get_history(2, '1d', 'close')[context.stock]
priceBm = get_history(2, '1d', 'close')[context.set_benchmark]
这部分代码获取了目标股票和标的的历史价格,其中context.stock和context.set_benchmark都在init()函数中定义好了。get_history()函数是京东量化平台封装的取历史交易数据的函数。其中“2”代表要取历史两天的数据,以便计算上个交易日的收益。“’1d’”和“'close’”分别表示数据频率为天,所需数据为收盘价。返回的价格为pandas.Series类型。各个平台函数的使用方法可以查看帮助板块中的API文档。
为了方便计算收益率,我自定义了一个CalRet()函数,输入连续两天的价格,计算第二天的收益率:
def CalRet(price):
r = (price[1] - price[0]) / price[0]
这段函数写在handle_data()之前。自定义函数编辑的语法符合Python语法即可。这个函数会返回float类型的r。
我们回到handle_data()函数,利用刚刚定义的函数和获取的股票及指数价格计算收益率:
ytdRet = CalRet(price)
bmRet = CalRet(priceBm)
可以得到上个交易日股票的收益率ytdRet和指数收益率bmRet。之后我们进行判断,如果ytdRet大于bmRet,则全仓买入平安银行股票,否则清仓。
if ytdRet & bmRet:
order_target_percent(context.stock, 1)
order_target_percent(context.stock, 0)
order_target_percent()是量化平台编辑的下单函数,可以设置某个股票的仓位至一个百分比。平台同样支持加减仓,用手数,金额等方式下单,详见API文档。
现在,我们就完成了这个策略的设计。回测平台会自动按照这个逻辑,在回测区间内完成交易。
我们设置回测区间为今年,初始金额为一百万,调仓频率为每天,点击“运行回测”。结果如下:
我们可以看到在回测区间内,策略和基准的净值曲线,每天盈亏,买卖等图像,以及回测的技术指标。同时可以查看相对收益,对数收益等。我们可以看到,这个策略没有能够跑赢大盘。当然,这只是一个例子。
在左边的交易详情,持仓和输出日志中可以看到回测中的具体情况,方便进行归因分析,调整策略等等,同时还可以查看历史回测记录。
这样我们就成功完成了整个回测过程。更详细的函数使用方法和平台功能,请参加平台的帮助板块。
阅读原文:
没有更多推荐了,京东量化多策略混合,实现4月超额相对收益
阅读原文:
京东金融官方资讯QQ群: 有什么想咨询的都可以来询问我们
一个策略写不够?
大家可以把自己多个不相关策略混合起来看整体收益
从选股池,核心策略判断,持仓日期,止盈止损,策略个性化参数,以及买卖点的设置,各自互相独立,方便测试和修改。
Select函数是策略核心,每个策略都可以有自己独自的止盈止损,也可以改为动态止盈止损,比如随时间不同、大盘涨幅不同而有不同的止盈止损,具体可以根据需要设置更改全局变量即可。
后续可以针对每个策略的函数进行修改逻辑参数即可,也可以加入仓位控制,为了方便大家修改,第一版是只买一手,之所以收益回撤都低是因为资金量设置的大,其实用不了那么多资金。
1.0不涉及仓位控制,简单买一点试水
这可是4月底,创熔断价更低
保稳能力还是不错的
因为时间过长被中断,只能采取300小市值,60个股票的小市值,大市值股票池进行分析。
可以看到每个策略都是有止盈的(排除了58分低止盈0.01)
因为股票池和策略基础都用的最简化模型,为了减少时间可以通过运行,具体的仓位控制还有待完善。
阅读原文:
没有更多推荐了,

我要回帖

更多关于 修复context什么意思 的文章

 

随机推荐