在炒股过程中我们经常听到均线(MA) 5日 10日 月线 半年线 等等
均线MA(moving average) 通常是值股票的收盘价的多日平均价。

以5日均线为例,0为回测日 为了防止未来数据,我们取前五日的收盘价价求均值
某股票的前5日价格为 10 10.5 11 10.5 10 那么它在第0日的五日均价就为10.5.
普遍的方法有:移动平均法 指数移动平均法 加权移动平均法 等。
如 :方法一 : 当股价上穿X日均线时 买入
当股价下穿X日均线时 卖出
方法二 : 当股价X日均线 上穿Y日均线时 买入
当 股价X日捐献 下穿Y日均线时 卖出


如图中所示 白线为MA5 黄线为MA10 在第一块红色部分 MA5上穿MA10 并在第三红色部分MA5才下穿MA10,收取到了巨大的涨幅。
下面我们来做一下代码讲解。第一部分 预备工作 我在这以002397的股票为例子。回测一下 是持股不动的收益比较高 还是采用策略的收益比较高
import talib as taimport pandas as pdimport numpy as npstart = '2017-01-01' # 回测起始时间end = '2018-01-01' # 回测结束时间universe = ['002397.XSHE'] # 以 002397为例 证券池,支持股票、基金、期货、指数四种资产benchmark = '002397.XSHE' # 策略参考标准freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
第二部分 配置账户信息
# 配置账户信息,支持多资产多账户accounts = {'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)}def initialize(context):context.short_term = 5 #参数 5日context.long_term = 20 #参数 10 20日等context.window = 30 #滑动窗孔 > 5+20
第三部分 执行操作
def handle_data(context):# 获取账户信息和股票信息account = context.get_account('fantasy_account')universe = context.get_universe()# 获取股票全部数据data = context.history(universe, time_range=context.window, attribute='closePrice', freq='d', style='sat',retype='frame ')# 股票数据包含很多 收盘价 换手率 量比 PE PB等 我们只需要它的收盘价close_price = np.array(data[universe[0]]['closePrice'])log.info(close_price)# 调用ralib 计算均线数据 5日均线 和15日平均线short_ma = ta.MA(close_price, context.short_term)long_ma = ta.MA(close_price, context.long_term)log.info(data)# 获得持仓信息position = account.get_position(universe[0])# 检测是否有持仓# 5日均线上穿20日均线 没持仓 买入if not position:if(short_ma[-2] < long_ma[-2]) and (short_ma[-1] > long_ma[-1]):account.order_pct_to(universe[0], 1)# 5日均线下穿20日均线 有持仓 ,卖出else:if (short_ma[-2] > long_ma[-2]) and (short_ma[-1] < long_ma[-1]):account.order_pct_to(universe[0], 0)


这是我跑了一下回测,蓝色线为移动均线策略的收益。黑色线benchmark为持股不动的收益。看到操作的收益时略高于持股不动的收益。
我们看到 还有一些夏普率 贝塔 回撤等数据 后面再讲解
文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




