0

次のコードを機能させる方法を探しています。

import pandas

path = 'data_prices.csv'
data =  pandas.read_csv(path, sep=';')
data = data.sort_values(by=['TICKER', 'DATE'], ascending=[True, False])
data.columns

3 つの列を持つ 2 次元配列があり、データは次のようになります。

DATE;TICKER;PRICE
20151231;A UN Equity;41.81
20151230;A UN Equity;42.17
20151229;A UN Equity;42.36
20151228;A UN Equity;41.78
20151224;A UN Equity;42.14
20151223;A UN Equity;41.77
20151222;A UN Equity;41.22
20151221;A UN Equity;40.83
20151218;A UN Equity;40.1
20091120;PCG UN Equity;42.1
20091119;PCG UN Equity;41.53
20091118;PCG UN Equity;41.86
20091117;PCG UN Equity;42.23
20091116;PCG UN Equity;42.6
20091113;PCG UN Equity;41.93
20091112;PCG UN Equity;41.6
20091111;PCG UN Equity;42.01

ここで、x が入力フィールドから取得された x 日の実現ボラティリティを計算したいと思います。x は観測数よりも大きくなってはいけません。

実行する必要がある手順:

  • 各行のログ リターンを計算する
  • それらのリターンを取得し、その上に標準偏差を実行します
  • 年間ボラティリティを正規化するには、255 の平方根を掛けます。
4

1 に答える 1

1

申し訳ありませんが、あなたが望んでいるアウトプットの種類が完全に明確ではないので、ティッカーと期間 (x) を入力して、現在のボラティリティの数値を確認したいと考えています。以下では、そのライブラリがない場合に備えて、numpy も使用しています。

基本的に、すべての元のデータの DataFrame を作成し、次に指定されたティッカー用にフィルター処理された新しい DF を作成しました (「UN Equity」は定数と見なされるため、ユーザーは「A」または「PCG」の部分のみを入力する必要があります)。 . この新しい DF では、期間 (x) の入力が高すぎないことを確認した後、最新の年間ボラティリティ値を出力します。

import numpy as np
import pandas as pd

data = pd.read_csv('dump.csv', sep=';')
data = data.sort_values(by=['TICKER','DATE'],ascending=[True,True])


def vol(ticker, x):
    df = pd.DataFrame(data)
    df['pct_chg'] = df.PRICE.pct_change()
    df['log_rtn'] = np.log(1 + df.pct_chg)

    df_filtered = df[df.TICKER==ticker+' UN Equity']

    max_x = len(df_filtered) - 1
    if x > max_x:
        print('Too many periods. Reduce x')

    df_filtered['vol'] = pd.rolling_std(df_filtered.log_rtn, window=x) * (255**0.5)

    print(df_filtered.vol.iloc[-1])

例として、入力がvol('PCG',6)の場合、出力は 0.187855386042 です。

私があなたの要求を誤解した場合、おそらく最もエレガントではなく、謝罪します.

于 2016-08-08T15:21:09.500 に答える