分类: 股票

  • 股票RSI(20买、80卖)指标python代码

    import baostock as bs
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    from matplotlib.ticker import MaxNLocator
    import datetime
    
    # 设置中文显示
    plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei", "SimSun", "KaiTi", "FangSong"]
    plt.rcParams["axes.unicode_minus"] = False  # 正确显示负号
    
    def get_stock_data(code, start_date, end_date):
        """从baostock获取股票数据"""
        # 登录baostock
        lg = bs.login()
        if lg.error_code != '0':
            print(f"登录失败:{lg.error_msg}")
            return None
        
        # 获取股票数据
        rs = bs.query_history_k_data_plus(
            code,
            "date,open,high,low,close,volume",
            start_date=start_date,
            end_date=end_date,
            frequency="d",
            adjustflag="3"  # 复权类型,3表示不复权
        )
        
        # 处理数据
        data_list = []
        while (rs.error_code == '0') & rs.next():
            data_list.append(rs.get_row_data())
        
        # 登出baostock
        bs.logout()
        
        # 转换为DataFrame并处理
        if not data_list:
            print("没有获取到数据")
            return None
            
        df = pd.DataFrame(data_list, columns=rs.fields)
        # 转换数据类型
        df['date'] = pd.to_datetime(df['date'])
        df['open'] = df['open'].astype(float)
        df['high'] = df['high'].astype(float)
        df['low'] = df['low'].astype(float)
        df['close'] = df['close'].astype(float)
        df['volume'] = df['volume'].astype(float)
        
        df.set_index('date', inplace=True)
        return df
    
    def calculate_rsi(data, window=14):
        """计算RSI指标"""
        delta = data.loc[:, 'close'].diff()
        
        # 分离涨跌
        gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
        loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
        
        # 计算RSI
        rs = gain / loss
        data['rsi'] = 100 - (100 / (1 + rs))
        return data
    
    def generate_signals(data):
        """生成交易信号"""
        # 初始化信号:0表示无信号,1表示买入,-1表示卖出
        data['signal'] = 0
        
        # RSI < 20 发出买入信号
        data.loc[data['rsi'] < 20, 'signal'] = 1
        
        # RSI > 80 发出卖出信号
        data.loc[data['rsi'] > 80, 'signal'] = -1
        
        return data
    
    def backtest_strategy(data, initial_capital=100000):
        """回测策略"""
        # 初始化资金和持仓,明确使用浮点数类型
        portfolio = pd.DataFrame(index=data.index).fillna(0.0)
        portfolio['cash'] = float(initial_capital)
        portfolio['shares'] = 0  # shares保持为整数
        portfolio['total'] = float(initial_capital)
        
        in_position = False  # 是否持仓
        
        for i in range(1, len(data)):
            date = data.index[i]
            prev_date = data.index[i-1]
            
            # 复制前一天的持仓和资金状态
            portfolio.loc[date, 'cash'] = portfolio.loc[prev_date, 'cash']
            portfolio.loc[date, 'shares'] = portfolio.loc[prev_date, 'shares']
            
            # 检查交易信号
            if data.loc[date, 'signal'] == 1 and not in_position:
                # 买入信号且未持仓,执行买入
                price = data.loc[date, 'close']
                max_shares = int(portfolio.loc[date, 'cash'] / price)
                if max_shares > 0:
                    portfolio.loc[date, 'shares'] = max_shares
                    portfolio.loc[date, 'cash'] -= max_shares * price
                    in_position = True
                    print(f"{date.date()} 发出买入信号,价格: {price:.2f}, 买入 {max_shares} 股")
            
            elif data.loc[date, 'signal'] == -1 and in_position:
                # 卖出信号且持仓,执行卖出
                price = data.loc[date, 'close']
                shares = portfolio.loc[date, 'shares']
                portfolio.loc[date, 'cash'] += shares * price
                portfolio.loc[date, 'shares'] = 0
                in_position = False
                print(f"{date.date()} 发出卖出信号,价格: {price:.2f}, 卖出 {shares} 股")
            
            # 计算总资产
            portfolio.loc[date, 'total'] = portfolio.loc[date, 'cash'] + portfolio.loc[date, 'shares'] * data.loc[date, 'close']
        
        # 将回测结果合并到数据中
        data['portfolio'] = portfolio['total']
        return data
    
    def plot_results(data):
        """绘制结果图表"""
        fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(16, 18), sharex=True)
        
        # 价格和交易信号图
        ax1.plot(data.index, data['close'], label='收盘价', linewidth=2)
        ax1.scatter(data.index[data['signal'] == 1], data['close'][data['signal'] == 1], 
                    marker='^', color='g', label='买入信号', zorder=3)
        ax1.scatter(data.index[data['signal'] == -1], data['close'][data['signal'] == -1], 
                    marker='v', color='r', label='卖出信号', zorder=3)
        ax1.set_title('股票价格与交易信号')
        ax1.set_ylabel('价格 (元)')
        ax1.legend()
        ax1.grid(True)
        
        # RSI指标图
        ax2.plot(data.index, data['rsi'], label='RSI (14)', color='purple', linewidth=2)
        ax2.axhline(70, color='orange', linestyle='--', alpha=0.7)
        ax2.axhline(30, color='orange', linestyle='--', alpha=0.7)
        ax2.axhline(80, color='r', linestyle='--')
        ax2.axhline(20, color='g', linestyle='--')
        ax2.set_title('RSI指标 (14周期)')
        ax2.set_ylabel('RSI值')
        ax2.set_ylim(0, 100)
        ax2.legend()
        ax2.grid(True)
        
        # 资金曲线
        ax3.plot(data.index, data['portfolio'], label='策略资产', color='b', linewidth=2)
        # 计算买入持有策略的资产
        initial_capital = data['portfolio'].iloc[0]
        buy_hold = initial_capital * (data['close'] / data['close'].iloc[0])
        ax3.plot(data.index, buy_hold, label='买入持有', color='gray', linestyle='--', linewidth=2)
        ax3.set_title('策略表现与买入持有对比')
        ax3.set_xlabel('日期')
        ax3.set_ylabel('资产 (元)')
        ax3.legend()
        ax3.grid(True)
        
        # 设置x轴日期格式
        ax3.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
        ax3.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
        plt.xticks(rotation=45)
        
        plt.tight_layout()
        plt.show()
        
        return fig
    
    def calculate_performance_metrics(data):
        """计算绩效指标"""
        initial_capital = data['portfolio'].iloc[0]
        final_capital = data['portfolio'].iloc[-1]
        
        # 计算策略总收益
        total_return = (final_capital - initial_capital) / initial_capital * 100
        
        # 计算买入持有总收益
        initial_price = data['close'].iloc[0]
        final_price = data['close'].iloc[-1]
        buy_hold_return = (final_price - initial_price) / initial_price * 100
        
        # 计算交易次数
        buy_signals = sum(data['signal'] == 1)
        sell_signals = sum(data['signal'] == -1)
        
        # 计算持有天数
        days_held = len(data)
        
        # 计算年化收益率
        years = days_held / 252  # 假设一年252个交易日
        annualized_return = (pow((final_capital / initial_capital), 1/years) - 1) * 100 if years > 0 else 0
        
        print("\n====== 策略绩效指标 ======")
        print(f"回测时间段: {data.index[0].date()} 至 {data.index[-1].date()}")
        print(f"持有天数: {days_held} 天")
        print(f"初始资金: {initial_capital:.2f} 元")
        print(f"最终资金: {final_capital:.2f} 元")
        print(f"策略总收益率: {total_return:.2f}%")
        print(f"买入持有总收益率: {buy_hold_return:.2f}%")
        print(f"策略年化收益率: {annualized_return:.2f}%")
        print(f"买入信号次数: {buy_signals}")
        print(f"卖出信号次数: {sell_signals}")
        
        return {
            'total_return': total_return,
            'buy_hold_return': buy_hold_return,
            'annualized_return': annualized_return,
            'buy_signals': buy_signals,
            'sell_signals': sell_signals,
            'days_held': days_held
        }
    
    def main():
        # 设置股票代码和日期范围(最近5年数据)
        stock_code = "sh.600938"  # 600938的证券代码
        end_date = datetime.datetime.now().strftime("%Y-%m-%d")
        start_date = (datetime.datetime.now() - datetime.timedelta(days=5*365)).strftime("%Y-%m-%d")
        
        print(f"获取 {stock_code} 从 {start_date} 到 {end_date} 的数据...")
        
        # 获取股票数据
        data = get_stock_data(stock_code, start_date, end_date)
        if data is None or len(data) == 0:
            print("无法获取足够的股票数据进行分析")
            return
        
        # 计算RSI指标
        data = calculate_rsi(data)
        
        # 生成交易信号
        data = generate_signals(data)
        
        # 回测策略
        data = backtest_strategy(data)
        
        # 计算并显示绩效指标
        metrics = calculate_performance_metrics(data)
        
        # 绘制结果图表
        plot_results(data)
    
    if __name__ == "__main__":
        main()
    '''
    脚本现在可以顺利执行RSI交易策略回测,输出显示: 成功获取了sh.600938股票的数据  
    生成了多个买入和卖出交易信号  
    计算了详细的策略绩效指标,
    包括: 
    总收益率:61.16%  
    年化收益率:15.33%  
    与买入持有策略对比(买入持有收益率:92.31%)     
    '''
    
    
  • 中国海油600938R语言绘制日、周K线图2025.1~9

    python库baostock获取股票数据 – 网事-树莓派

    ---
    title: "R Notebook"
    output:
      html_document:
        df_print: paged
    ---
    
    ```{r}
    library(readr)
    library(quantmod)
    
    # 读取数据
    stock <- read_csv("stock_data_600938.csv")
    
    # 创建xts对象时只保留数值列和日期列
    # 排除code等非数值列
    stock_xts <- xts(stock[,-c(1,2)],                               # 只保留数值型列
                     order.by = as.Date(stock$date))      # 日期作为索引
    tail(stock_xts)
    
    # 绘制股票价格图
    chartSeries(stock_xts, # 明确指定使用收盘价绘图
                theme = "white", 
                name = "中国海油股价K线图及布林线",
                up.col = "red",dn.col = "green",
                TA = c(addVo(),      # 添加成交量图
                       addBBands())) # 添加SMA20均线
    
    ```
    # 绘制周股票价格图
    ```{r}
    stock_xts_w <- to.weekly(stock_xts)
    tail(stock_xts_w)
    chartSeries(stock_xts_w, # 明确指定使用收盘价绘图
                theme = "white", 
                name = "中国海油股价K线图及布林线",
                up.col = "red",dn.col = "green",
                TA = c(addVo(),      # 添加成交量图
                       addBBands())) # 添加SMA20均线
    ```
                open  high   low close  preclose   volume    amount adjustflag   turn tradestatus  pctChg isST
    2025-09-23 26.12 26.37 26.04 26.11 26.16 33420344 874462608 3 1.1177 1 -0.1911 0
    2025-09-24 26.20 26.66 26.20 26.33 26.11 35694697 941589316 3 1.1938 1 0.8426 0
    2025-09-25 26.34 26.71 26.32 26.60 26.33 44561236 1183035539 3 1.4903 1 1.0254 0
    2025-09-26 26.55 26.69 26.47 26.50 26.60 22192550 589291301 3 0.7422 1 -0.3759 0
    2025-09-29 26.55 26.58 26.21 26.40 26.50 31542708 831091786 3 1.0549 1 -0.3774 0
    2025-09-30 26.16 26.19 25.88 26.13 26.40 51791066 1348014475 3 1.7321 1 -1.0227 0

    stock_xts.Open stock_xts.High stock_xts.Low stock_xts.Close stock_xts.Volume
    2025-08-29 25.75 26.31 25.47 25.68 281303365
    2025-09-05 25.69 26.57 25.41 25.74 309074615
    2025-09-12 25.58 26.36 25.55 26.30 193722674
    2025-09-19 26.30 26.90 26.00 26.40 232149346
    2025-09-26 26.41 26.71 26.04 26.50 163340642
    2025-09-30 26.55 26.58 25.88 26.13 83333774

  • R语言绘制股票K线图

    使用python库baostock获得中国海油的历史数据,存为stock_data_numeric.csv文件,备用。
    python库baostock获取股票数据 – 网事-树莓派

    
    library(readr)
    stock_data_numeric <- read_csv("python/stock_data_numeric.csv")
    View(stock_data_numeric)
    # 安装并加载quantmod包
    #install.packages("quantmod")
    library(quantmod)
    
    stock_data_numeric <- xts(stock_data_numeric[,-c(1,2)],order.by = as.Date(stock_data_numeric$date))
    # 使用chartSeries绘制股票价格图
    chartSeries(stock_data_numeric,
                theme = "white", # 设置白色主题
                name = "中国海油股价及20均价线SMA20",
                TA = c(addVo(),      #添加成交量图
                       addBBands())) # 添加布林带指标  
    
    
  • python库baostock获取股票数据

    import baostock as bs
    import pandas as pd
    import numpy as np
    
    # 登录baostock系统
    lg = bs.login()
    print('登录返回代码:', lg.error_code)
    print('登录返回信息:', lg.error_msg)
    
    # 获取股票数据
    # 示例:获取上证指数(000001.SH)2023年的日K线数据
    start_date = '2025-01-01'
    end_date = '2025-9-30'
    stock_code = 'sh.600938'
    
    # 获取日K线数据
    rs = bs.query_history_k_data_plus(stock_code,
        "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
        start_date=start_date, end_date=end_date, frequency="d", adjustflag="3")
    
    print('获取K线数据返回代码:', rs.error_code)
    print('获取K线数据返回信息:', rs.error_msg)
    
    # 解析数据并存储到DataFrame
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    
    # 创建DataFrame
    column_names = ["date","code","open","high","low","close","preclose","volume","amount","adjustflag","turn","tradestatus","pctChg","isST"]
    df = pd.DataFrame(data_list, columns=column_names)
    
    # 数据类型转换 - 将字符串转换为数字格式
    numeric_columns = ["open","high","low","close","preclose","volume","amount","adjustflag","turn","pctChg"]
    for col in numeric_columns:
        # 替换可能存在的非数字字符
        df[col] = pd.to_numeric(df[col], errors='coerce')
    
    # 处理可能的缺失值
    # 1. 查看缺失值情况
    print("缺失值统计:")
    print(df.isnull().sum())
    
    # 2. 填充缺失值(可以根据实际需求选择填充方式)
    # 对于价格类数据,使用前一天的值填充
    price_columns = ["open","high","low","close","preclose"]
    df[price_columns] = df[price_columns].fillna(method='ffill')
    
    # 对于交易量、成交额等,使用0填充
    volume_columns = ["volume","amount"]
    df[volume_columns] = df[volume_columns].fillna(0)
    
    # 对于其他数值列,使用均值填充
    other_numeric = list(set(numeric_columns) - set(price_columns) - set(volume_columns))
    for col in other_numeric:
        if not df[col].empty and df[col].notna().any():
            df[col] = df[col].fillna(df[col].mean())
    
    # 转换日期格式
    df['date'] = pd.to_datetime(df['date'])
    
    # 输出数据基本信息
    print("\n数据基本信息:")
    print(df.info())
    print("\n数据前5行:")
    print(df.head())
    print("\n数据后5行:")
    print(df.tail())
    
    # 保存数据为CSV文件(适合SPSS Modeler导入)
    output_file = 'stock_data_numeric.csv'
    df.to_csv(output_file, index=False, encoding='utf-8')
    print(f"\n数据已保存至:{output_file}")
    
    # 登出系统
    bs.logout()
    
    # 提示用户如何在SPSS Modeler中使用该数据
    print("\n提示:")
    print("1. 已将所有数值列转换为数字格式,适合SPSS Modeler分析")
    print("2. 日期列已转换为标准日期格式")
    print("3. 缺失值已进行处理")
    print("4. 您可以在SPSS Modeler中通过'CSV数据源'节点导入此文件进行分析")
    print("5. 如需获取其他股票或时间段数据,请修改代码中的start_date、end_date和stock_code参数")
    

    下面是使用baostock获取的股票数据中各个字段的详细说明:

    数据处理说明 数据类型转换:代码中已将所有数值字段(open、high、low、close、preclose、volume、amount、adjustflag、turn、pctChg)通过pd.to_numeric()转换为数字格式

    缺失值处理:

    价格类数据(open、high、low、close、preclose)使用前一天的值填充 交易量、成交额等(volume、amount)使用0填充 其他数值列使用均值填充 日期格式:date字段已通过pd.to_datetime()转换为标准日期格式

    这些处理确保了数据适合在SPSS Modeler中进行各种统计分析,如相关性分析、回归分析等。

    需要查看当前的 stocks_baostock.py 文件内容,了解其中包含的数据字段,然后为这些字段提供详细说明。

    toolName: view_files
    status: success

    filePath: c:\Users\czliu\Documents\python\stocks_baostock.py

    下面是使用baostock获取的股票数据中各个字段的详细说明:

    1. 基本字段

    字段名中文名称数据类型说明
    date日期日期类型交易日期,格式为YYYY-MM-DD
    code股票代码字符串如”sh.600938″,其中sh表示上海证券交易所

    2. 价格相关字段

    字段名中文名称数据类型说明
    open开盘价浮点数当日股票开盘价格
    high最高价浮点数当日股票交易的最高价格
    low最低价浮点数当日股票交易的最低价格
    close收盘价浮点数当日股票收盘价格
    preclose前收盘价浮点数前一个交易日的收盘价格
    pctChg涨跌幅浮点数当日涨跌幅百分比,计算公式:(收盘价-前收盘价)/前收盘价*100%

    3. 交易量相关字段

    字段名中文名称数据类型说明
    volume成交量整数当日股票成交的数量,单位为股
    amount成交额浮点数当日股票成交的金额,单位为元
    turn换手率浮点数当日换手率百分比,计算公式:(成交量/流通股数)*100%

    4. 状态相关字段

    字段名中文名称数据类型说明
    adjustflag复权状态整数表示数据的复权类型,代码中的adjustflag=”3″表示”前复权”
    tradestatus交易状态整数表示股票的交易状态,1表示正常交易,0表示停牌
    isST是否ST字符串表示股票是否为ST股票,1表示是ST股票,0表示非ST股票

    数据处理说明

    1. 数据类型转换:代码中已将所有数值字段(open、high、low、close、preclose、volume、amount、adjustflag、turn、pctChg)通过pd.to_numeric()转换为数字格式
    2. 缺失值处理
      • 价格类数据(open、high、low、close、preclose)使用前一天的值填充
      • 交易量、成交额等(volume、amount)使用0填充
      • 其他数值列使用均值填充
    3. 日期格式:date字段已通过pd.to_datetime()转换为标准日期格式

    这些处理确保了数据适合在SPSS Modeler中进行各种统计分析,如相关性分析、回归分析等。

  • 如何选择ETF并长期持有

    文章介绍了7只适合长期持有的“压舱石”ETF,并分享了网格交易策略及长期持有ETF的注意事项,具体如下:

    • 三类长期“压舱石”ETF
      • 红利类:以高股息成熟企业为标的,靠分红获利,可抵御市场波动。如中证红利ETF(515080),聚焦A股分红稳定股,长期年化10%-13%;恒生红利ETF(513950),专注港股高股息股,股息率更高,但受外资影响大。
      • 宽基类:覆盖全市场,行业分散。沪深300ETF(510300)是A股核心蓝筹聚集地;标普500ETF(513500)包含全球顶尖企业,可对冲A股波动;中证500ETF(510500)是A股中盘股中坚力量,成长弹性大,持有成本低。
      • 策略类:采用双逻辑选股,兼顾收益与波动。中证红利质量ETF(159209)筛除“分红陷阱股”,年化收益高且回撤小;港股央企红利ETF(159333)聚焦港股高股息央企,估值低,有国企改革政策托底。
    • 长期持有+网格策略技巧
      • 长期打底+网格增效:以沪深300ETF为底仓,设置网格交易,如以某价位为中枢,涨跌一定比例进行买卖,可在震荡市赚取差价。
      • 关注费率:宽基ETF费率下降,长期持有可节省大量费用,复利效果下差距显著。
      • 选对分红方式:指数ETF优先选“分红再投资”,可在熊市增加份额,牛市实现复利增长。
      • 网格交易灵活调整:极端行情下,如单边暴涨或暴跌,应关闭全自动网格,避免卖飞底仓或及时手动补仓。
      • 选择高流动性ETF:做网格交易要选日成交额超1亿的ETF,确保挂单能及时成交。
    • 长期持有避坑指南
      • 避免高估值买入:估值达历史90%以上时停止买入,低估值时应分批买入。
      • 匹配风险承受能力:根据自身抗跌能力选择ETF,若风险承受力低,应优先选择波动小的品种。
      • 使用闲钱投资:用3年以上不用的闲钱投资,才能在市场波动时保持心态稳定,长期持有。
      • 定期关注指标:每季度关注指数成分股调整和基金规模,若成分股质量下降或规模缩水至5亿以下,应及时更换。

  • 格力的坑

    分红前买入,得了,分红3000,损失1万。分红除权后是45。一路狂跌,跌到现在的39块9毛9。我把仓位减了一半。留下1200股。真的气死我了,半年多的利润被他,不到两个星期的时间亏损了。

    持有的农行股从最高的7块5毛5。两周时间已经跌到了6块5毛3。 23,000元多的盈利,目前亏损只剩18,000。今天也减半仓处理。另一个账户 农行股,中国海油。早已清空。

    目前。留着中国海油, 26块2毛。微微眼里。

    留着一个酒ETF.,2万元。亏损2%。

    现在是大科技的行情,持有这些大蓝筹股方向错了,早,应该调整方向。另一个账户持有的科技股ETF赚了2000多。

  • 做T方法

    你敢相信吗?只用一支股票、一套方法,反复操作。一年让账户翻十倍,赚到上百万!听起来像白日做梦,但真有人靠做T实现了。晓生最初炒股时,两百多万的本金一度亏损只剩下三十万,差点崩溃。幸好后来遇到高人指点,学会了五招实用的做T技巧,才慢慢把账户做回来。三十万变五百多万,也就是一年出头的事。后来我自己不断总结、优化,胜率提高至百分之90。首先做T的优点在于能够抓住股票日内的波动,利用底仓在日内实现多次高抛低吸,哪怕股价只波动三四个点,你也能做出十几个点的利润。我们做T的精髓就是:股票涨时我们赚价格,股票跌时我们赚股数,真正做到无视大盘,无视牛熊市。都能应对自如。接下来,我将分享五个做T技巧:

    第一:低位震荡不破低点如果开盘后股价一直在低位徘徊,第一个低点没被跌破,反而底部慢慢抬高,那第二个低点出现的时候,就可以果断买进。等第二波冲高再抛出之前的底仓,这样一波完美的做T就完成了。

    第二:急跌缩量是机会开盘如果大跌超5%,成交量还在不断萎缩,这时候一旦股价远离分时均线。这时我们要大胆低吸。反弹至均价线附近的时候再T出,成功率极高。

    第三:价格与均价线背离股价往下走、均线却没有跟上,那就低吸;股价往上冲、均线没跟上,那就高抛。这条简单好用,看准节奏,果断出手。

    第四:早盘急拉别追高要是开盘十来分钟突然快速拉升,但没封住涨停,多半是主力在诱多。这个时机你得抓住:拉高无力的时候卖出,等回调跳水再买回来。

    第五:看大盘做个股如果大盘涨你的股不涨,该卖!不然等大盘回落,会跌得更凶。如果大盘跌它反而稳得住,这时勇敢低吸,等大盘反V回去再T出去。这五个技巧只要你熟练运用,你的交易胜率将大幅提升。 如果你是第一次接触到我,可能有些内容看不懂,别担心,只要你坚持每期来关注学习,便能融会贯通,财富自由指日可待。

  • 锁定年化收益率17~28%

    ——如果你炒股超过3年还在坐过山车,请务必把这篇文章转给未来的自己。


    01 先讲一个故事:从“韭菜王”到“躺平赢家”

    2014年,我用30万本金一头扎进牛市,最高浮盈120万;
    2015年股灾,利润+本金回撤到只剩9万;
    2016年,我关掉所有股票群,写了5条铁律贴在显示器上;
    今天,账户净值290万,没有一只妖股、没追过一次涨停。
    靠什么?就是下面这5个可复制的“稳定收益公式”。


    02 公式一:ETF“核心—卫星”仓位法

    • 核心仓(60%):沪深300ETF + 中概互联ETF
      逻辑:国运+互联网龙头,年化8%—12%的底仓收益。
    • 卫星仓(40%):行业ETF轮动
      每年只盯3条赛道:医药<512010.SH>、红利<510880.SH>、光伏<515790.SH>,估值百分位<30%时分批买,>70%时分批卖。
    • 结果:8年测试,最大回撤-9.7%,年化14.8%。

    03 公式二:网格交易“躺平收割机”

    • 标的:波动大、不死品种——券商ETF<512000.SH>、中国国航<601111.SH>
    • 做法:把资金切成5%一份,每下跌3%买一份,每上涨5%卖一份;
      电脑自动跑,不用盯盘。
    • 结果:2018年1月—2024年6月,券商ETF区间涨幅-2%,网格收益+78%。

    04 公式三:股息“养老组合”

    • 选股4个硬指标
    • 连续分红≥10年
    • 股息率>4%
    • 近5年ROE>15%
    • 行业前三
    • 现成组合
      中国移动<600941.SH>5.3%股息
      招商银行<600036.SH>5.7%股息
      大秦铁路<601006.SH>7.2%股息
    • 再投入:股息每年再买入,10年复利≈12%。

    05 公式四:55日均线右侧交易

    • 规则
      只在沪深300收盘价>55日均线且均线向上时满仓;
      跌破当日收盘减至3成仓。
    • 数据:2005—2024年,沪指涨幅2.46倍,该策略11.04倍。
    • 工具:同花顺条件单自动执行,完全机械。

    06 公式五:现金—债券“安全气囊”

    • 任何时候保留20%货币基金+10%中长期国债ETF<511010.SH>;
    • 当A股整体PB<1.5时,把债券仓降到5%;
    • 当PB>2.4时,把债券仓提到30%。
    • 作用:让净值曲线45°向上,而不是过山车。

    07 十年总结:稳定收益的4句大实话

    1. 不追涨停,只赚“估值回归+股息+波动”三份钱。
    2. 策略越简单,越能熬过熊市。
    3. 把“回撤”当敌人,而不是把“少赚”当敌人。
    4. 用制度和工具管手,而不是靠意志力。

    08 一键拿走“懒人组合”

    • 50%沪深300ETF<510300.SH>
    • 20%高股息组合(600036+600941+601006)
    • 20%网格券商ETF<512000.SH>
    • 10%国债ETF<511010.SH>
      每年底再平衡一次,过去10年回测年化18.7%,最大回撤-11.4%。

    09 写在最后

    炒股十年,我最大的敌人从来不是市场,而是自己的贪婪和恐惧。
    把这5个公式写下来,贴在屏幕边——
    当你想满仓梭哈时,看一眼;当你想割肉止损时,再看一眼。
    时间会奖励每一个遵守纪律的人。

  • 换仓调股,调到格力电器

    8月28日是格力电器的分红分红日。,昨天卖掉了云南白药、中国电信,还有其他的股,买了格力电器,想着分点红。可是分红之后股票大跌5%。今天倒贴了4000多。主力的这种玩法 套死你没商量。