求一个针对dateframe的函数定义及调用范例!


(189) #1

我发现在处理历史数据dateframe中,难免会生成新的seriers,在生成过程中,又难免在原来的dateframe中引用不止一个的series进行运算,在引用过程中,还不是完全的以axis=1的横向引用来运算,比如其中引用了df的close一列的close.shift(1);
如果我们引用了三四个 series的值来运算,就等于定义的def ***函数有多参数,最后返回新生成的一个或几个series

我的难题在于两处:第一是def的格式问题,包括return什么??第二是 在引用处理过程中,怎样groupby和apply的格式才算完整求出新的一个或几个series???

我实在是在网上找不到合适的例子,请大神不吝赐教!多谢!


(iQuant) #2

描述地不是特别清晰,可以举个实际例子吗?


(189) #3

举个简单例子,我有50成分股数据,以及收盘价计算出的10日20日30日均线数据,求股价分别向上突破这三条均线的时点距离当前交易日的天数,比如股价是5天前突破了10日线,突破天数就是5,其它突破20日线及30日线的天数一般都不同,我求这新生成的三列数据,增加到原来的df里面


(hugo) #4

参考一下这个:测试一个EMA的索引添加过程出错,请教!
还有这个:
[量化学堂-策略开发]多头排列回踩买入策略
大概就是用groupby.apply这个来做


(189) #5

我还是拿实际的例子吧:
def g(x):return 1 if x.close> x.ma_10 else 0
df[‘sig_10ma’] = df.apply(g, axis=1)
这样的结果是我能求出新的列,只要股价收盘价高于10日线,值就是1,否则为0;axis=1我理解
但是,我下一步是增加一列,只选中股价突破10日线的时点,即df[‘sig_10ma’] 这列某个数值为1,它的前一天数值为0,视为一种向上突破的时点,这时我写出新的函数:
def t(x):return 1 if x.sig_10ma>x.sig_10ma.shift(1) else 0
df[‘sig_10t’] = df.apply(t)
结果运行下去就是错的;
本来我计划老老实实一步一步继续下去,接着计算这个最近的向上突破时点距离今天的时间差值,比如前天突破,那么差值就是2,类推;因为出错进行不下去,怀疑是shift 函数不支持这样的做法;于是我将函数改写成迭代for循环,df[‘sig_10ma’] 逐个值去遍历和同一列前一个值去判断(取代shift),最后也是错的
实在不解
因为用通达信很简单就一句:BARSLAST(CLOSE>MA(CLOSE,10))
而我用python 写一堆,还没发现错误到底在哪里
很郁闷


(hugo) #6

https://community.bigquant.com/t/请教如何写出股价突破均线的语句??/5164/3
这篇帖子不是有答案了么


(189) #7

已经解决多谢!