栈解决持仓时间

53 阅读1分钟
import pandas as pd
import statsmodels.api as sm

# 假设df1和df2是已经按照日期索引合并好的DataFrame
# df1包含日期和News Sentiment列,df2包含日期和TRAN_AMT_HKE列

# 合并DataFrame
merged_df = pd.merge(df1, df2, left_index=True, right_index=True)

# 从merged_df中提取自变量和因变量
X = merged_df['News Sentiment'].values.reshape(-1, 1)  # 自变量,需要转换为二维数组
y = merged_df['TRAN_AMT_HKE'].values  # 因变量

# 添加常数项,以便模型中包含截距
X = sm.add_constant(X)

# 创建OLS模型
model = sm.OLS(y, X)

# 拟合模型
results = model.fit()

# 打印回归结果摘要
print(results.summary())
import pandas as pd

def calculate_holding_time(df):
    # 确保DataFrame已经按照TRAN_DT列进行排序
    df.sort_values(by='TRAN_DT', inplace=True)

    # 初始化一个栈来存储买入的记录
    buy_stack = []
    # 初始化持仓时间列
    df['holding_time'] = 0

    # 遍历每一行
    for index, row in df.iterrows():
        # 如果是买入操作
        if row['BUY_SELL_IND'] == 'B':
            # 将买入记录压入栈中
            buy_stack.append(row)
        elif row['BUY_SELL_IND'] == 'S':
            # 如果栈为空,说明没有对应的买入记录
            if not buy_stack:
                continue
            # 弹出栈顶的买入记录
            buy_record = buy_stack.pop()
            # 计算持仓时间
            holding_time = (row['TRAN_DT'] - buy_record['TRAN_DT']).days
            # 检查买入和卖出的金额是否相等
            if abs(row['TRAN_AMT_HKE'] - buy_record['TRAN_AMT_HKE']) < 1e-6:
                # 将持仓时间添加到当前卖出记录中
                df.at[index, 'holding_time'] = holding_time
            else:
                # 如果金额不等,将买入记录再次压入栈中
                buy_stack.append(buy_record)

    return df

# 假设df是你的DataFrame
df_with_holding_time = calculate_holding_time(df)`