Morningstar 发布于2016-07-04
回复 15
浏览 17516
108
写了3个常用平均数函数,可以用来计算各种指标,比对过通达信,同花顺的值结果一样(排除平台数据复权值有问题的时候,此时会有点出入)
ps:发现社区里对平均值计算函数都不太友好,所以分享给大家
```
# 简单算术移动平均
def MA(vals):
ret = 0
for x in vals:
ret = ret + x
return ret / len(vals)
# 加权移动平均
# 同花顺和通达信等软件中的SMA
#
# 算法
# Y = (X*M + Y'*(N-M)) / N
# 2种实现,结果相同
# 注:使用SMA函数,历史数据越多越准确,EMA同
def SMA(vals, n, m) :
# 算法1
return reduce(lambda x, y: ((n - m) * x + y * m) / n, vals)
'''
ret = vals[0]
for x in vals:
ret = (x * m + ret * (n - m)) / n
return ret
'''
# 指数平滑移动平均
#
# 算法
# Y = (X*2 + Y'*(N-1)) / (N+1)
#
# 或者 EMA(X, N) = SMA(X, N+1, 2)
def EMA(vals, n):
return SMA(vals, n+1, 2)
'''
ret = vals[0]
for x in vals:
ret = (x * 2 + ret * (n - 1)) / (n + 1)
return ret
'''
```
用法示例
```
#coding=utf-8
# 晴雨线指标处理
#
# 通达信公式
# X1:=(C+L+H)/3;
# X2:=EMA(X1,6),COLORWHITE;
# X3:=EMA(X2,5),COLORYELLOW;
# 用到回测API请加入下面的语句
from kuanke.user_space_api import *
from basealgo import *
def draw_shine_rain(security):
last_shine = get_shine_line(security, 1)
log.info("last_shine: %f", last_shine[0])
record(last_shine = last_shine[0])
last_rain = get_rain_line(security, 1)
log.info("last_rain: %f", last_rain[0])
record(last_rain = last_rain[0])
# 获取前n天的晴雨线的晴线指标(不含当天)
# n 表示天数
# 注:[-1]表示前一个交易日的数据
def get_shine_line(stock, n):
h = attribute_history(stock, 20 + n, '1d', ('close', 'high', 'low'), df = False)
close = h['close']
high = h['high']
low = h['low']
shine_line = []
for i in range(n):
j = n - i - 1
value = (EMA(close[:-j], 6) + EMA(high[:-j], 6) + EMA(low[:-j], 6)) / 3 if j != 0 \
else (EMA(close, 6) + EMA(high, 6) + EMA(low, 6)) / 3
shine_line.append(value)
return shine_line
# 获取前n天的晴雨线指标的雨线指标(不含当天)
# n 表示天数
# 注:[-1]表示前一个交易日的数据
def get_rain_line(stock, n):
shine_line = get_shine_line(stock, 60 + n);
rain_line = []
for i in range(n):
j = n - i - 1
value = EMA(shine_line[:-j], 5) if j != 0 else EMA(shine_line, 5)
rain_line.append(value)
return rain_line
```
评论
@Morningstar
您好. python味儿十足, 多谢分享. 请问一下: 下面MA函数里的ret变量没有赋初值就直接使用, python是如何处理初值的(默认的处理方式), 想要显示声明一下该如何办呢, 比如ret=0, 是吗?
```
def MA(vals):
ret=0
for x in vals:
ret = ret + x
return ret / len(vals)
```
2016-07-05
@duanqs 谢指正,这是个bug,MA没测过,因为平常用的都是一些对象自带的取平均值函数,已经修正,SMA,EMA测试过
2016-07-05
学习, python 功力不错
2016-07-10
请问下,我看了你的那个代码 28指数轮动的那个。我有个好奇的地方是,指数2和指数8的20日涨幅都小于0.01,则清仓,其中有一个的20日涨幅大于0.01则调仓买入?这个是主题思路是吗?
2017-02-17
通达信5分钟数据和聚宽提供的不一致,结果也不一样了
2017-03-14
大兄弟,你也是morningstar的?
2021-10-07
reduce没有被定义,这个需要调用什么库文件么?
2023-03-28