【Day55】代码随想录之动态规划_买卖股票含冷冻期和手续费

动态规划理论基础

动规五部曲:
  1. 确定dp数组 下标及dp[i] 的含义。
  2. 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp数组。
  4. 确定遍历顺序:从前到后or其他。
  5. 打印。
出现结果不正确:
  1. 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。
  2. 打印dp日志和自己想的不一样:代码实现细节出现问题。

1. 最佳买卖股票的时机含冷冻期

参考文档:代码随想录

分析:
加入冷冻期的概念,如果当前卖出了会有一天的冷冻期,这一天不能买入股票,所以节点的状态增加为 持有 当场卖出 冷冻期 和 卖出状态 四种。卖出状态是说明可以持有股票了。
递推公式:

dp[i][0] = max(dp[i-1][0], max(dp[i-1][2]-prices[i], dp[i-1][3]-prices[i]));
dp[i][1] = dp[i-1][0] + prices[i];
dp[i][2] = dp[i-1][1];
dp[i][3] = max(dp[i-1][3], dp[i-1][2]);

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //比较重要的是状态的细分
        vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
        dp[0][0] = -prices[0];//持有
        dp[0][1] = 0;//当天卖出
        dp[0][2] = 0;//冷冻期
        dp[0][3] = 0;//卖出状态

        for(int i = 1; i < prices.size(); i++){
            dp[i][0] = max(dp[i-1][0], max(dp[i-1][2]-prices[i], dp[i-1][3]-prices[i]));
            dp[i][1] = dp[i-1][0] + prices[i];
            dp[i][2] = dp[i-1][1];
            dp[i][3] = max(dp[i-1][3], dp[i-1][2]);
        }

        return max(max(dp[prices.size()-1][0],dp[prices.size()-1][1]),max(dp[prices.size()-1][2], dp[prices.size()-1][3]));
    }
};

2. 买卖股票的最佳时机含手续费

参考文档:代码随想录

分析:
手续费什么是否付呢?需要卖出的时候就要付了。每个节点的状态有两个,持有和不持有手里的钱。
递推公式:

dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i] - fee);

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        vector<vector<int>> dp(prices.size(), vector<int>(2,0));
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        
        for(int i = 1; i < prices.size(); i++){
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i] - fee);
        }
        
        return max(0,max(dp[prices.size()-1][1], dp[prices.size()-1][0]));
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是将stock_pool改为前三个月中最高价是最低价两倍以上的股票代码实现: ```python import tushare as ts import datetime pro = ts.pro_api('你的token') # 这里需要填写你的tushare token # 获取当前日 today = datetime.datetime.now().strftime('%Y%m%d') # 计算前三个月的日范围 three_months_ago = (datetime.datetime.now() - datetime.timedelta(days=90)).strftime('%Y%m%d') # 获取所有股票的基本信息 stock_info = pro.stock_basic(list_status='L', fields='ts_code,name,industry') # 遍历所有股票,筛选出前三个月最高价是最低价两倍以上的股票 stock_pool = [] for index, row in stock_info.iterrows(): ts_code = row['ts_code'] name = row['name'] industry = row['industry'] # 获取前三个月的日线行情数据 df = pro.daily(ts_code=ts_code, start_date=three_months_ago, end_date=today) if len(df) < 60: continue # 计算前三个月最高价和最低价 max_price = df['high'].max() min_price = df['low'].min() # 判断最高价是否是最低价的两倍以上 if max_price >= 2 * min_price: stock_pool.append(ts_code) # 获取股票交易日历 cal = pro.trade_cal(exchange='', start_date='20160101', end_date='20211231') trade_days = cal[cal.is_open == 1]['cal_date'].values # 遍历所有交易日 for i, trade_day in enumerate(trade_days): if i >= 1500: break # 获取当日所有股票行情数据 df = pro.daily(trade_date=trade_day) # 进行股票交易 for code in stock_pool: # 获取股票当日行情数据 stock_data = df[df.ts_code == code] if len(stock_data) == 0: continue # 判断是否买入股票 if stock_data.iloc[0]['pct_chg'] > 0: print(trade_day, code, '买入') # 判断是否卖出股票 elif stock_data.iloc[0]['pct_chg'] < 0: print(trade_day, code, '卖出') # 否则不进行交易 else: pass ``` 这段代码首先获取当前日,并计算出前三个月的日范围。然后,我们从tushare中获取所有股票的基本信息,并遍历所有股票,筛选出前三个月中最高价是最低价两倍以上的股票,将其加入股票池中。接着,我们按照之前的方法遍历所有交易日,并进行股票交易。注意,这里同样需要用到tushare的API,所以需要先在tushare官网上注册账号并获取token,然后将token替换代码中的相应部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值