1.1策略介绍
KDJ指标又叫随机指标,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。
随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。
KDJ计算过程
KDJ的计算比较复杂,首先要计算周期(n日、n周等)的RSV值,即未成熟随机指标值,然后再计算K值、D值、J值等。以n日KDJ数值的计算为例,其计算公式为:
n日RSV=(Cn-Ln)/(Hn-Ln)×100
公式中,Cn为第n日收盘价;Ln为n日内的最低价;Hn为n日内的最高价。
其次,计算K值与D值:
当日K值=2/3×前一日K值+1/3×当日RSV
当日D值=2/3×前一日D值+1/3×当日K值
若无前一日K 值与D值,则可分别用50来代替。
J值=3*当日K值-2*当日D值
以9日为周期的KD线为例,即未成熟随机值,计算公式为
9日RSV=(C-L9)÷(H9-L9)×100
公式中,C为第9日的收盘价;L9为9日内的最低价;H9为9日内的最高价。
K值=2/3×第8日K值+1/3×第9日RSV
D值=2/3×第8日D值+1/3×第9日K值
J值=3*第9日K值-2*第9日D值
若无前一日K
值与D值,则可以分别用50代替
1.2 策略逻辑:
1.K线是快速确认线——数值在80以上为超买,卖出信号;数值在10以下为超卖,买入信号
2.D线是慢速主干线——数值在80以上为超买,卖出信号;数值在10以下为超卖,买入信号
2.策略代码
2.1配置文件【kdj_stock.ini】(提示ini配置文件,需要保存成UTF8格式)
- [strategy]
- username=
- password=
- ;回测模式
- mode=4
- td_addr=localhost:8001
- strategy_id=
- ;订阅代码注意及时更新
- subscribe_symbols=
- [backtest]
- start_time=2017-01-01 09:00:00
- end_time=2017-07-18 15:00:00
- ;策略初始资金
- initial_cash=1000000
- ;委托量成交比率,默认=1(每个委托100%成交)
- transaction_ratio=1
- ;手续费率,默认=0(不计算手续费)
- commission_ratio=0.0003
- ;滑点比率,默认=0(无滑点)
- slippage_ratio=0
- ;行情复权模式,0=不复权,1=前复权
- price_type=1
- ;基准
- bench_symbol=SHSE.000903
- [para]
- ;数据订阅周期
- bar_type=86400
- ;kd指标参数
- fastk_period=5
- slowk_period=3
- slowk_matype=0
- slowd_period=3
- slowd_matype=0
- ;kd指标超买、超卖参数
- slowk_bid=25
- slowk_sell=75
- slowd_bid=25
- slowd_sell=75
- #止盈止损
- ;是否固定止盈止损
- is_fixation_stop=0
- ;是否移动止盈
- is_movement_stop=1
- ;移动盈利开始比率及固定盈利比率
- stop_fixation_profit=0.20
- ;亏损比率
- stop_fixation_loss=0.068
- ;移动止盈比率
- stop_movement_profit=0.068
- ;累计开仓距离当前的最大交易日
- ;若开仓距今超过这个日期,则认为未开过仓
- open_max_days=22
- ;历史数据长度
- hist_size=30
- ;开仓量
- open_vol=2000
- ##############################################################
- # logger settings
- ##############################################################
- [loggers]
- keys=root
- [logger_root]
- level=INFO
- handlers=console,file
- [handlers]
- keys=console,file
- [handler_file]
- class=handlers.RotatingFileHandler
- args=('kdj_stock.log','a',1000,5)
- formatter=simple
- [handler_console]
- class=StreamHandler
- args = (sys.stdout,)
- formatter=simple
- [formatters]
- keys = simple
- [formatter_simple]
- format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
- datefmt=
2.2策略文件【kdj_stock.py】(代码过长无法上传,具体见证经社——
http://***/q/forum.php?mod=viewthread&tid=73&extra=page%3D1)
3.代码涉及的函数代码
3.1 python函数及package
功能 | 函数原型 | 参数 | 返回值 | ||
参数名 | 含义 | ||||
sys | 提供了一系列有关Python运行环境的变量和函数。 | ||||
sys.argv[0] | 当前程序名 | ||||
sys.argv | 获取当前正在执行的命令行参数的参数列表(list)。 | sys.argv | sys.argv[1] | 第一个参数 | |
sys.argv[2] | 第二个参数 | ||||
arrow | 标准的时间日期库。 | ||||
ta-lib | 被广泛应用的金融市场数据分析的库 | ||||
pandas | Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的 | ||||
numpy | 一套用于支持科学计算的python第三方库 | ||||
time | 返回当前时间的时间戳 | time.time() | 返回当前时间的时间戳 | ||
len | 返回对象(字符、列表、元组等)长度或项目个数。 | len(s) | s | 对象 | 返回对象长度。 |
append | 用于在列表末尾添加新的对象。 | list.append(obj) | obj | 添加到列表末尾的对象。 | 该方法无返回值,但是会修改原来的列表。 |
3.2掘金接口函数
功能 | 函数原型 | 参数 | 返回值 | |||
参数名 | 类型 | 说明 | ||||
on_bar | 响应Bar事件,收到Bar数据后本函数被调用。 | on_bar(bar) | bar | bar | bar数据 | 无 |
open_long | 异步开多仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 | ||||
price | float | 委托价,如果price=0,为市价单,否则为限价单 | ||||
volume | float | 委托量 | ||||
close_long | 异步平多仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 | ||||
price | float | 委托价,如果price=0,为市价单,否则为限价单 | ||||
volume | float | 平仓量 | ||||
open_short | 异步开空仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_short(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 | ||||
price | float | 委托价,如果price=0,为市价单,否则为限价单 | ||||
volume | float | 委托量 | ||||
close_short | 异步平空仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 | ||||
price | float | 委托价,如果price=0,为市价单,否则为限价单 | ||||
volume | float | 平仓量 | ||||
get_last_n_dailybars | 提取单个代码的最新n条DailyBar数据, 策略类和行情服务类都提供该接口。 | get_last_n_dailybars(symbol, n, end_time='') | symbol | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000 | Bar列表 |
n | int | 提取的数据条数 | ||||
end_time | string | 指定截止时间, 如2015-10-30 15:00:00 | ||||
get_dailybars | 提取指定时间段的历史Bar数据,支持单个代码提取或多个代码组合提取。策略类和行情服务类都提供该接口。 | get_dailybars(symbol_list, begin_time, end_time) | symbol_list | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000,同时支持多只代码 | DailyBar列表 |
begin_time | string | 开始日期, 如2015-10-19 | ||||
end_time | string | 结束日期, 如2015-10-30 | ||||
get_position | 查询当前策略指定symbol(由交易所代码和证券ID组成)和买卖方向的持仓信息。策略类和交易服务类都提供该接口。 | get_position(exchange, sec_id, side); | exchange | string | 交易所代码 | Position对象,持仓信息 |
sec_id | string | 证券代码 | ||||
side | int | 买卖方向 |