Python 实践 | JD Stock-股价数据分析02

还是用昨晚的数据集,今天说一下移动平均以及用Python实现一个简易的股票交易策略。

640?wx_fmt=gif


640?wx_fmt=gif

K线图上画移动平均线


移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。(更多的知识请自行百度)


一个q天的移动平均值(用640?wx_fmt=png来表示)定义为:对于某一个时间点t,它之前q天的平均值。640?wx_fmt=png


移动平均值可以让一个系列的数据变得更平滑,有助于我们找到趋势。q值越大,移动平均对短期的波动越不敏感。移动平均的基本目的就是从噪音中识别趋势。快速的移动平均有偏小的q,它们更接近股票价格;而慢速的移动平均有较大的q值,这使得它们对波动不敏感从而更加稳定。


我们画一下17年9月至今的股价走势图的5天、10天、20天和50天的移动平均线。

stock["ma5"] = np.round(stock["Close"].rolling(window = 5, center = False).mean(), 2)

stock["ma10"] = np.round(stock["Close"].rolling(window = 10, center = False).mean(), 2)

stock["ma20"] = np.round(stock["Close"].rolling(window = 20, center = False).mean(), 2)

stock["ma50"] = np.round(stock["Close"].rolling(window = 50, center = False).mean(), 2)

pandas_candlestick_ohlc(stock.loc['2017-09-01':'2018-03-01',:], otherseries = ["ma5", "ma10", "ma20","m50"])

640?wx_fmt=png

可以看出移动平均线就画好了,下面我们来用它来设计和测试交易策略。



640?wx_fmt=gif

基于移动平均交汇点分析的交易策略


我们要设计一个交易策略,它包含用于快速交易的交易激发信号、决定交易额度的规则和完整的退出策略。我们的目标是设计并评估该交易策略。假设每次交易金额占总额的比例是固定的(10%)。同时设定在每一次交易中,如果损失超过了20%的交易值,我们就退出头寸。现在我们要决定什么时候进入头寸,什么时候退出以保证盈利。


使用两条移动平均线,一条快速的,另一条是慢速的。我们的策略是:(需要做多与卖空操作,国内股市估计不适用)

  • 当快速移动平均线和慢速移动线交汇时开始交易

  • 当快速移动平均线和慢速移动线再次交汇时停止交易

做多是指在快速平均线上升到慢速平均线之上时开始交易,当快速平均线下降到慢速平均线之下时停止交易。卖空正好相反,它是指在快速平均线下降到慢速平均线之下时开始交易,快速平均线上升到慢速平均线之上时停止交易。


现在我们有一整套策略了。在使用它之前我们需要先做一下测试。回溯测试是一个常用的测试方法,它使用历史数据来看策略是否会盈利。



自动化回溯测试

1)识别什么时候20天平均线在50天之下,以及之上

stock1=stock.loc['2015-01-01':'2018-03-01',:] #取得15年之后的数据

stock1.head()

stock1['ma20-ma50'] =stock1['ma20'] -stock1['ma50']

stock1.tail()

640?wx_fmt=png


2)识别状态转换

我们将差异的符号称为状态转换。快速移动平均线在慢速移动平均线之上代表牛市状态;相反则为熊市。

# np.where() is a vectorized if-else function, where a condition is checked for each component of a vector, and the first argument passed is used when the condition holds, and the other passed if it does not

stock1["Regime"] = np.where(stock1['ma20-ma50'] > 0, 1, 0)

# We have 1's for bullish regimes and 0's for everything else. Below I replace bearish regimes's values with -1, and to maintain the rest of the vector, the second argument is apple["Regime"]

stock1["Regime"] = np.where(stock1['ma20-ma50'] < 0, -1, stock1["Regime"])

stock1["Regime"].plot(ylim = (-2,2)).axhline(y = 0, color = "black", lw = 2)

640?wx_fmt=png

stock1["Regime"].value_counts()

640?wx_fmt=png

从上面的曲线可以看到有518天京东的股票是牛市,274天是熊市,有2天没有倾向性


交易信号出现在状态转换之时。牛市出现时,买入信号被激活;牛市完结时,卖出信号被激活。同样的,熊市出现时卖出信号被激活,熊市结束时,买入信号被激活。(只有在你空头股票,或者使用一些其他的方法例如用股票期权赌市场的时候这种情况才对你有利)

640?wx_fmt=png


3)识别买卖点

# To ensure that all trades close out, I temporarily change the regime of the last row to 0

regime_orig = stock1.ix[-1, "Regime"]

stock1.ix[-1, "Regime"] = 0

stock1["Signal"] = np.sign(stock1["Regime"] - stock1["Regime"].shift(1))

# Restore original regime data

stock1.ix[-1, "Regime"] = regime_orig

stock1.tail()

640?wx_fmt=png


我们来看一下全部的信号。

stock1["Signal"].plot(ylim =(-2, 2))

640?wx_fmt=png


stock1["Signal"].value_counts()

640?wx_fmt=png

根据交易策略,15年至今,我们会买入京东的股票8次,抛出8次,777次处于观望状态



今晚先写这些吧,明天再写一下这16次交易的成交价格及分析是否实现盈利,下次再会!

640?wx_fmt=png

PS:上述主要内容来自于伯乐在线 - 小米云豆粥的文章及代码改编。



 
 

—End—


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值