Finance-Instrument

 view release on metacpan or  search on metacpan

lib/Finance/Instrument/Futures.pm  view on Meta::CPAN

use List::MoreUtils qw(firstidx);
extends 'Finance::Instrument';

has multiplier => (is => "rw", isa => "Num");
has currency => (is => "rw", isa => "Str");
has underlying => (is => "rw", isa => "Maybe[Finance::Instrument]");
has last_trading_day_close => (is => "rw", isa => "Int");
has month_cycle => (is => "rw", isa => "Str");
has active_months => (is => "rw", isa => "Int");

has contract_calendar => (is => "rw", isa => "HashRef", default => sub { {} });

my $month_code = [qw(F G H J K M N Q U V X Z)];

sub encode {
    my $self = shift;
    my $year_digit = shift || 2;
    return $month_code->[$self->month-1].substr($self->year, -1 * $year_digit, $year_digit);
}

method near_term_contract($datetime) {
    my $date = ref($datetime) ? $datetime->ymd : $datetime;
    my @contracts = reverse sort keys %{$self->contract_calendar};
    for my $c_i (0..$#contracts-1) {
        my ($curr, $prev) = map { $self->contract_calendar->{$contracts[$_]} } ($c_i, $c_i + 1);
        if ($date le $curr->{last_trading_day} && $date gt $prev->{last_trading_day}) {
            return $self->contract($contracts[$c_i]);
        }
    }
}

method contract($year, $month) {
    unless ($month) {
        ($year, $month) = $year =~ m/(\d\d\d\d)(\d\d)/
            or Carp::croak "invalid expiry format";
    }
    my $expiry = sprintf("%04d%02d", $year, $month);
    my $curr = $self->contract_calendar->{$expiry} || {};
    my $fc = $self->domain->get($self->code.'_'.$expiry)
        || Finance::Instrument::FuturesContract->new( futures => $self,
                                                      expiry_year => int($year),
                                                      expiry_month => int($month),
                                                      domain => $self->domain,
                                                      %$curr,
                                                  );
}

method previous_contract($year, $month) {

share/futures/GLBX.6E.yml  view on Meta::CPAN

currency: USD
tick_size: 0.0001
multiplier: 125000
session:
  -
    - -420
    - 960
last_trading_day_close: 555
attributes:
  cme_path: fx/g10/euro-fx  
contract_calendar: 
  200903: 
    last_trading_day: 2009-03-15
  200906: 
    last_trading_day: 2009-06-14
  200909:
    last_trading_day: 2009-09-14
  200912: 
    last_trading_day: 2009-12-14
  201003: 
    last_trading_day: 2010-03-15

share/futures/XCBT.YM.yml  view on Meta::CPAN

    - 915
override_dow:
  1:
    session:
      -
        - -420
        - 915
last_trading_day_close: 510
attributes:
  cme_path: equity-index/us-index/e-mini-dow
contract_calendar: 
  200903: 
    last_trading_day: 2009-03-20
  200906: 
    last_trading_day: 2009-06-19
  200909:
    last_trading_day: 2009-09-18
  200912: 
    last_trading_day: 2009-12-18
  201003: 
    last_trading_day: 2010-03-19

share/futures/XHKF.HSI.yml  view on Meta::CPAN

        - 810
        - 975
  2012-03-05:
    session:
      -
        - 555
        - 720
      -
        - 780
        - 975
contract_calendar: 
  200901: 
    last_trading_day: 2009-01-30
  200902: 
    last_trading_day: 2009-02-28
  200903: 
    last_trading_day: 2009-03-30
  200904: 
    last_trading_day: 2009-04-29
  200905: 
    last_trading_day: 2009-05-27

share/futures/XNYM.CL.yml  view on Meta::CPAN

month_cycle: FGHJKMNQUVXZ
currency: USD
tick_size: 0.01
multiplier: 1000
session:
  -
    - -360
    - 1035
attributes:
  cme_path: energy/crude-oil/light-sweet-crude
contract_calendar: 
  201001: 
    last_trading_day: 2009-12-20
  201002: 
    last_trading_day: 2010-01-19
  201003: 
    last_trading_day: 2010-02-21
  201004: 
    last_trading_day: 2010-03-21
  201005: 
    last_trading_day: 2010-04-19

share/futures/XNYM.GC.yml  view on Meta::CPAN

month_cycle: GJMQVZ
currency: USD
tick_size: 0.1
multiplier: 100
session:
  -
    - -360
    - 1035
attributes:
  cme_path: metals/precious/gold
contract_calendar: 
  201112: 
    last_trading_day: 2012-12-31
  201202: 
    first_trading_day: 2010-03-31
    last_trading_day: 2012-02-27
  201204: 
    first_trading_day: 2010-05-28
    last_trading_day: 2012-04-26
  201206: 
    first_trading_day: 2007-06-29

share/futures/XSES.TW.yml  view on Meta::CPAN

tick_size: 0.1
multiplier: 100
session:
  -
    - 525
    - 830
  -
    - 875
    - 1560
last_trading_day_close: 830
contract_calendar: 
  201101:
    last_trading_day: 2011-01-27
  201102:
    last_trading_day: 2011-02-24
  201103:
    last_trading_day: 2011-03-30
  201104:
    last_trading_day: 2011-04-28
  201105:
    last_trading_day: 2011-05-30

share/futures/XTAF.TX.yml  view on Meta::CPAN

time_zone: Asia/Taipei
month_cycle: FGHJKMNQUVXZ
currency: TWD
tick_size: 1
multiplier: 200
session:
  -
    - 525
    - 825
last_trading_day_close: 810
contract_calendar:
  200001:
    last_trading_day: 2000-01-19
  200002:
    last_trading_day: 2000-02-16
  200003:
    last_trading_day: 2000-03-15
  200004:
    last_trading_day: 2000-04-19
  200005:
    last_trading_day: 2000-05-17

t/01basic.t  view on Meta::CPAN

my $futures = Finance::Instrument::Futures->new( code => '6E',
                                                 name => 'EUR',
                                                 exchange => $exchange,
                                                 tick_size => 0.0001,
                                                 multiplier => 125000,
                                                 time_zone => 'America/Chicago',
                                                 month_cycle => 'HMUZ',
                                                 currency => 'USD',
                                                 session => [[-420, 960]],
                                                 last_day_close => 15,
                                                 contract_calendar => {
                                                     201112 => {
                                                         last_trading_day => '2011-12-19',
                                                     },
                                                     201203 => {
                                                         last_trading_day => '2012-03-19',
                                                     }
                                                 });

my $fc = Finance::Instrument::FuturesContract->new( futures => $futures,
                                                    expiry_month => 12,

t/02override.t  view on Meta::CPAN

                                                     '1970-01-01' => {
                                                         'session' => [[585, 750], [870, 975]],
                                                     },
                                                     '2011-03-07' => {
                                                         'session' => [[555, 720], [810, 975]],
                                                     },
                                                     '2012-03-05' => {
                                                         'session' => [[555, 720], [780, 975]],
                                                     },
                                                 },
                                                 contract_calendar => {
                                                     201112 => {
                                                         last_trading_day => '2011-12-29',
                                                     },
                                                     201201 => {
                                                         last_trading_day => '2012-01-30',
                                                     },
                                                     201202 => {
                                                         last_trading_day => '2012-02-28',
                                                     }
                                                 });

util/populate-cme-expiry.pl  view on Meta::CPAN

use Finance::Instrument;
my $c = Finance::Instrument->load_instrument_from_yml(shift) or die;;
my $path = $c->attr('cme_path') or exit;

my $Strp = DateTime::Format::Strptime->new(
    pattern     => '%m/%d/%Y' );

my $i = 0;
my $mcode_map = { map { $_ => ++$i } "FGHJKMNQUVXZ" =~ m/./g };

my $calendar = scraper {
    process "table.ProductTable tr" => "calendar[]" =>  scraper {
        process 'tr' => id => '@id',
        process 'span.LastLink' => 'dates[]' => 'TEXT',
    };
};
local $/;
my $uri = "http://www.cmegroup.com/trading/${path}_product_calendar_futures.html";
use URI;
my $file = shift;
my $res = $calendar->scrape( URI->new($file ? "file://$file" : $uri) )->{calendar};

for (@$res) {
    next unless $_->{id};
    $_->{id} =~ s/FUT$//g;
    my ($mcode, $myear) = $_->{id} =~ m/(\w)(\d+)$/;
    my @dates = map { $Strp->parse_datetime($_) } @{$_->{dates}};
    my ($year, $month) = ($myear + 2000, $mcode_map->{$mcode});
    my $expiry = sprintf('%04d%02d', $year, $month);
    if ($c->{contract_calendar}{$expiry}) {
        my $last = $c->{contract_calendar}{$expiry}{last_trading_day};
        if ($last ne $dates[1]->ymd) {
            warn "==> $expiry found, but last day is differnt: $last vs $dates[1]";
            next;
        }
    }
    warn "==> $expiry => ".$dates[1]->ymd;
    $c->{contract_calendar}{$expiry} = { first_trading_day => $dates[0]->ymd,
                                         last_trading_day => $dates[1]->ymd};
}

print Dump({ contract_calendar => $c->{contract_calendar} });



( run in 0.449 second using v1.01-cache-2.11-cpan-5dc5da66d9d )