股票学习交流,记录每一天的学习:
提示:这个只是随便学习的笔记,股市有风险,入市需谨慎
正在学习龙头战法,第一步是要选择龙头股,尝试通过代码获得龙头股,尝试的代码如下,仅供大家学习交流。
龙头战法选股策略说明:
1. 描述:该策略旨在识别市场中的强势股票,即所谓的"龙头股"。
2. 主要指标:
- 价格突破:股价突破n日移动平均线
- 成交量:成交量显著放大
- 涨幅:单日涨幅超过设定阈值
- 走势强度:近期走势强于大盘
3. 策略逻辑:
- 计算每只股票的n日移动平均线和成交量移动平均线
- 检查股价是否突破移动平均线
- 检查成交量是否显著放大
- 检查涨幅是否超过阈值
- 检查近期走势是否强势
4. 改进建议:
- 考虑加入更多技术指标,如MACD、RSI等
- 结合基本面分析,如市盈率、净资产收益率等
- 考虑行业因素,可能需要对不同行业使用不同的参数
- 加入风险控制措施,如设置止损点
- 考虑市场整体趋势,在大盘走强时更容易出现龙头股
5. 注意事项:
- 该策略仅作为参考,实际交易时需要结合更多因素
- 历史表现不代表未来,需要持续监控和调整策略
- 建议在实盘交易前进行充分的回测和模拟交易
龙头股票识别代码
第一步:获取股票的整体信息,主要是获取股票的代码
def get_stock_data():
"""
获取A股所有股票的行情数据,保存到csv文件里
"""
try:
stock_zh_a_spot_df = pd.read_csv('stock_zh_a_spot.csv', encoding='utf-8-sig')
except:
stock_zh_a_spot_df = ak.stock_zh_a_spot()
# 数据保存到csv文件,使用utf-8编码以支持中文
stock_zh_a_spot_df.to_csv('stock_zh_a_spot.csv', index=False, encoding='utf-8-sig')
stock_list = stock_zh_a_spot_df['代码'].tolist()
print(stock_list)
return stock_zh_a_spot_df
第二步:获取某一个股票的交易数据,保存到指定文件夹,每日只需要更新即可
import akshare as ak
import os
def get_stock_history(stock_code, start_date, end_date):
"""获取单个股票的每日交易信息"""
# 如果 start_date 是 2024-01-01 这种格式,需要转换成 20240101 这种格式
stock_price_df = pd.DataFrame()
# 判断是否本地有数据
if os.path.exists(f'./database/{stock_code}.csv'):
exist_stock_price_df = pd.read_csv(f'./database/{stock_code}.csv')
print('read local data success')
# 获取起始日期
exist_start_date = exist_stock_price_df.iloc[0]['Date']
# 获取结束日期
exist_end_date = exist_stock_price_df.iloc[-1]['Date']
# 如果本地数据起始日期小于传入的 start_date,则把没有的数据补上
if exist_end_date < end_date:
start_date = exist_end_date
if '-' in start_date:
start_date = start_date.replace('-', '')
if '-' in end_date:
end_date = end_date.replace('-', '')
stock_price_df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="hfq")
stock_price_df = rename_columns(stock_price_df)
# 把下载的数据和本地的数据合并
stock_price_df = pd.concat([exist_stock_price_df, stock_price_df])
# 如果日期有重复,则删除重复的行
# 删除重复的日期,保留第一次出现的记录
# Remove duplicate dates, keeping the first occurrence
stock_price_df = stock_price_df.drop_duplicates(subset=['Date'], keep=False)
# 检查是否还有重复项,如果有,打印出来以便进一步调查
# Check if there are still duplicates, if so, print them for further investigation
duplicates = stock_price_df[stock_price_df.duplicated(subset=['Date'], keep=False)]
# 把下载的数据保存到本地
stock_price_df.to_csv(f'./database/{stock_code}.csv', index=None, encoding='utf_8_sig')
print('download data success')
else:
print('local data is new')
stock_price_df = exist_stock_price_df
else:
if '-' in start_date:
start_date = start_date.replace('-', '')
if '-' in end_date:
end_date = end_date.replace('-', '')
stock_price_df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="hfq") # 把 column 的中文改成英文
stock_price_df = rename_columns(stock_price_df)
stock_price_df.to_csv(f'./database/{stock_code}.csv', index=None, encoding='utf_8_sig')
print('download data success')
return stock_price_df
尝试一下代码是否正常运行:
stock_code = '600000'
stock_price_df = get_stock_history(stock_code, '2024-01-01', '2024-10-01')
第三步:计算MA, RSI,MACD等指标
import talib
def calculate_line(stock_data, n):
# 计算n日移动平均线
stock_data['MA'] = stock_data['Close'].rolling(window=n).mean()
# 计算成交量的n日移动平均线
stock_data['Volume_MA'] = stock_data['Volume'].rolling(window=n).mean()
# 计算涨跌幅
stock_data['Price_Change'] = stock_data['Close'].pct_change()*100
# 计算相对强弱指标(RSI)
# Description: 使用talib库计算RSI指标
# Inputs: stock_data['Close'] - 收盘价数据, n - 时间窗口
# Outputs: stock_data['RSI'] - RSI指标值
stock_data['RSI'] = talib.RSI(stock_data['Close'].values, timeperiod=n)
# 错误处理:检查RSI计算结果是否包含NaN值
if stock_data['RSI'].isnull().any():
print("警告:RSI计算结果包含NaN值,可能是由于数据不足或其他问题导致")
# 可以选择填充NaN值或者删除包含NaN的行,取决于具体需求
# 例如:stock_data['RSI'] = stock_data['RSI'].fillna(method='bfill')
# 计算MACD指标
stock_data['MACD'], stock_data['MACD_signal'], stock_data['MACD_hist'] = talib.MACD(stock_data['Close'], fastperiod=12, slowperiod=26, signalperiod=9)
return stock_data
需要下载 TA_Lib-0.4.26-cp310-cp310-win_amd64.whl 的话可以点击:
https://download.csdn.net/download/astrowalker/89849033
第四步:选择龙头股票
def select_dragon_stock(stock_code_list, volume_threshold, price_change_threshold):
dragon_stocks = []
for code in stock_code_list:
stock_data = get_stock_history(code, '2024-01-01', '2024-10-01')
stock_data = calculate_line(stock_data, 20)
stock_data.to_csv(f'./database/{code}.csv', index=None, encoding='utf_8_sig')
# 条件1: 股价突破n日均线
if stock_data['Close'].iloc[-1] > stock_data['MA'].iloc[-1]:
# 条件2: 成交量显著放大
if stock_data['Volume'].iloc[-1] > volume_threshold * stock_data['Volume_MA'].iloc[-1]:
# 条件3: 涨幅超过阈值
if stock_data['Price_Change'].iloc[-1] > price_change_threshold:
# 条件4: 近期走势强势(可以根据需要添加更多指标)
if stock_data['Close'].iloc[-5:].mean() > stock_data['MA'].iloc[-5:].mean():
# 条件5: 相对强弱指标(RSI)处于上升趋势
if 'RSI' in stock_data.columns and stock_data['RSI'].iloc[-1] > stock_data['RSI'].iloc[-5]:
# 条件6: MACD金叉
if 'MACD' in stock_data.columns and stock_data['MACD'].iloc[-1] > stock_data['MACD_signal'].iloc[-1] and stock_data['MACD'].iloc[-2] <= stock_data['MACD_signal'].iloc[-2]:
# 条件7: 股价处于上升通道中
if stock_data['Close'].iloc[-1] > stock_data['Close'].iloc[-20] and stock_data['Close'].iloc[-20] > stock_data['Close'].iloc[-40]:
dragon_stocks.append(code)
return dragon_stocks
第五步:遍历所有的股票代码,下载股票并输出龙头股
if __name__ == "__main__":
# 移动平均线的天数选的是20
stock_zh_a_spot_df = pd.read_csv('stock_zh_a_spot.csv', encoding='utf-8-sig')
stock_code_list = stock_zh_a_spot_df['代码'].tolist()
# 每一个代码去掉前缀
stock_code_list = [code[2:] for code in stock_code_list]
select_dragon_stock(stock_code_list, volume_threshold=2, price_change_threshold=0.05)
希望有朋友可以一起交流相关的心得体会。