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} });