'老太太炒股法', 一根均线打天下, 利用Python根据均线分析这一策略的可行性
- Python 3.x
- 安装所需库(详见文件头部)
- 运行
ma.py
id | param | type | mean | demo | necessary |
---|---|---|---|---|---|
1 | file_path_prefix |
str |
日线数据文件目录前缀 | 'H:\\sharesDatas\\kline\\' |
true |
2 | code |
int / str |
股票代码 | '000001' |
false |
3 | end_date |
str |
最早的日期(截止日期) | '2019-01-01' |
false |
4 | all_n |
Array |
要计算的几日ma 数组 | [5,10] |
false |
移动平均线,
Moving Average
,简称MA
,MA
是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA
,用以观察证券价格变动趋势的一种技术指标。
常见的均线有5日均线(MA5), 十日均线(MA10), 二十日均线(MA20), 三十日均线(MA30), 六十日均线(MA60)
在这里, 我的计算方法是简单地计算 n 日内的 收盘价 的算数平均值
基本思路如下:
- 定义要计算的几日(假设为n)均线数组, 进行遍历计算
- 迭代文件列表
- 打开某个文件, 选取 n 行, 计算这n行的
收盘价
总和 - 迭代
csv
文件的每一行, 每次迭代, 将上述收盘价的总和减去首行, 追加新的一行 - 计算
ma
并写入原文件
和我之前计算 cci
不同, 这里不再做多余的迭代, 以此能大大提高效率(cci
的计算:https://github.com/CatsJuice/stock-cci)
购买的策略较为简单, 收盘价低于均线即买入, 将收盘价作为买入价格(假设第二个交易日开盘即买入), 收盘价高于均线即卖出, 同样将收盘价作为卖出价格
'黄金交叉' 和 '死亡交叉' 的概念来自 日均线 的百度百科(https://baike.baidu.com/item/%E6%97%A5%E5%9D%87%E7%BA%BF/8784586?fr=aladdin)
1、”黄金交叉” 当10日均线由下往上穿越30日均线,形成10日均线在上,30日均线在下时,其交叉点就是黄金交叉,黄金交叉是多头的表现,出现黄金交叉后,后市会有一定的涨幅空间,这是进场的最佳时机。
2、”死亡交叉” 当10日均线由上往下穿越30日均线,形成30日均线在上,10日均线在下时,其交点称之为”死亡交叉”,”死亡交叉”预示空头市场来临,股市将下跌此时是出场的最佳时机。
对于'老太太选股法', 我分别测试了5日均线和10日均线(由于20日数据较大, 电脑处理太慢, 暂时不考虑), 最终得到的结果为:
ma5
的盈利几率为63.3132%
; 而 ma10
的盈利几率为67.0026%
以下是某次运行的截图:
运行结果中, 可以发现, 无论是盈利或是亏损, 金额基本都在1元以内, 可见这一策略 首先具有一定的科学性, 同时风险也不是很大, 但盈利金额较高的可能性很小;
对此, 我增加了结果判断, 统计亏损 / 盈利 超过 1 元的比例, 以下是结果:
对于 ma5
:
对于 ma10
:
对于 ma20
:
对于 ma30
:
对于 ma60
:
从更详细的结果可以看到, 无论盈利或亏损, 超过 1 元的概率都不大, 但是亏损的时候超过 1 元的概率比盈利大; 更有趣的是, 当 ma的计算天数越多, 盈利的几率越大, 由于一般看盘软件中仅提供了上述这些均线(MA5
, MA10
, MA20
, MA30
, MA60
), 所以这里不再多更高的天数进行测试; 虽然天数越大时, 盈利几率越高, 但是从更细节数据可以看到, 盈利的情况大于1元的概率始终在 10% ~ 15%
, 而亏损时超过 1 元的概率却表现出和天数正相关的趋势, 并且从 24%
跳跃到高达 50%
运行结果如图:
对于这个结果的确是非常出乎意料, 这个盈利率低得感觉好像可以作为一个反向指标使用;
对于这个结果, 首先应该怀疑是自己的代码逻辑出现了问题, 于是我检查了关键代码如下:
# 前一天 ma30 > ma10 , 今天ma10 >= ma30
if prev_row is not None and prev_row['ma30'] > prev_row['ma10'] and row['ma10'] >= row['ma30']:
# 买入
...
...
# 前一天 ma30 < ma10 , 今天ma10 <= ma30
if prev_row['ma30'] < prev_row['ma10'] and row['ma10'] <= row['ma30']:
# 卖出
关键代码部分好像并没有什么逻辑问题, 但是不排除其他部分出现问题, 由于这个指标的预期过于不符, 我试着尝试了交换 '黄金交叉'和'死亡交叉', 修改上述关键代码如下(其实就是把所有大小判断符号反置):
# 前一天 ma30 < ma10 , 今天ma10 <= ma30
if prev_row is not None and prev_row['ma30'] < prev_row['ma10'] and row['ma10'] <= row['ma30']:
# 买入
...
...
# 前一天 ma30 > ma10 , 今天ma10 >= ma30
if prev_row['ma30'] > prev_row['ma10'] and row['ma10'] >= row['ma30']:
# 卖出
以下为运行结果:
这时候盈利率可以说是马马虎虎还算过得去了, 但是盈利率却还是不如 ‘老太太选股法’