龙头股选股学习代码

股票学习交流,记录每一天的学习:

提示:这个只是随便学习的笔记,股市有风险,入市需谨慎

正在学习龙头战法,第一步是要选择龙头股,尝试通过代码获得龙头股,尝试的代码如下,仅供大家学习交流。

龙头战法选股策略说明:

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)

希望有朋友可以一起交流相关的心得体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

astrowalker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值