文章目录
- 前言
- 准备
- python代码
- 总结
前言
本研究旨在探讨 A 股市场的均线理论及波动性变化情况。在研究中,我们使用了历史股价数据,并基于这些数据计算了不同时间段的简单移动平均线和指数移动平均线。
我们的结果表明,A 股市场的均线理论较为成立,即长期均线对价格走势具有较好的预测作用。同时,我们也发现,A 股市场的波动性变化较大且不稳定,需要考虑多种因素来进行有效的风险管理。
具体来说,我们发现,在不同时期,简单移动平均线和指数移动平均线的预测能力有所不同。在市场比较平稳的时期,长期简单移动平均线的预测能力较强;而在市场波动较大的时期,则更应该关注短期指数移动平均线的预测能力。此外,我们还注意到,市场中存在着一些异常波动和价格暴涨暴跌的情况,需要对这些风险进行有效的管理和控制。
准备
参考资料:
1.A 股市场均线理论及波动性变化的实证研究
2.python==python38
- 查询dqnapi接口域名:http://www.dqnapi.com/
pro.stock_basic dqnapi号:100.3568/2023.1_v1
pro.daily dqnapi号:100.3568/2023.11_v1
python代码
import tushare as ts
import pandas as pd
from time import sleep# 获取 Tushare 账户 TOKEN
pro = ts.pro_api(token='官方获取')# 获取股票列表并遍历所有股票
stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
result_list = []
count = 0 # 计数器,记录已经访问接口的次数
for i in range(len(stock_list)):ts_code = stock_list['ts_code'][i]print('Processing stock:', ts_code)count += 1if count >= 800:sleep(60)count = 0# 获取股票数据df = pro.daily(ts_code=ts_code, start_date='20230101', end_date='20230614')# 计算均线df['ma10'] = df['close'].rolling(10).mean()df['ma20'] = df['close'].rolling(20).mean()# 初始化变量position = Nonebuy_price = 0sell_price = 0capital = 10000hands = 0fee = 0.0015# 判断金叉和死叉并进行交易for i in range(20, len(df)):# 判断是否金叉if df['ma10'][i] > df['ma20'][i] and df['ma10'][i-1] <= df['ma20'][i-1]:# 判断前两日波动情况if (df['close'][i-1] - df['close'][i-2]) / df['close'][i-2] >= 0.02:# 记录交易信息并买入hands = int(capital / (df['close'][i] * 100)) # 计算买入手数buy_price = df['close'][i] + fee # 买入价为当日收盘价加上手续费capital -= hands * buy_price * 100 # 计算剩余资本position = 'long'print(df['trade_date'][i], 'buy', hands, 'hands')# 判断是否死叉elif df['ma10'][i] < df['ma20'][i] and df['ma10'][i-1] >= df['ma20'][i-1]:# 判断前两日波动情况if (df['close'][i-1] - df['close'][i-2]) / df['close'][i-2] >= 0.02:# 记录交易信息并卖出sell_price = df['close'][i] - fee # 卖出价为当日收盘价减去手续费capital += hands * sell_price * 100 # 计算剩余资本hands = 0position = Noneprint(df['trade_date'][i], 'sell', hands, 'hands')# 计算收益率if position != 'long':continuetrade_days = len(df[df['trade_date']>=df.iloc[-1]['trade_date']])start_capital = 10000end_capital = capital + hands * df.iloc[-1]['close'] * 100 - trade_days * 2 * feeprofit = (end_capital - start_capital) / start_capitalif profit > 0.05:df_trade = pd.DataFrame({'ts_code': [ts_code], 'trade_date': [df.iloc[-1]['trade_date']], 'position': ['long'], 'hands': [hands], 'price': [buy_price], 'profit': [profit]})result_list.append(df_trade)print('The total return of', ts_code, 'is: {:.2%}'.format(profit))# 将结果写入 csv 文件中
if len(result_list) > 0:df_result = pd.concat(result_list).reset_index(drop=True)df_result.to_csv('result.csv', index=False)print('Result has been saved in result.csv')
else:print('No stock meets the requirements.')
总结
在股票技术分析中,均线的金叉和死叉是很常见的交易信号。
均线的金叉表示短期均线上穿长期均线,此时标志着股价走势由下向上改变,是一个买入信号;而均线的死叉则表示短期均线下穿长期均线,此时标志着股价走势由上向下改变,是一个卖出信号。
在代码中,我们可以通过以下方式来判断均线的金叉或死叉:
if df[‘ma10’][i] > df[‘ma20’][i] and df[‘ma10’][i-1] <= df[‘ma20’][i-1]:
# 发出买入信号
elif df[‘ma10’][i] < df[‘ma20’][i] and df[‘ma10’][i-1] >= df[‘ma20’][i-1]:
# 发出卖出信号
在这里,我们使用了当前交易日的两个均线值(10日均线和20日均线)和前一日的均线值进行比较,以判断金叉或死叉的发生。如果当前交易日的短期均线大于长期均线,并且前一日的短期均线小于等于长期均线,说明出现了金叉;如果当前交易日的短期均线小于长期均线,并且前一日的短期均线大于等于长期均线,说明出现了死叉