⽤python进⾏股票数据分析_⽤Python做股市数据分析(2)这篇博⽂是⽤Python分析股市数据系列两部中的第⼆部,内容基于我在阅读第⼀部分)。在这两篇博⽂中,我会讨论⼀些基础知识,包括⽐如如何⽤pandas从雅虎财经获得数据, 可视化股市数据,平均数指标的定义,设计移动平均交汇点分析移动平均线的⽅法,回溯测试和 基准分析法。这篇⽂章会讨论如何设计⽤移动平均交汇点分析移动平均线的系统,如何做回溯测试和基准分析,最后留有⼀些练习题以飨读者。
注意:本⽂仅代表作者本⼈的观点。⽂中的内容不应该被当做经济建议。我不对⽂中代码负责,取⽤者⾃⼰负责
交易策略
在特定的预期条件达成时⼀个开放头⼨会被关闭。多头头⼨表⽰交易中需要⾦融商品价格上升才能产⽣盈利,空头头⼨表⽰交易中需要⾦融商品价格下降才能产⽣盈利。在股票交易中,多头头⼨是⽜市,空头头⼨是熊市,反之则不成⽴。(股票期权交易中这个⾮常典型)
例如你在预计股价上涨的情况下购⼊股票,并计划在股票价格上涨⾼于购⼊价时抛出,这就是多头头⼨。就是说你持有⼀定的⾦融产品,如果它们价格上涨,你将会获利,并且没有上限;如果它们价格下降,你会亏损。由于股票价格不会为负,亏损是有限度的。相反的,如果你预计股价会下跌,就从交易公司借贷股票然后卖出,同时期待未来股票价格下降后再低价买⼊还贷来赚取差额,这就是空头
股票。如果股价下跌你会获利。空头头⼨的获利额度受股价所限(最佳情况就是股票变得⼀⽂不值,你不⽤花钱就能将它们买回来),⽽损失却没有下限,因为你有可能需要花很多钱才能买回股票。所以交换所只会在确定投资者有很好的经济基础的情况下才会让他们空头借贷股票。
所有股民都应该决定他在每⼀股上可以冒多⼤的风险。⽐如有⼈决定⽆论什么情况他都不会在某⼀次交易中投⼊总额的10%去冒险。同时在交易中,股民要有⼀个撤出策略,这是让股民退出头⼨的各种条件。股民也可以设置⼀个⽬标,这是导致股民退出头⼨的最⼩盈利额。同样的,股民也需要有⼀个他能承受的最⼤损失额度。当预计损失⼤于可承受额度时,股民应该退出头⼨以避免更⼤损失(这可以通过设置停⽌损失委托来避免未来的损失)。
我们要设计⼀个交易策略,它包含⽤于快速交易的交易激发信号、决定交易额度的规则和完整的退出策略。我们的⽬标是设计并评估该交易策略。
假设每次交易⾦额占总额的⽐例是固定的(10%)。同时设定在每⼀次交易中,如果损失超过了20%的交易值,我们就退出头⼨。现在我们要决定什么时候进⼊头⼨,什么时候退出以保证盈利。
这⾥我要演⽰移动平均交汇点分析移动平均线的⽅法。我会使⽤两条移动平均线,⼀条快速的,另⼀条是慢速的。我们的策略是:
当快速移动平均线和慢速移动线交汇时开始交易
当快速移动平均线和慢速移动线再次交汇时停⽌交易
做多是指在快速平均线上升到慢速平均线之上时开始交易,当快速平均线下降到慢速平均线之下时停⽌交易。卖空正好相反,它是指在快速平均线下降到慢速平均线之下时开始交易,快速平均线上升到慢速平均线之上时停⽌交易。
现在我们有⼀整套策略了。在使⽤它之前我们需要先做⼀下测试。回溯测试是⼀个常⽤的测试⽅法,它使⽤历史数据来看策略是否会盈利。例如这张苹果公司的股票价值图,如果20天的移动平均是快速线,50天的移动平均是慢速线,那么我们这个策略不是很挣钱,⾄少在你⼀直做多头头⼨的时候。
下⾯让我们来⾃动化回溯测试的过程。⾸先我们要识别什么时候20天平均线在50天之下,以及之上。
Python
1
2
apple['20d-50d']=apple['20d']-apple['50d']
apple.tail()
OpenHighLowCloseVolumeAdj Close20d50d200d20d-50d
Date
2016-08-26
107.410004
27766300 106.940002 107.87 101.51 102.73
6.36
2016-08-29 106.620003 107.440002 106.290001 106.820000 24970300 106.820000 107.91 101.74 102.68
6.17
2016-08-30 105.800003 106.500000 105.500000 106.000000 24863900 106.000000 107.98 101.96 102.63
6.02
2016-08-31 105.660004 106.570000
106.099998
108.00
102.16
102.60
5.84
2016-09-01
106.139999
106.800003
105.620003
106.730003
26643600
106.730003
108.04
102.39
102.56
5.65
我们将差异的符号称为状态转换。快速移动平均线在慢速移动平均线之上代表⽜市状态;相反则为熊市。以下的代码⽤于识别状态转换。
Python
1
2
3
4
5
# 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
apple["Regime"]=np.where(apple['20d-50d']>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"]
apple["Regime"]=np.where(apple['20d-50d']<0,-1,apple["Regime"])
apple.loc['2016-01-01':'2016-08-07',"Regime"].plot(ylim=(-2,2)).axhline(y=0,color="black",lw=2)
Python
apple["Regime"].plot(ylim=(-2,2)).axhline(y=0,color="black",lw=2)
python代码转换
Python
1
apple["Regime"].value_counts()
Python
1
2
3
4
1966
-1663
050
Name:Regime,dtype:int64
从上⾯的曲线可以看到有966天苹果公司的股票是⽜市,663天是熊市,有54天没有倾向性。(原⽂中⽜市和熊市说反了,译⽂中更正;原⽂数字跟代码结果对不上,译⽂按照代码结果更正)
交易信号出现在状态转换之时。⽜市出现时,买⼊信号被激活;⽜市完结时,卖出信号被激活。同样的,熊市出现时卖出信号被激活,熊市结束时,买⼊信号被激活。(只有在你空头股票,或者使⽤⼀些其他的⽅法例如⽤股票期权赌市场的时候这种情况才对你有利)
Python
1
2
3
4
5
6
7
# To ensure that all trades close out, I temporarily change the regime of the last row to 0
regime_orig=apple.ix[-1,"Regime"]
apple.ix[-1,"Regime"]=0
apple["Signal"]=np.sign(apple["Regime"]-apple["Regime"].shift(1))
# Restore original regime data
apple.ix[-1,"Regime"]=regime_orig
apple.tail()
OpenHighLowCloseVolumeAdj Close20d50d200d20d-50dRegimeSignal
2016-08-26 107.410004 107.949997 106.309998 106.940002 27766300 106.940002 107.87 101.51 102.73
6.36
1.0
0.0
2016-08-29 106.620003 107.440002 106.290001 106.820000 24970300 106.820000 107.91 101.74 102.68
6.17
1.0
0.0
2016-08-30 105.800003 106.500000 105.500000 106.000000 24863900 106.000000