【问题标题】:Save vars pr iteration to df and when done save df to csv将 vars pr 迭代保存到 df,完成后将 df 保存到 csv
【发布时间】:2015-08-05 07:26:35
【问题描述】:

我需要结合公司股票代码(Apple Computers 的 AAPL 等)创建一个数据帧 (df_max_res),其中包含我的股票策略中的 15 个最佳表现。我有一个包含 500 多个股票代码的列表,我使用我自己的四种策略对其进行分析。

for eachP in perf_array 嵌套内部迭代中,我从策略和代码的所有组合中获得性能结果。我想使用此代码(或更好的建议)将这些结果保存到 DataFrame 和 csv 文件中:

#==============================================================================
#     Saving results in pandas and to a csv-file
#==============================================================================
def saving_res_pandas():
    global df_res, df_max_res
    df_res = pd.DataFrame(columns=('Strategy', 'Ticker', 'Strat', 
                                   'ROI', 'Sharpe R', 'VaR'))
    for eachP in perf_array:
        df_res.loc[len(df_res) + 1] = [strategy, ticker, strat, stratROI]  
    # Select the top 15 of all results (ticker/strategy combo) into new df.
    df_max_res = df_res[:15]           
    # Saving to a csv.
    df_max_res.to_csv('df_performance_data_sp500ish.csv')
    print('After analysing %1.1f Years ~ %d workdays - %d strategies and %d tickers' '\n'
          'The following matrix of tickers and strategies show highest ROI: ' 
          % (years, days, len(strategies), len(stock_list))
         )

    return df_res
#==============================================================================
# Chose which of below methods to save perf-data to disk with
#==============================================================================
saving_res_pandas()

# Reading in df_max_res with best ticker/strategy results
df_max_res = pd.read_csv('df_performance_data_sp500ish.csv')
print(df_max_res)

上面的代码可以很好地创建我的 DataFrame,但它并没有像我预期的那样保存迭代性能结果。

我得到这个输出:

=======================================================
 aa   ===   <function strategy1 at 0x00000000159A0BF8>   ==
=======================================================


Holdings: 0
Funds: 14659

Starting Valuation:  USD 15000.00 ~ DKK: 100000.50
Current Valuation:   USD 14659.05 ~ DKK: 97727.49

===  aa  == <function strategy1 at 0x00000000159A0BF8> ==
ROI: -1.9 perc. & Annual Profit -1894 DKK  ==
######################################################################

cannot set a row with mismatched columns

== ALL Tickers Done for ==  <function strategy1 at 0x00000000159A0BF8> ==================
Strategy analysis pr ticker - COMPLETE !

Empty DataFrame
Columns: [Unnamed: 0, Strategy, Ticker, ROI, SharpeR, VaR]
Index: []

【问题讨论】:

  • 提供一个好的例子将更有可能得到有用的答案:stackoverflow.com/help/mcve
  • 你有多少列?这行df_res[:15] 正在选择最多 15 列,这是您想要的,因为您的评论似乎暗示您想要 df_res.head(15)
  • 正是我想显示所有列,但只显示前 15 个组合。所以我想我必须写 df_res.head(15)。那会奏效。目前我只有 3 列,但还会有更多。我需要将它们全部转移到新的df。谢谢埃德。
  • Mike 我认为我已经为我的代码和我看到的输出提供了一个很好的示例 + 解释了我的预期以及这些情况之间的差异。我怎么可能更清楚。我不知道如何比这更具体。请解释...
  • 关于如何提出一个好的熊猫问题的好帖子:stackoverflow.com/questions/20109391/…

标签: python csv pandas dataframe


【解决方案1】:

我已尝试减少您的代码以使其更具可读性:

 1. def saving_res_pandas():
 2.     cols = ('Strategy', 'Ticker', 'Strat', 'ROI', 'Sharpe R', 'VaR')
 3.     df_res = pd.DataFrame(columns=cols)
 4.     for _ in perf_array:
 5.         df_res.loc[len(df_res) + 1] = [strategy, ticker, strat, stratROI]  
 6.     # Select the top x of all results (ticker/strategy combo) into new df.
 7.     df_max_res = df_res[:15]           
 8.     df_max_res.to_csv('df_performance_data_sp500ish.csv')
 9.     print('After analysing {0:.1f} Years ~ {1} workdays - {2} strategies and {3} tickers' '\n'
10.           'The following matrix of tickers and strategies show highest ROI: '  
11.           .format(years, days, len(strategies), len(stock_list)))
12.     return df_res

根据上面的代码,我有两个问题:

  1. 在第 5 行,strategy, ticker, strat and stratROI 的值是如何获得的
  2. 在第 7 行,您正在获取 df_res 的前 15 项,但 DataFrame 尚未排序。在您的原始代码中,下面的排序行已被注释掉(因此我在编辑中将其删除)。

    df_res.reset_index().sort(['ROI', 'VaR', 'Sharpe R'], ascending=[0,1,0])

当您说您想要 15 项最佳表现时,是根据哪个指标(ROI、Var、Sharpe 等)?

【讨论】:

  • 嗨,亚历山大,感谢您的努力。第 5 行的 Q1 我正在使用以下变量:策略(从迭代本身中获得,因此从策略 0 开始,以策略 3 结束,股票代码(与 560 个不同公司股票代码的迭代中相同的地方,投资回报率(ROI ) 是有趣的部分,其中前 2 个变量(策略和股票代码组合)ROI 的实际表现是一个百分比。第 7 行:并且 df_res 应该从这个结果中排序,然后再用前 15 个切出 df_max_res。夏普R 和 VaR 可以等待。
  • 好的,谢谢。快到了。有了您的编辑,我现在几乎可以保存正确的信息。唯一的问题是它仅从上次运行的迭代中保存。所以在某个地方我没有得到保存 pr 迭代运行。这是我的输出:'在分析 1.2 年 ~ 302 个工作日后 - 4 个策略和 2 个股票代码以下股票代码和策略矩阵显示最高投资回报率:未命名:0 战略股票投资回报率 0 1 aa 1.082333'
  • 这意味着相关信息实际上正在被保存(策略名称、代码及其投资回报率)。现在,如果它只是将所有迭代运行结果分别保存在 df 的新行上 - 那将是膨胀!
【解决方案2】:

我终于想出了解决我烦恼的正确答案。

我是这样解决的:

在 for 循环之前:

# Creating the df that will save my results in the backtest iterations
cols = ('Strategy','Ticker','ROI')  # ,'Sharpe R','VaR','Strat'
df_res = pd.DataFrame(columns = cols)

在 for 和嵌套的 for 循环中

def saving_res_pandas():
    global df_res, df_max_res
    df_res = df_res.append({'Ticker':ticker,'Strategy':strategy, 'ROI':stratROI,}, ignore_index = True)

    return df_res

for 循环的外部和之后:

        df_res = df_res.sort(['ROI'], ascending=[0])
        df_max_res = df_res.head(15)           # Select the top x of all results (ticker/strategy combo) into new df
        # saving to a csv #
        df_max_res.to_csv('df_performance_data_sp500ish.csv')

    print('After analysing %1.1f Years ~ %d workdays - %d strategies and %d tickers' '\n'
    'The following matrix of tickers and strategies show highest ROI:' %(years, days, len(strategies), len(stock_list))
    )
    print()
    print(df_max_res)

感谢您的所有帮助和启发。

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2022-11-30
    • 2020-02-10
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2022-01-12
    相关资源
    最近更新 更多